异常检测 - 阈值和异常之间的关系

数据挖掘 机器学习 Python 时间序列 无监督学习 异常检测
2022-02-21 20:31:12

我正在用 Python 开发一个异常检测程序。
主要思想是每天创建一个新的 LSTM 模型,用前 7 天训练它并预测第二天。
然后,使用阈值,逐日发现异常。

我已经实现了,这些阈值运行良好:

上阈值等于 trimmed_mean + (K * interquartile_range)
下阈值等于 trimmed_mean - (K * interquartile_range)

其中 trimmed_mean 和 interquartile_range 是根据预测误差(真实曲线 - 预测一)计算的,K 设置为 5。

我想知道是否有正确配置K值的规则或方法。因为目前,我的方法是调整阈值以查看误报。

我正在寻找异常与如何设置阈值之间的任何关系。

我已经尝试为每个模型计算 AUC(曲线下面积)并寻找关系,但没有成功。事实上,由于我每天都创建一个新模型,并且在大多数情况下我没有任何异常值,我无法正确计算出真阳性率。

谢谢

编辑
根据 Ben 的评论,我将添加有关我的问题的详细信息。
让我们开始更好地解释异常值对我来说是什么。
因此,我正在分析每 5 分钟获取一次 kWh 创建的时间序列,因此每天有 288 条记录。
异常值基本上是一个峰值,因此是一个与其他值非常不同的值。
此外,我需要每天创建一个模型,因为客户没有太多数据,我还需要捕捉季节性。
最后但同样重要的是,我正在研究一个单变量问题,所以我只有获取价值和时间,仅此而已。

编辑回答 BEN 的问题
首先是的,kWh 表示功耗。
我有另一种类型的异常是阻塞值(如 0、0、0 ecc。),但我认为我可以识别它们“添加一个简单的规则”来检测这些情况。
关于季节性:
每个新模型都使用前 7 天进行训练,并且这个时间窗口每天都在向前移动。因此,仅使用前 7 天删除和训练每天的模型。
我已经解决了您提到的问题(用异常数据训练新模型)用下一个值和上一个值之间的差异计算的新值替换异常数据。

这里有几个我的数据图:
图像 1 图像 2

其中绿线是预测,蓝线是真实时间序列

1个回答

要给出有用的答案,需要更多信息。当你想检测异常时,我会说,根据我的感受和理解,每天训练模型是没有意义的。您应该定义一次正常系统并尝试从那里捕获异常。趋势很难捕捉,但这总是很难。

识别异常也意味着您必须了解您的系统,但在这里我必须参考第一句话:您的系统是什么?它是一个技术系统(然后任务变得相当复杂)还是“只是”一些模式识别或欺诈检测等等?

但是,当我为具有约 60 个变量(和 12 个月的数据)的大型机器执行此操作时,我使用前 3 个月进行训练并将此状态定义为正常状态。然后我设置阈值,以便在 RMSE 达到max(Xi). 除了 1-2 个变量外,这非常有效。但正如我所说,这取决于你的情况。例如,当您有一台蒸汽机并且正常温度为 98 °C 并且一切都在 101 °C 时爆裂,您可能必须使用自定义阈值,例如标准偏差在这里没有多大帮助。

添加更多信息:特别是在异常检测的情况下,通常一种方法是不够的。我会实现一些基本的方法,比如对必须检测的最微不足道的情况使用标准偏差,以及使用更高级的方法(如 LSTM)来跟踪更复杂的模式。