binder

ROCKET 变换演示#

概览#

ROCKET [1] 使用随机卷积核(随机长度、权重、偏置、膨胀和填充)变换时间序列。ROCKET 从结果特征图计算两个特征:最大值和正值的比例 (ppv)。变换后的特征用于训练线性分类器。

[1] Dempster A, Petitjean F, Webb GI (2019) ROCKET: Exceptionally fast and accurate time series classification using random convolutional kernels. arXiv:1910.13051


目录#

  1. 导入

  2. 单变量时间序列

  3. 多变量时间序列

  4. 流水线示例


1 导入#

导入示例数据、ROCKET 和一个分类器(来自 scikit-learn 的 RidgeClassifierCV),以及 NumPy 和来自 scikit-learn 的 make_pipeline

注意:ROCKET 在导入时会进行编译(通过 Numba),这可能需要几秒钟。

[1]:
# !pip install --upgrade numba
[2]:
import numpy as np
from sklearn.linear_model import RidgeClassifierCV
from sklearn.pipeline import make_pipeline

from sktime.datasets import (
    load_arrow_head,  # univariate dataset
    load_basic_motions,  # multivariate dataset
)
from sktime.transformations.panel.rocket import Rocket

2 单变量时间序列#

我们可以使用 ROCKET 转换数据并单独拟合分类器,或者将 ROCKET 与分类器一起在流水线中使用(见下文第 4 节)。

2.1 加载训练数据#

有关数据集的更多详细信息,请参阅单变量时间序列分类 notebook

[3]:
X_train, y_train = load_arrow_head(split="train", return_X_y=True)

2.2 初始化 ROCKET 并转换训练数据#

[4]:
rocket = Rocket()  # by default, ROCKET uses 10,000 kernels
rocket.fit(X_train)
X_train_transform = rocket.transform(X_train)

2.3 拟合分类器#

对于较小的数据集(少于约 2 万个训练样本),我们推荐使用来自 scikit-learn 的 RidgeClassifierCV;对于较大的数据集,推荐使用采用随机梯度下降训练的逻辑回归。

[5]:
classifier = RidgeClassifierCV(alphas=np.logspace(-3, 3, 10))
classifier.fit(X_train_transform, y_train)
[5]:
RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,
       4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,
       2.15443469e+02, 1.00000000e+03]),
                  normalize=True)

2.4 加载并转换测试数据#

[6]:
X_test, y_test = load_arrow_head(split="test", return_X_y=True)
X_test_transform = rocket.transform(X_test)

2.5 对测试数据进行分类#

[7]:
classifier.score(X_test_transform, y_test)
[7]:
0.8171428571428572

3 多变量时间序列#

我们可以以完全相同的方式将 ROCKET 用于多变量时间序列。

3.1 加载训练数据#

[8]:
X_train, y_train = load_basic_motions(split="train", return_X_y=True)

3.2 初始化 ROCKET 并转换训练数据#

[9]:
rocket = Rocket()
rocket.fit(X_train)
X_train_transform = rocket.transform(X_train)

3.3 拟合分类器#

[10]:
classifier = RidgeClassifierCV(alphas=np.logspace(-3, 3, 10))
classifier.fit(X_train_transform, y_train)
[10]:
RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,
       4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,
       2.15443469e+02, 1.00000000e+03]),
                  normalize=True)

3.4 加载并转换测试数据#

[11]:
X_test, y_test = load_basic_motions(split="test", return_X_y=True)
X_test_transform = rocket.transform(X_test)

3.5 对测试数据进行分类#

[12]:
classifier.score(X_test_transform, y_test)
[12]:
1.0

4 流水线示例#

我们可以将 ROCKET 与 RidgeClassifierCV(或其他分类器)一起在流水线中使用。然后,我们可以像使用独立的分类器一样使用该流水线,只需一次调用 fit,而无需单独转换数据等。

4.1 初始化流水线#

[13]:
rocket_pipeline = make_pipeline(
    Rocket(), RidgeClassifierCV(alphas=np.logspace(-3, 3, 10))
)

4.2 加载并拟合训练数据#

[14]:
X_train, y_train = load_arrow_head(split="train", return_X_y=True)

# it is necessary to pass y_train to the pipeline
# y_train is not used for the transform, but it is used by the classifier
rocket_pipeline.fit(X_train, y_train)
[14]:
Pipeline(steps=[('rocket', Rocket()),
                ('ridgeclassifiercv',
                 RidgeClassifierCV(alphas=array([1.00000000e-03, 4.64158883e-03, 2.15443469e-02, 1.00000000e-01,
       4.64158883e-01, 2.15443469e+00, 1.00000000e+01, 4.64158883e+01,
       2.15443469e+02, 1.00000000e+03]),
                                   normalize=True))])

4.3 加载并对测试数据进行分类#

[15]:
X_test, y_test = load_arrow_head(split="test", return_X_y=True)

rocket_pipeline.score(X_test, y_test)
[15]:
0.7942857142857143

使用 nbsphinx 生成。Jupyter notebook 可在此处找到