我正在用 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 天删除和训练每天的模型。
我已经解决了您提到的问题(用异常数据训练新模型)用下一个值和上一个值之间的差异计算的新值替换异常数据。
其中绿线是预测,蓝线是真实时间序列