binder

sktime 中基于字典的时间序列分类#

基于字典的方法改编了信号处理、计算机视觉和音频处理中常用的词袋模型,用于时间序列分类。基于字典的分类器具有相似的通用结构。长度为 \(w\) 的滑动窗口遍历时间序列。对于每个窗口,长度为 \(w\) 的实数值序列通过近似和离散化过程转换为长度为 \(l\) 的符号字符串,该字符串包含 \(\alpha\) 种可能的字母。计数序列中由 \(l\)\(\alpha\) 定义的字典中每个“单词”的出现次数,一旦滑动窗口完成,序列被转换为直方图。分类基于从序列中提取的单词的直方图,而不是原始数据。

目前 sktime 中实现了 4 种单变量基于字典的分类器,它们都利用符号傅里叶近似(SFA)[1] 变换进行单词离散化。这些分类器是 SFA 符号袋(BOSS)[2]、可收缩 SFA 符号袋(cBOSS)[3]、用于时间序列分类的单词提取(WEASEL)[4] 和时间字典集成(TDE)[5]。WEASEL 有一个称为 MUSE [7] 的多变量扩展,TDE 也具有多变量能力。

在本 notebook 中,我们将演示如何在 ItalyPowerDemand 和 BasicMotions 数据集上使用 BOSS、cBOSS、WEASEL 和 TDE。

参考文献:#

[1] Schäfer, P., & Högqvist, M. (2012). SFA: a symbolic fourier approximation and index for similarity search in high dimensional datasets. In Proceedings of the 15th International Conference on Extending Database Technology (pp. 516-527).

[2] Schäfer, P. (2015). The BOSS is concerned with time series classification in the presence of noise. Data Mining and Knowledge Discovery, 29(6), 1505-1530.

[3] Middlehurst, M., Vickers, W., & Bagnall, A. (2019). Scalable dictionary classifiers for time series classification. In International Conference on Intelligent Data Engineering and Automated Learning (pp. 11-19). Springer, Cham.

[4] Schäfer, P., & Leser, U. (2017). Fast and accurate time series classification with WEASEL. In Proceedings of the 2017 ACM on Conference on Information and Knowledge Management (pp. 637-646).

[5] Middlehurst, M., Large, J., Cawley, G., & Bagnall, A. (2020). The Temporal Dictionary Ensemble (TDE) Classifier for Time Series Classification. In The European Conference on Machine Learning and Principles and Practice of Knowledge Discovery in Databases.

[6] Large, J., Bagnall, A., Malinowski, S., & Tavenard, R. (2019). On time series classification with dictionary-based classifiers. Intelligent Data Analysis, 23(5), 1073-1089.

[7] Schäfer, P., & Leser, U. (2018). Multivariate time series classification with WEASEL+MUSE. 3rd ECML/PKDD Workshop on AALTD.

1. 导入#

[1]:
from sklearn import metrics

from sktime.classification.dictionary_based import (
    MUSE,
    WEASEL,
    BOSSEnsemble,
    ContractableBOSS,
    TemporalDictionaryEnsemble,
)
from sktime.datasets import load_basic_motions, load_italy_power_demand

2. 加载数据#

[2]:
X_train, y_train = load_italy_power_demand(split="train", return_X_y=True)
X_test, y_test = load_italy_power_demand(split="test", return_X_y=True)
X_test = X_test[:50]
y_test = y_test[:50]

print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)

X_train_mv, y_train_mv = load_basic_motions(split="train", return_X_y=True)
X_test_mv, y_test_mv = load_basic_motions(split="test", return_X_y=True)

X_train_mv = X_train_mv[:20]
y_train_mv = y_train_mv[:20]
X_test_mv = X_test_mv[:20]
y_test_mv = y_test_mv[:20]

print(X_train_mv.shape, y_train_mv.shape, X_test_mv.shape, y_test_mv.shape)
(67, 1) (67,) (50, 1) (50,)
(20, 6) (20,) (20, 6) (20,)

3. SFA 符号袋 (BOSS)#

BOSS 是使用 SFA 变换的独立 BOSS 分类器的集成。该分类器通过对大量独立分类器进行参数 \(l\)\(\alpha\)\(w\)\(p\)(对每个窗口进行归一化)进行网格搜索。在搜索到的分类器中,只有那些准确率达到最佳分类器 92% 的分类器才会被保留。独立的 BOSS 分类器使用非对称距离函数 BOSS 距离,并结合最近邻分类器。

由于调优是在分类器内部处理的,BOSS 只有很少的参数需要修改,通常应该使用默认设置运行。

[3]:
boss = BOSSEnsemble(random_state=47)
boss.fit(X_train, y_train)

boss_preds = boss.predict(X_test)
print("BOSS Accuracy: " + str(metrics.accuracy_score(y_test, boss_preds)))
BOSS Accuracy: 0.94

