时间序列异常检测

机器算法验证 时间序列 Python scikit-学习 异常检测
2022-04-01 19:31:26

我是使用机器学习的初学者(我完成了 Ng 的课程),我在 python 中使用 scikit-learn。我想找到检测系统异常的最佳方法。

我们有按计划(每隔几分钟/几小时)发生的持续事件,我想检测何时发生异常情况。示例数据:

ID | epoch-time | duration (Sec) | status | is_manual

0400 | 1488801454  | 500 | completed | 1

0401 | 1488805055  | 500 | completed | 1

0402 |  1488812254  | 40000 | failed | 1

6831 | 1488805050  | 200 | failed | 0

.

... (Millions of examples)

.

0014 |  1488805055 | 1200 | completed | 0

例如,事件 ID 0400 每小时发生一次。我想告诉它什么时候不运行。

我打算做的是向算法提供过去 10 分钟内的所有事件。

主要问题:如何处理ID列?我应该采取的最佳方法是什么?

3个回答

我发现这篇文章对我的情况很有帮助:

https://mapr.com/blog/deep-learning-tensorflow/

使用这个基本的 RNN 结构,我能够预测下一个时间步的结果。通过将所有事件集中到最近的一分钟,网络能够识别时间线内相关的模式。

一种简单的方法是将每种事件类型视为独立的,然后为每种事件类型构建一个模型。如果您希望事件定期发生,那么信息功能可能是time-since-last-event.

为了评估这种模型的可行性,应该进行一些探索性数据分析并绘制这些特征的直方图并分析异常值是否存在和可见。

如果它看起来合理,那么可以将模型拟合到这些特征。如果特征是连续且正态分布的,则与归一化分布的距离可能是一个不错的异常分数。对于单个特征(单变量),这很容易计算。对于多个特征,可以使用 EllipticEnvelope 或 GaussianMixtureModel 之类的东西。

可以使用每个事件模型的异常分数来构建多事件异常评分模型。

我看到事件也有失败/完成状态。人们可能会在一段时间内总结这些并计算(时间平均)故障率。每个事件类型或所有事件类型。这个也可以建立一个异常检测模型。也许只是简单的阈值。

有几种方法可以解决这个问题。在开始设计任何模型之前,请先标准化您的数据。您的数据似乎没有标记,所以最初,您可以做的是对其执行 t-SNE 可视化,这将为您提供对数据的很多见解。根据其结果,您可以开发更合理的模型,将样本分为正常样本和异常样本。更多关于 t-SNE 的信息在这里