Shapelets¶
Shapelets在[1]中被定义为“在某种意义上最能代表一个类的子序列”。非正式地说,如果我们假设一个二元分类设置,如果一个shapelet在一个类的大多数序列中存在而在另一个类的序列中不存在,那么它就是有判别力的。为了评估存在的程度,人们使用shapelet匹配:
其中 \(L\) 是 shapelet 的长度(时间戳的数量) \(\mathbf{s}\) 和 \(\mathbf{x}_{t\rightarrow t+L}\) 是从时间序列 \(\mathbf{x}\) 中提取的子序列,从时间索引 \(t\) 开始并在 \(t+L\) 结束。 如果上述定义的距离足够小,那么 shapelet \(\textbf{s}\) 被认为存在于时间序列 \(\mathbf{x}\) 中。
从时间序列到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)]\)。
下面用一个二维示例来说明这一点。
一个关于时间序列如何转换为线性可分距离的示例。¶
在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,我们的模型可能会遇到数值问题(例如梯度爆炸和梯度消失)。因此,规范化数据非常重要。这可以在将数据传递给
fit
和
transform
方法之前完成,通过使用我们的
tslearn.preprocessing
模块,但这也可以通过设置
scale
参数由算法本身内部完成。