4. 可收缩 BOSS (cBOSS)#

cBOSS 通过改进集成形成方式,显著提高了 BOSS 的速度,而准确率没有显著差异。cBOSS 利用过滤后的随机参数选择来寻找其集成成员。每个集成成员都基于训练数据的 70% 子样本构建,使用不放回随机抽样。引入了对基础分类器预测结果的指数加权方案。

引入了一个新的参数 \(k\) 表示参数样本的数量。其中,选择准确率最高的前 \(s\)(最大集成大小)用于最终集成。\(k\) 参数可以通过收缩替换为时间限制 \(t\)

[4]:
# Recommended non-contract cBOSS parameters
cboss = ContractableBOSS(n_parameter_samples=250, max_ensemble_size=50, random_state=47)

# cBOSS with a 1 minute build time contract
# cboss = ContractableBOSS(time_limit_in_minutes=1,
#                         max_ensemble_size=50,
#                         random_state=47)

cboss.fit(X_train, y_train)

cboss_preds = cboss.predict(X_test)
print("cBOSS Accuracy: " + str(metrics.accuracy_score(y_test, cboss_preds)))
cBOSS Accuracy: 0.96

5. 用于时间序列分类的单词提取 (WEASEL)#

WEASEL 使用滑动窗口方法将时间序列转换为特征向量,然后通过机器学习分类器进行分析。WEASEL 的创新之处在于其独特的特征派生方法,与 BOSS 相比,特征集小得多但判别力强得多。它通过二元词、使用 Anova-f-test 的特征选择以及信息增益分箱 (IGB) 扩展了 SFA。

单变量#

[5]:
weasel = WEASEL(binning_strategy="equi-depth", anova=False, random_state=47)
weasel.fit(X_train, y_train)

weasel_preds = weasel.predict(X_test)
print("WEASEL Accuracy: " + str(metrics.accuracy_score(y_test, weasel_preds)))
WEASEL Accuracy: 0.96

多变量#

WEASEL+MUSE(多变量符号扩展)是 WEASEL 的多变量扩展。

[6]:
muse = MUSE()
muse.fit(X_train_mv, y_train_mv)

muse_preds = muse.predict(X_test_mv)
print("MUSE Accuracy: " + str(metrics.accuracy_score(y_test_mv, muse_preds)))
MUSE Accuracy: 1.0

6. 时间字典集成 (TDE)#

TDE 汇集了从原始 BOSS 算法扩展而来的 3 个分类器的最佳组件。它使用了 cBOSS [3] 的集成结构和改进;从空间 BOSS (S-BOSS) [6] 引入了空间金字塔;从时间序列分类的单词提取 (WEASEL) [4] 中包含了二元词和信息增益分箱 (IGB),IGB 替代了 SFA 使用的多系数分箱 (MCB)。集成参数搜索中包含两个新参数:空间金字塔层数 \(h\) 以及是使用 IGB 还是 MCB \(b\)。使用高斯过程回归器选择要评估的新参数集,并使用过去的分类器性能预测一组参数值的准确率。

继承了 cBOSS 的集成结构,参数样本数量 \(k\)、时间限制 \(t\) 和最大集成大小 \(s\) 仍是根据内存和时间要求设置的参数。

单变量#

[7]:
# Recommended non-contract TDE parameters
tde_u = TemporalDictionaryEnsemble(
    n_parameter_samples=50,
    max_ensemble_size=50,
    randomly_selected_params=50,
    random_state=47,
)

# TDE with a 1 minute build time contract
# tde = TemporalDictionaryEnsemble(time_limit_in_minutes=1,
#                                 max_ensemble_size=50,
#                                 randomly_selected_params=50,
#                                 random_state=47)

tde_u.fit(X_train, y_train)

tde_u_preds = tde_u.predict(X_test)
print("TDE Accuracy: " + str(metrics.accuracy_score(y_test, tde_u_preds)))
TDE Accuracy: 1.0

多变量#

[8]:
# Recommended non-contract TDE parameters
tde_mv = TemporalDictionaryEnsemble(
    n_parameter_samples=50,
    max_ensemble_size=50,
    randomly_selected_params=50,
    random_state=47,
)

# TDE with a 1 minute build time contract
# tde_m = TemporalDictionaryEnsemble(time_limit_in_minutes=1,
#                                 max_ensemble_size=50,
#                                 randomly_selected_params=50,
#                                 random_state=47)

tde_mv.fit(X_train_mv, y_train_mv)

tde_mv_preds = tde_mv.predict(X_test_mv)
print("TDE Accuracy: " + str(metrics.accuracy_score(y_test_mv, tde_mv_preds)))
TDE Accuracy: 1.0

使用 nbsphinx 生成。Jupyter notebook 可以在这里找到。