‘时间序列增强’

‘时间序列增强’美容时尚术

简单而又有效的增加时间序列数据量的方法

本博客文章可在GitHub上的jupyter笔记本中查看。

在计算机视觉流水线的领域中,数据扩增已成为不可或缺的组成部分。然而,在其他领域(如时间序列)中,数据扩增的受欢迎程度并没有达到同样的高度。在本教程中,我将深入研究时间序列数据扩增的世界,揭示其重要性,并提供使用强大的生成时间序列建模库TSGM [5] 的具体应用示例。

我们的起点是一个被标记为(𝐗,𝐲)的数据集。在这里,𝐱ᵢ ∈ 𝐗 是多变量的(也就是说,每个时间点是多维特征向量)的时间序列,𝐲是标签。预测标签 𝐲 被称为下游任务。我们的目标是利用(𝐗,𝐲)生成额外的样本(𝐗*,𝐲*),这样可以更有效地解决下游任务(从预测性能或鲁棒性方面考虑)。为简单起见,在本教程中我们不使用标签,但我们在这里描述的方法很容易推广到带有标签的情况,所使用的软件实现可以通过向.generate方法中添加额外的参数来轻松扩展到监督学习的情况(见下面的示例)。

废话不多,我们逐一考虑时间序列数据扩增。在TSGM中,所有扩增都整齐地组织在tsgm.models.augmentations中,您可以查看详细的文档,文档可在 TSGM 文档中找到。现在,让我们通过安装tsgm来启动编码示例:

pip install tsgm

继续前进,我们导入tsgm,并加载一个样本数据集。张量X现在包含100条长度为64的正弦时间序列,每个时间序列有2个特征。这些时间序列具有随机的移位,频率和振幅(最大振幅为20)。

# 导入库
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import random
from tensorflow import keras
import tsgm

# 现在生成数据集
X = tsgm.utils.gen_sine_dataset(100, 64, 2, max_value=20)

抖动/高斯噪声

首先,作为第一种扩增,我们考虑抖动。

