基于字典的时间序列分类在aeon中¶
基于字典的方法适应了常用于信号处理、计算机视觉和音频处理中的词袋模型,用于时间序列分类。与基于shapelet的算法类似,字典方法通过在时间序列上滑动窗口来使用相位无关的子序列。然而,与shapelets中测量序列和子序列之间的距离不同,每个窗口被转换为一个词,并测量重复模式的出现频率。 遵循字典模型的算法通过以下方式构建分类器:
从时间序列中提取子序列,也称为窗口:
将每个实数值窗口转换为离散值的单词(在固定字母表上的符号序列);
构建一个单词计数直方图的稀疏特征向量;最后
在这些特征向量上使用机器学习库中的分类方法。
该图展示了从原始时间序列到使用重叠窗口的字典模型的这些步骤。
基于字典的方法在第2步中将实值测量窗口转换为离散词(这一过程通常称为离散化)的方式有所不同。许多方法基于一种称为符号傅里叶近似(Symbolic Fourier Approximation,SFA)的表示方法。为了从一系列连续值窗口中创建离散词,SFA遵循以下步骤:
每个窗口中的值被归一化,使其标准差为1。
每个归一化窗口的维度通过使用截断傅里叶变换来减少:窗口子序列使用快速傅里叶变换进行转换,并且只保留前几个系数。
每个系数被离散化为一个固定大小的字母表中的一个符号,以形成一个单词。
从窗口创建单词需要三个参数:
‘window_size’ 指定每个窗口的长度;
‘length’ 指定了用于减少实值窗口长度的缩减序列长度;并且
‘alphabet_size’ 是离散化过程中使用的字母表中的字母数量。
这些核心参数通常在内部是固定的。目前,aeon中实现了四种基于字典的分类器,它们都利用符号傅里叶近似(SFA)[1]变换将数据离散化为单词。这些分类器包括SFA符号袋(BOSS)[2]、可收缩的SFA符号袋(cBOSS)[3]、时间序列分类的单词提取(WEASEL)[4]和时间字典集成(TDE)[5]。WEASEL有一个多变量扩展版本称为MUSE[8],而TDE具备多变量能力。我们在此笔记本中总结了它们的特性并给出了使用示例。更多技术细节可在[8]中找到。
导入和加载数据¶
aeon 目前有以下基于字典的分类器:
[1]:
import warnings
from sklearn import metrics
from aeon.classification.dictionary_based import (
MUSE,
WEASEL,
BOSSEnsemble,
ContractableBOSS,
IndividualBOSS,
TemporalDictionaryEnsemble,
)
from aeon.datasets import load_basic_motions, load_italy_power_demand
from aeon.utils.discovery import all_estimators
warnings.filterwarnings("ignore")
all_estimators("classifier", tag_filter={"algorithm_type": "dictionary"})
[1]:
| 名称 | 估计器 | |
|---|---|---|
| 0 | BOSSEnsemble | |
| 1 | ContractableBOSS | |
| 2 | MUSE | |
| 3 | OrdinalTDE | |
| 4 | 时间字典集成 | |
| 5 | WEASEL | |
| 6 | WEASEL_V2 |
[13]:
X_train, y_train = load_italy_power_demand(split="train")
X_test, y_test = load_italy_power_demand(split="test")
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")
X_test_mv, y_test_mv = load_basic_motions(split="test")
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)
[13]:
[('BOSSEnsemble', aeon.classification.dictionary_based._boss.BOSSEnsemble),
('ContractableBOSS',
aeon.classification.dictionary_based._cboss.ContractableBOSS),
('MUSE', aeon.classification.dictionary_based._muse.MUSE),
('TemporalDictionaryEnsemble',
aeon.classification.dictionary_based._tde.TemporalDictionaryEnsemble),
('WEASEL', aeon.classification.dictionary_based._weasel.WEASEL),
('WEASEL_V2', aeon.classification.dictionary_based._weasel_v2.WEASEL_V2)]
SFA符号包(BOSS):IndividualBOSS,BOSSEnsemble 和 cBOSS¶
BOSS 是一组使用 SFA 变换的单个 BOSS 分类器的集合。IndividualBOSS 具有参数 window_size(\(w\))默认值为 10,word_length(\(l\))默认值为 8,以及 alphabet_size(\(\alpha\))默认值为 4。使用 IndividualBOSS 分类器的算法通过改变其参数来多样化其成员的集合。
BOSSEnsemble 分类器是 IndividualBOSS 分类器的集合。它通过大量的 window_size(默认值为10)、word_length(默认值为8)和 alphabet_size(布尔值,表示是否对每个窗口进行归一化)参数组合进行网格搜索。在搜索的分类器中,只有那些准确率在最佳分类器的92%以内的分类器会被保留。单个 BOSS 分类器使用非对称距离函数,即 BOSS 距离,结合最近邻分类器。BOSS 内部会自动调整,因此需要更改的参数很少。通常应使用默认设置运行。
cBOSS通过改进集成形成方式,显著加快了BOSS的速度,而准确率没有显著差异。cBOSS随机选择一组参数\(w\)、\(l\)和\(\alpha\),并在集成中保留最佳的max_ensemble_size个IndividualBOSS分类器,其中最佳意味着在训练数据上的估计准确率最高。集成中保留的IndividualBOSS分类器的数量和随机生成的参数测试数量是参数max_ensemble_size(默认50)和n_parameter_samples(默认250)。n_parameter_samples参数可以用最大运行时间限制参数time_limit_in_minutes替换。设置此参数将使分类器在指定的时间内随机采样参数。我们称这种能力为合同。
[14]:
one_boss = IndividualBOSS(window_size=8, word_length=4, alphabet_size=6)
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)))
cboss = ContractableBOSS(n_parameter_samples=250, 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)))
时间序列分类的单词提取(WEASEL)¶
WEASEL 使用滑动窗口方法将时间序列转换为特征向量,然后通过机器学习分类器进行分析。WEASEL 的创新之处在于其特定的特征提取方法,从而生成比 BOSS 更小但更具区分性的特征集。它通过双字母组合、使用 Anova-f 检验和信息增益分箱(IGB)进行特征选择来扩展 SFA。
[15]:
weasel = WEASEL(binning_strategy="equi-depth", anova=False, random_state=47)
weasel.fit(X_train, y_train)
weasel_preds = weasel.predict(X_test)
print(
f"Univariate WEASEL Accuracy on ItalyPowerDemand: "
f"{metrics.accuracy_score(y_test, weasel_preds)}"
)
muse = MUSE()
muse.fit(X_train_mv, y_train_mv)
muse_preds = muse.predict(X_test_mv)
print(
f"Multivariate MUSE Accuracy on BasicMotions: "
f"{metrics.accuracy_score(y_test_mv, muse_preds)}"
)
时间字典集成 (TDE)¶
TemporalDictionaryEnsemble (TDE) 结合了cBOSS和WEASEL的最佳组件,并采用了计算机视觉中使用的空间金字塔概念,这一概念最初是在名为Spatial BOSS [6]的算法中应用于此背景的。空间金字塔将时间序列分割成连续的片段,并构建字典

