前言
时间序列分类任务也是比较常见的任务,根据分类,来判断时间序列的性质,类别等。
其中rocket算法十分另类,看似用的非常简单且暴力的方式,却拿到了不错的效果,以及拥有非常快的推理和训练速度。
后续还有minirocket,在rocket的基础上进行简化,在基本上不损失精度的前提下,拥有更快的速度。
ROCKET(RandOm Convolutional KErnel Transform)
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 mtypefor list of mtypes, see datatypes.SCITYPE_REGISTERfor specifications, see examples/AA_datatypes_and_datasets.ipynby : 1D np.array of int, of shape [n_instances] - class labels for fittingindices correspond to instance indices in X
这块不赘述了,直接看代码详解很详细,不光是 rocket,只要是分类的方法,在sktime里的输入格式都是一样的
from sktime.classification.kernel_based import RocketClassifier
from sktime.datasets import load_unit_testX_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
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_testX_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)
推荐阅读:
我的2022届互联网校招分享
我的2021总结
浅谈算法岗和开发岗的区别
互联网校招研发薪资汇总
公众号:AI蜗牛车
保持谦逊、保持自律、保持进步
发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)
发送【1222】获取一份不错的leetcode刷题笔记
发送【AI四大名著】获取四本经典AI电子书