时间序列数据通过随机高斯噪声来扩增(参考维基百科

在tsgm中,可以如下应用高斯噪声扩增:

aug_model = tsgm.models.augmentations.GaussianNoise()
samples = aug_model.generate(X=X, n_samples=10, variance=0.2)

高斯噪声扩增的思想是向时间序列添加一小部分抖动可能不会明显改变它,但会增加数据集中这种噪声样本的数量。这通常使得下游模型对噪声样本更具鲁棒性或提高预测性能。高斯噪声的超参数和添加噪声的方式(例如,高斯噪声可以向时间序列结束处逐渐增加)是一个困难的问题,这取决于具体的数据集和下游问题。通常值得尝试并观察这些参数如何影响目标模型的性能。下面,我们提供了原始正弦数据集和扩增样本的可视化。

Original time series and synthetic data generated via Jittering.

特征洗牌

时间序列扩增的另一种方法是简单地对特征进行洗牌。这种方法仅适用于某些多变量时间序列,其中它们对于所有或特定特征的排列不变。例如,它可以应用于每个特征表示来自各种传感器的相同独立测量的时间序列。

为了解释这种方法,让我们以五个相同的传感器为例,标记为S_1,S_2,S_3,S_4和S_5。为了说明问题,假设传感器1-4在旋转方面可能是可交换的。那么尝试通过相对于S_1,…,S_5传感器的旋转进行数据增强是有意义的。

在这个例子中,有五个传感器,并且这些传感器产生五维时间序列数据的测量结果。传感器1到4可以任意旋转生成新的合成样本(例如,1->2、2->3、3->4、4->1)。因此,通过对原始数据应用此类变换,可以生成新的合成样本。

与前面的例子类似,增强的过程可以如下进行:

aug_model = tsgm.models.augmentations.Shuffle()samples = aug_model.generate(X=X, n_samples=3)

在这里,我们展示了一个具有5个特征的时间序列样本和一个增强样本,类似于上面的图像。

原始时间序列和通过交换特征生成的合成数据。

切片和洗牌

切片和洗牌增强[3]将时间序列划分为切片,并对这些切片进行洗牌。这种增强可以用于表现出一定时间不变性的时间序列。例如,想象一下从可穿戴设备上测量的几天的时间序列。在这种情况下,好的策略是按天切分时间序列,并通过洗牌这些天数来获得额外的样本。如下图所示是切片和洗牌增强的示意图:

切片和洗牌的示意图可视化。
aug_model = tsgm.models.augmentations.SliceAndShuffle()samples = aug_model.generate(X=X, n_samples=10, n_segments=3)

让我们来看增强和原始样本:

原始时间序列和通过切片和洗牌生成的合成数据。

幅度变形

幅度变形[3]通过将原始时间序列与三次样条曲线相乘来改变时间序列数据集中每个样本的幅度。这个过程可以缩放时间序列的幅度,在很多情况下都是有益的,例如我们的合成示例中的正弦曲线,其中有随机振幅分布的n个结点,符合N(1, σ^2),其中σ由函数.generate中的参数sigma设置。

aug_model = tsgm.models.augmentations.MagnitudeWarping()samples = aug_model.generate(X=X, n_samples=10, sigma=1)

这里是原始数据和通过MagnitudeWarping生成的增强样本的一个例子。

由幅度变形生成的原始时间序列和合成数据。

窗口变形

在这种技术[4]中,时间序列数据中的选定窗口要么加速要么减速。然后,整个生成的时间序列被缩放回原始大小,以保持时间步长与原始长度相同。以下是此类增强的示例:

此类增强对于建模设备等方面是有益的。在这类应用中,传感器测量可以根据设备的使用情况改变变化的速度。

在tsgm中,一如既往地,生成可以通过以下方法完成

aug_model = tsgm.models.augmentations.WindowWarping()samples = aug_model.generate(X=X, n_samples=10, scales=(0.5,), window_ratio=0.5)

下面是一个生成时间序列的示例。

通过窗口变形生成的原始时间序列和合成数据。

动态时间弯曲重心均值(DTWBA)

动态时间弯曲重心均值(DTWBA)是一种基于动态时间弯曲(DTW)的增强方法。DTW是一种衡量时间序列相似性的方法。其思想是使这些时间序列“同步”,如下图所示。

对两个时间序列信号 $\\sin(x)$ 和 $\\sin(2x)$ 进行DTW测量。DTW测量用白线表示。还可视化了交叉相似度矩阵。

有关DTW计算的更多细节,请参阅https://rtavenar.github.io/blog/dtw.html

DTWBA的步骤如下:1. 算法选择一个时间序列来初始化DTWBA结果。这个时间序列可以明确给出,也可以从数据集中随机选择。2. 对于每个N个时间序列,算法计算DTW距离和路径(路径是最小化距离的映射)。3. 在计算所有N个DTW距离之后,算法通过对上述找到的所有路径进行平均来更新DTWBA结果。4. 算法重复步骤2和3直到DTWBA结果收敛。

可以在tslearn中找到参考实现,并在[2]中找到描述。

在tsgm中,可以按以下方式生成样本:

aug_model = tsgm.models.augmentations.DTWBarycentricAveraging()initial_timeseries = random.sample(range(X.shape[0]), 10)initial_timeseries = X[initial_timeseries]samples = aug_model.generate(X=X, n_samples=10, initial_timeseries=initial_timeseries )
通过DTWBA生成的原始时间序列和合成数据。

利用生成式机器学习模型增强

另一种增强方法是使用历史数据训练机器学习模型,并训练其生成新的合成样本。它是一种黑盒方法,因为很难解释如何生成新的样本。在时间序列的情况下,可以应用几种方法,包括VAE、GAN和高斯过程。使用VAE生成合成时间序列的示例代码如下:

n, n_ts, n_features = 1000, 24, 5
data = tsgm.utils.gen_sine_dataset(n, n_ts, n_features)
scaler = tsgm.utils.TSFeatureWiseScaler()
scaled_data = scaler.fit_transform(data)

architecture = tsgm.models.zoo["vae_conv5"](n_ts, n_features, 10)
encoder, decoder = architecture.encoder, architecture.decoder
vae = tsgm.models.cvae.BetaVAE(encoder, decoder)
vae.compile(optimizer=keras.optimizers.Adam())
vae.fit(scaled_data, epochs=1, batch_size=64)
samples = vae.generate(10)

结论

我们探讨了几种用于生成合成时间序列的方法。其中许多方法在实际应用中引入了归纳偏见,非常有用。

如何选择呢?首先,分析您的问题是否存在不变性。它是否对随机噪声不变?它是否对特征重排不变?

然后,选择一组广泛的方法,并验证是否有选定方法可以改善您下游问题的性能(tsgm有下游性能指标)。然后,选择提供最大性能提升的增强方法集。

最后,我要感谢Letizia Iannucci和Georgy Gritsenko对写作本篇文章提供的帮助和有益的讨论。除非另有说明,所有图片均由作者提供。

本博客文章是TSGM项目的一部分,我们正在通过增强和合成数据生成工具来增强时间序列管道。如果您发现有用,请查看我们的repo并考虑引用有关TSGM的论文

@article{nikitin2023tsgm,
  title={TSGM: A Flexible Framework for Generative Modeling of Synthetic Time Series},
  author={Nikitin, Alexander and Iannucci, Letizia and Kaski, Samuel},
  journal={arXiv preprint arXiv:2305.11567},
  year={2023}
}

参考文献

[1] H. Sakoe和S. Chiba,“Dynamic programming algorithm optimization for spoken word recognition”. IEEE Transactions on Acoustics, Speech, and Signal Processing, 26(1), 43–49 (1978).

[2] F. Petitjean, A. Ketterlin & P. Gancarski. A global averaging method for dynamic time warping, with applications to clustering. Pattern Recognition, Elsevier, 2011, Vol. 44, Num. 3, pp. 678–693

[3] Um TT, Pfister FM, Pichler D, Endo S, Lang M, Hirche S,Fietzek U, Kulic´ D (2017) Data augmentation of wearable sensor data for parkinson’s disease monitoring using convolutional neural networks. In: Proceedings of the 19th ACM international conference on multimodal interaction, pp. 216–220

[4] Rashid, K.M. and Louis, J., 2019. Window-warping: a time series data augmentation of IMU data for construction equipment activity identification. In ISARC. Proceedings of the international symposium on automation and robotics in construction (Vol. 36, pp. 651–657). IAARC Publications.

[5] Nikitin, A., Iannucci, L. and Kaski, S., 2023. TSGM: A Flexible Framework for Generative Modeling of Synthetic Time Series. arXiv preprint arXiv:2305.11567. Arxiv link.