在金字塔的顶层,使用整个系列。cBOSS分类器建立在使用WEASEL提出的二元组和信息增益分箱(IGB)的整个系列上。在下一层,cBOSS分类器分别在系列的每一半上独立构建。在第三层,使用系列的四分之一。一旦到达最后一层,所有的直方图都会被连接起来。
由于额外的参数,TDE模型的搜索参数空间要大得多。与随机搜索参数组合不同,在randomly_selected_params模型评估之后,使用高斯过程回归器选择新的参数集来评估集成,利用过去的分类器性能预测一组参数值的准确性。这提高了整体性能。与cBOSS一样,TDE是可收缩的,即您可以使用time_limit_in_minutes参数指定近似的最长训练时间。
[16]:
# Recommended non-contract TDE parameters
tde = TemporalDictionaryEnsemble(
n_parameter_samples=250,
max_ensemble_size=50,
randomly_selected_params=50,
random_state=47,
)
# If you wish to set a time contract to, for example, 5 minutes,
# set time_limit_in_minutes = 5 in the constructor
# Univariate
tde.fit(X_train, y_train)
tde_preds = tde.predict(X_test)
print(
"TDE Accuracy on ItalyPowerDemand: "
+ str(metrics.accuracy_score(y_test, tde_preds))
)
tde.fit(X_train_mv, y_train_mv)
tde_preds = tde.predict(X_test_mv)
print(
f"TDE Accuracy on BasicMotions: " f"{metrics.accuracy_score(y_test_mv, tde_preds)}"
)
UCR单变量数据集上的性能¶
您可以按如下方式找到基于字典的分类器。
[1]:
from aeon.utils.discovery import all_estimators
est = all_estimators("classifier", tag_filter={"algorithm_type": "dictionary"})
for c in est:
print(c)
('BOSSEnsemble', <class 'aeon.classification.dictionary_based._boss.BOSSEnsemble'>)
('ContractableBOSS', <class 'aeon.classification.dictionary_based._cboss.ContractableBOSS'>)
('MUSE', <class 'aeon.classification.dictionary_based._muse.MUSE'>)
('OrdinalTDE', <class 'aeon.classification.ordinal_classification._ordinal_tde.OrdinalTDE'>)
('REDCOMETS', <class 'aeon.classification.dictionary_based._redcomets.REDCOMETS'>)
('TemporalDictionaryEnsemble', <class 'aeon.classification.dictionary_based._tde.TemporalDictionaryEnsemble'>)
('WEASEL', <class 'aeon.classification.dictionary_based._weasel.WEASEL'>)
('WEASEL_V2', <class 'aeon.classification.dictionary_based._weasel_v2.WEASEL_V2'>)
[2]:
from aeon.benchmarking.results_loaders import get_estimator_results_as_array
from aeon.datasets.tsc_datasets import univariate
names = [t[0] for t in est]
names.remove("MUSE") # Multivariate classifier
names.remove("OrdinalTDE") # Ordinal classifier
names.remove("REDCOMETS") # We still need to evaluate this classifier
names.remove("MrSEQLClassifier") # We still need to evaluate this classifier
results, present_names = get_estimator_results_as_array(
names, univariate, include_missing=False
)
results.shape
[2]:
(112, 5)
[3]:
from aeon.visualisation import plot_boxplot, plot_critical_difference
plot_critical_difference(results, names)
[3]:
(<Figure size 600x240 with 1 Axes>, <Axes: >)
[4]:
plot_boxplot(results, names, relative=True)
[4]:
(<Figure size 1000x600 with 1 Axes>, <Axes: >)
参考文献:¶
[1] Schäfer, P., & Högqvist, M. (2012). SFA: 一种用于高维数据集中相似性搜索的符号傅里叶近似和索引。在第十五届国际数据库技术扩展会议论文集(第516-527页)中。
[2] Schäfer, P. (2015). BOSS关注的是在存在噪声的情况下进行时间序列分类。数据挖掘与知识发现, 29(6), 1505-1530.
[3] Middlehurst, M., Vickers, W., & Bagnall, A. (2019). 可扩展的字典分类器用于时间序列分类。在国际智能数据工程与自动化学习会议上(第11-19页)。Springer, Cham.
[4] Schäfer, P., & Leser, U. (2017). 使用WEASEL进行快速准确的时间序列分类。在2017年ACM信息与知识管理会议论文集(第637-646页)中。
[5] Middlehurst, M., Large, J., Cawley, G., & Bagnall, A. (2020). 时间序列分类的时间字典集成(TDE)分类器。在欧洲机器学习和知识发现数据库原理与实践会议上。
[6] Large, J., Bagnall, A., Malinowski, S., & Tavenard, R. (2019). 关于基于字典的分类器在时间序列分类中的应用。智能数据分析, 23(5), 1073-1089.
[7] Schäfer, P., & Leser, U. (2018). 使用WEASEL+MUSE进行多变量时间序列分类。第三届ECML/PKDD AALTD研讨会。
[8] Middlehurst, M., Schäfer, P., & Bagnall, A. (2023). 重新审视烘焙大赛:近期时间序列分类算法的回顾与实验评估。 [ArXive] (https://arxiv.org/abs/2304.13029)
[ ]: