在 Python 中使用 ARIMA 进行单变量时间序列数据中的异常检测并更新

数据挖掘 Python 时间序列 异常检测 离群值
2022-02-10 18:59:19

我已经使用 statsmodels 库在大约 15 分钟递增的时间序列数据上训练了一个 ARIMA 模型。我想确定我观察到的下一个 15 分钟增量的数据有多反常。然后我想用该数据更新模型。

我可以在可接受的误差范围内预测未来结果的范围,如下所示:

model = arima_model.ARIMA(data.COUNTS,(p,d,q)).fit()
print model.forecast(alpha=.001)[2]

输出:

数组([[ 16.13395152, 48.47024783]]))

所以你可以说这个范围之外的任何数字都是异常的。但是,例如,如果我的下一个观察值是 50,那么它可能比 51 的观察值更不异常。您建议我使用哪种方式来确定使用 ARIMA 模型的观察值的异常程度?

另外,我应该如何用新的观察来更新我的模型?

1个回答

您是否考虑过使用分位数预测作为您的 ARIMA?

分位数预测是指您预测分位数而不是预测平均值。在您的情况下,您可以预测某一天观察值低于 0.5% 和 99.5% 的概率。该范围将定义接下来几天“异常”值的 1%。

概括一下,通常在回归中,您通过最小化找到平均值分钟β一世||X一世β-是的一世||2.

您可以通过最小化找到中值分钟β一世|X一世β-是的一世|.

您还可以找到任何给定的分位数τ通过最小化分钟β一世|是的一世X一世βτ|X一世β-是的一世|+一世|是的一世<X一世β(1-τ)|X一世β-是的一世|.

当然,这些最小化问题变得越来越复杂。你只能估计你的β最后一个使用 ADMM 或梯度下降。

我认为您不会为此找到 python 工具。不过,您会在 R 中找到很多包。例如,请参阅此页面:

最后一条建议:如果您需要此预测以与其他 python 代码互操作,我的建议是通过 CSV 文件进行。只需让你的 python 代码进行预处理并生成一个 CSV 文件,然后 R 做它的事情并生成另一个 CSV 文件,然后使用这个文件在 python 中进行后处理等。有些人尝试使用 rpy2 之类的东西,但我发现它过度设计。