Shapelets

Shapelets在[1]中被定义为“在某种意义上最能代表一个类的子序列”。非正式地说,如果我们假设一个二元分类设置,如果一个shapelet在一个类的大多数序列中存在而在另一个类的序列中不存在,那么它就是有判别力的。为了评估存在的程度,人们使用shapelet匹配:

\[d(\mathbf{x}, \mathbf{s}) = \min_t \| \mathbf{x}_{t\rightarrow t+L} - \mathbf{s} \|_2\]

其中 \(L\) 是 shapelet 的长度(时间戳的数量) \(\mathbf{s}\)\(\mathbf{x}_{t\rightarrow t+L}\) 是从时间序列 \(\mathbf{x}\) 中提取的子序列,从时间索引 \(t\) 开始并在 \(t+L\) 结束。 如果上述定义的距离足够小,那么 shapelet \(\textbf{s}\) 被认为存在于时间序列 \(\mathbf{x}\) 中。

../_images/sphx_glr_plot_shapelet_locations_001.svg

从时间序列到shapelet的距离是通过在较长的时间序列上滑动较短的shapelet并计算点对点的距离来完成的。返回找到的最小距离。

在分类设置中,目标是在给定一些标记的时间序列数据的情况下找到最具判别性的shapelets。 Shapelets可以从训练集中挖掘[1]或使用梯度下降法学习。

学习时间序列形状

tslearn 提供了“学习时间序列形状”的实现, 这是在 [2] 中引入的,属于后一类的一个实例。 在学习形状中, 形状被学习为 使得在其形状变换空间中表示的时间序列(它们 到每个形状的距离)是线性可分的。 给定一组形状 \(\{\mathbf{s}_i\}_{i \leq k}\) 的时间序列 \(\mathbf{x}\) 的形状变换表示是特征向量: \([d(\mathbf{x}, \mathbf{s}_1), \cdots, d(\mathbf{x}, \mathbf{s}_k)]\)。 下面用一个二维示例来说明这一点。

../_images/sphx_glr_plot_shapelet_distances_001.svg

一个关于时间序列如何转换为线性可分距离的示例。

tslearn中,为了学习shapelets并将时间序列转换到其对应的shapelet-transform空间,可以使用以下代码:

from tslearn.shapelets import LearningShapelets

model = LearningShapelets(n_shapelets_per_size={3: 2})
model.fit(X_train, y_train)
train_distances = model.transform(X_train)
test_distances = model.transform(X_test)
shapelets = model.shapelets_as_time_series_

一个tslearn.shapelets.LearningShapelets模型有几个超参数,例如最大迭代次数和批量大小。一个重要的超参数是n_shapelets_per_size,它是一个字典,其中键对应于所需的shapelets长度,值对应于每个长度所需的shapelets数量。当设置为None时,此字典将由启发式确定。创建模型后,我们可以使用训练数据fit最优的shapelets。在拟合阶段之后,可以使用transform函数计算距离。此外,您可以通过使用shapelets_as_time_series_属性轻松访问学习到的shapelets。

需要注意的是,由于使用基于梯度下降的技术来学习shapelets,我们的模型可能会遇到数值问题(例如梯度爆炸和梯度消失)。因此,规范化数据非常重要。这可以在将数据传递给 fittransform 方法之前完成,通过使用我们的 tslearn.preprocessing 模块,但这也可以通过设置 scale 参数由算法本身内部完成。

涉及基于Shapelet的估计器的示例

学习形状片段

Learning Shapelets

将发现的shapelets与时间序列对齐

Aligning discovered shapelets with timeseries

学习形状:二维距离空间中的决策边界

Learning Shapelets: decision boundaries in 2D distance space

参考文献