如何将异常检测应用于 LSTM 中的时间序列数据?

数据挖掘 机器学习 喀拉斯 时间序列 异常检测 机器学习模型
2021-10-10 03:57:39

我在 Python 中使用 LSTM RNN 并成功完成了预测阶段。我的最终目标是异常检测。我希望有类似你在 Facebook Prophet 上看到的东西,异常情况在下面标记为黑点:

Prophet 中的异常检测

我已经阅读了大量关于如何使用文本/序列数据进行分类的文章,但是关于单变量时间序列数据的文章并不多——只有时间戳和随机生成的值有一些异常。一个答案链接到以下方法:

异常检测是通过使用预测误差作为异常指标来完成的。预测误差是在时间 t-1 做出的预测与在时间 t 接收到的输入值之间的差异。训练数据的预测误差使用高斯分布建模。使用最大似然估计 (MLE) 计算高斯参数、均值和方差。在新数据上,计算错误的对数概率密度 (PD) 并将其用作异常分数:值越低,表明观测值异常的可能性越大。包含正常数据和异常的验证集用于设置日志 PD 值的阈值,该阈值可以将异常与正常观察区分开来,并尽可能少地产生误报。使用单独的测试集来评估模型。 来源

我总体上理解为什么会使用这种方法,但我不知道如何使用 Sequential Keras 模型来实现它。有人有或知道一些示例代码吗?如果有办法可视化这一点,因为我也不知道我将如何处理这方面的事情。

请帮忙,谢谢!

2个回答

我以前也遇到过这种情况

有一篇关于媒体的文章,他使用 keras,tf 使用具有层的自动编码器来预测信用卡欺诈检测Dense,但你可以尝试相同的LSTM方法,不能确定它是否会起作用,但如果它没有'行不通,请尝试,Conv1d因为现在卷积网络比LSTMsGRUs->来源更有前途

即使自动编码器没有帮助,那个人也有观察异常的可视化,你至少必须尝试一下。

希望这可以帮助。

这是一个老问题,但我觉得缺少一个简单的答案,所以在这里:

  1. 使用您的测试集根据您已经建立的 keras 预测模型来预测您的时间步长。

  2. 从实际值中减去这些预测,以获得您的预测误差。

  3. 例如,将这些绘制在直方图中以查看错误的通常分布,如下所示:

来源:https://www.researchgate.net/figure/Prediction-Error-Distribution-of-5-and-60-Second-Prediction-Windows_fig7_315858525

  1. 根据此图和统计数据,确定一个有用的阈值(在这种情况下,例如 -5 和 +7)。

  2. 对于您的异常检测,只需使用您的模型预测下一个时间步长。然后等待这一步的实际结果,并从你的预测中减去它。如果差值大于 -5 或 +7,则为异常。

  3. 如果您发现异常过多或遗漏了一些异常,则相应地调整阈值或使用不同的参数重新训练模型。