使用 Apache Spark 对时间序列数据进行 K-Means

K-Means on time series data with Apache Spark

我有一个数据管道系统,所有事件都存储在 Apache Kafka 中。有一个事件处理层,它使用并转换该数据(时间序列),然后将生成的数据集存储到 Apache Cassandra 中。

现在我想使用 Apache Spark 来训练一些用于异常检测的机器学习模型。这个想法是 运行 过去数据的 k-means 算法,例如一天中的每个小时。

例如,我可以 select 下午 4 点到 5 点之间的所有事件,并为该时间间隔构建模型。如果我应用这种方法,我将得到恰好 24 个模型(每个小时的质心)。

如果算法表现良好,我可以将间隔的大小减少到例如 5 分钟。

对时间序列数据进行异常检测是一种好方法吗?

我不得不说找到 Outliers 的策略很好,但您需要注意几个步骤。首先,使用每 5 分钟的所有事件为事件创建一个新的质心。我认为 tahat 可能不是一个好主意。

因为使用太多的质心,您会很难找到异常值,而这正是您不想要的。

那么让我们看看一个好的策略:

  1. 为您的 K 均值找到合适的 K 数。

    这一点真的很重要,如果你有太多或太少,你就会对现实做出不好的表现。所以select一个good K
  2. 好好训练集

    因此,您无需每次和每天都使用所有数据来创建模型。你应该举个例子说明你的正常情况。你不需要拿走不正常的东西,因为这就是你想要找到的东西。所以用它来创建你的模型,然后找到集群。
  3. 测试一下!

    您需要测试它是否工作正常。你有任何你看到的奇怪的例子吗?而且你有一套,你现在觉得一点也不奇怪。检查它是否正常工作。为了帮助解决这个问题,您可以使用 Cross Validation

那么,你的idea好吗?是的!它可以工作,但请确保不要在集群中过度工作。当然,您可以使用每天的数据集来训练更多模型。但是每天进行一次查找质心的过程。并让 Euclidian distance 方法查找您的组中有或没有的内容。

希望对你有所帮助!