赞
踩
时间序列分类任务也是比较常见的任务,根据分类,来判断时间序列的性质,类别等。
其中rocket算法十分另类,看似用的非常简单且暴力的方式,却拿到了不错的效果,以及拥有非常快的推理和训练速度。
后续还有minirocket,在rocket的基础上进行简化,在基本上不损失精度的前提下,拥有更快的速度。
ROCKET: Exceptionally fast and accurate time series classification using random convolutional kernels
论文:https://arxiv.org/abs/1910.13051 github:https://github.com/angus924/rocket
ROCKET算法的优点在于其简单性和效率。梳理一下训练和预测过程:
随机生成卷积核: 生成大量卷积核(例如10,000个)。且这些卷积核都是不同的,拥有随机的长度、扩张和填充,以及随机的权重和偏差,这意味着它们不是从数据中学习得到的,而是预先设定的。
对时间序列进行卷积: 使用生成的卷积核对每个时间序列进行卷积运算。提取时间序列数据中各种模式和特征。
从卷积结果中提取特征: 对于每个卷积核得到的卷积结果,ROCKET计算两个简单的统计量:最大值(类似于maxpooling)和正数值的比例(ppv:proportion of positive values)。使得分类器能够衡量给定模式在时间序列中的流行程度。所以如果对于一条时间序列来说,会产生卷积核数量✖️2的特征树
训练线性分类器: 利用提取的特征来训练一个线性分类器(线性的都可以)。ROCKET通过将时间序列转换为特征向量,使得分类器可以应用于标准的机器学习任务。
进行预测: 使用训练好的分类器对新的时间序列数据进行分类预测。
具体源码可以看
https://github.com/angus924/rocket/blob/master/code/rocket_functions.py
这块就是卷积提取特征的过程
具体使用:
- if __name__ == '__main__':
- x = np.random.uniform(0, 1, 30)
- x = x.reshape((1, len(x)))
- kernels = generate_kernels(30, 20)
- y = apply_kernels(x, kernels)
- print(y.shape)
结果
或者直接用sktime去学习怎么用,现在官方也在引导大家用sktime去用rocket,sktime里把rocket的几种变体融合在一起了
sktime:https://www.sktime.net/en/stable/
rocket api:https://www.sktime.net/en/stable/api_reference/auto_generated/sktime.classification.kernel_based.RocketClassifier.html
输入 可以是怎么多格式
- Parameters
- ----------
- X : 3D np.array (any number of dimensions, equal length series)
- of shape [n_instances, n_dimensions, series_length]
- or 2D np.array (univariate, equal length series)
- of shape [n_instances, series_length]
- or pd.DataFrame with each column a dimension, each cell a pd.Series
- (any number of dimensions, equal or unequal length series)
- or of any other supported Panel mtype
- for list of mtypes, see datatypes.SCITYPE_REGISTER
- for specifications, see examples/AA_datatypes_and_datasets.ipynb
- y : 1D np.array of int, of shape [n_instances] - class labels for fitting
- indices correspond to instance indices in X
这块不赘述了,直接看代码详解很详细,不光是 rocket,只要是分类的方法,在sktime里的输入格式都是一样的
- from sktime.classification.kernel_based import RocketClassifier
- from sktime.datasets import load_unit_test
-
- X_train, y_train = load_unit_test(split="train", return_X_y=True)
- print(X_train.shape, y_train.shape)
- X_test, y_test = load_unit_test(split="test", return_X_y=True)
- clf = RocketClassifier(num_kernels=500)
-
- clf.fit(X_train, y_train)
- y_pred = clf.predict(X_test)
- print(y_pred)
结果
- (20, 1) (20,)
-
- ['1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '1' '2' '2' '1' '2' '2' '1'
- '2' '2' '2' '1']
MINIROCKET: A Very Fast (Almost) Deterministic Transform for Time Series Classification
论文:https://arxiv.org/abs/2012.08791 github:https://github.com/angus924/minirocket
MiniRocket ROCKET方法的一种更快、更小型的变体,它提供几乎相同的性能,同时极大地减少了计算的时间和资源消耗,在更大的数据集上比 Rocket 快 75 倍,同时保持基本相同的准确性。
核心思想是简化ROCKET的随机卷积核特征提取过程。主要是两个过程优化了,其他基本一致。
卷积核确定化
特征只用了ppv
论文一张图全部直接概括了。
- from sktime.classification.kernel_based import RocketClassifier
- from sktime.datasets import load_unit_test
-
- X_train, y_train = load_unit_test(split="train", return_X_y=True)
- print(X_train.shape, y_train.shape)
- X_test, y_test = load_unit_test(split="test", return_X_y=True)
- clf = RocketClassifier(num_kernels=500, rocket_transform="minirocket")
-
- clf.fit(X_train, y_train)
- y_pred = clf.predict(X_test)
- print(y_pred)
推荐阅读:
公众号:AI蜗牛车
保持谦逊、保持自律、保持进步
发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)
发送【1222】获取一份不错的leetcode刷题笔记
发送【AI四大名著】获取四本经典AI电子书
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。