多元时间序列聚类

数据挖掘 机器学习 Python 聚类 时间序列
2021-09-19 15:52:24

我有一个流数据和时间戳数据集,如下所示: 样本数据看起来相似1.png

时间戳也可以包含“秒”,但数据可能每秒都在变化,也可能不会变化。它取决于先前的值(行,即较早出现的数据)。

Column1, Column2 .... ColumnN对应于变量(它们随时间变化),“标签”显示不同的样本。您可以假设特定标签的值会随着时间的推移而减小

标签 A1,B1,C1.........A2,... M 个标签。

注意:标签的 timeNew 值取决于该标签的 timeOld 值,并且标签属于其集群。

我需要将随着时间推移具有相似行为的标签组合在一起(例如,标签 A1 和标签 C1 应该放在同一个集群中,而 B1、D2 可能会随着时间的推移而落入同一个集群,因为它们的行为往往会随着时间的推移而相似)。

我想使用 DTW 并获得每个标签相对于其他标签的相似性。但不确定,当我有 N 列时如何进行。

准确地说,我需要根据标签的相似性(Column1 .. ColumnN)随着时间的推移对标签进行分组并将它们分组。

一旦我在新数据进入时对它们进行分组,我应该能够根据先前看到的数据(可能离当前预测更近几分钟)和与标签关联的值来预测标签的值(Column1..ColumnN)在它的集群中并相应地预测它。

3个回答

Aleksandr Blekh 在这个较早的问题中的回答为时间序列聚类方法和示例提供了许多有趣的阅读材料。另外,我在下面包含了一些有趣的阅读材料,用于计算多元时间序列之间的相似性(最新的 2 个很老,但我认为它们非常有趣):

在继续使用任何方法之前,我认为花一些时间考虑以下几点很重要:

  • 尝试为您的输入数据选择正确的步长(例如,如果时间步长是每秒,则时间序列可能太长并且对于这项工作来说不必要的详细,而每小时数据可能会更好地捕捉模式)。

  • 考虑季节性可能很有趣:例如,如果时间序列是每小时的并且持续数天/数月,则可能存在一些每日/每月的季节性。在这种情况下,您可能需要计算和比较每个时间序列的平均日/月(如果是这样,您还需要决定是否应将工作日和周末全部平均或以不同的方式处理)。

  • 根据您要查找的内容,您需要确定动态时间规整 (DTW) 是否对您有用。例如,如果 2 个时间序列具有完全相同的模式,但 2 个时间序列中的一个具有时间延迟,它们是否仍属于同一个集群?(以及将它们放在同一个集群中的可接受的小/大时间延迟是多少?)

每组 DTW 是显而易见的答案。但是,我发现 DTW 在计算上非常昂贵。

我在世界上最喜欢的技术鲜为人知/使用较少,但是可以很好地处理您的问题......并且具有可扩展性的额外好处。

这种技术的缺点是它只会聚集在时间序列的“形状”上,而不像 DTW 那样要求它以特定的时间间隔排列。

它被称为SAX基本上,您将时间序列表示为一串字母。然后,您可以像在 NLP 或文本挖掘中一样对待这串字母 - 通过为每个字母、n-gram 等创建频率矩阵。现在,除了所有这些功能,您还可以将其他功能添加为好吧,然后运行正常的降维和聚类。

这取决于时间戳是否相互连接(例如 t2 受 t1 影响)。

一般来说,这看起来像一个分类问题,您可以使用例如sklearn如果您想区分 A 和 C 以及所有其他情况,您最终会遇到多类分类问题,并且并非所有算法都支持这些。如果不是,您可以将标签转换为目标(A+B)/非目标(其余)。

三个额外的建议:

  1. 您可以使用 pandas Dataframes 进行预处理。
  2. 在开始任何事情之前,您至少应该对测试和训练样本有基本的了解。
  3. 找到正确的成功指标既重要又有时具有挑战性。快速示例:如果您选择准确度并且 99% 的值属于一个类,则默认情况下预测该类的任何算法都将具有非常高的准确度。

如果时间戳已连接,您可能需要进行一些预处理并将先前时间戳中的数据添加到当前时间戳中(例如:最后 x 先前 tstamps 的第 1 列的平均值)。