【问题标题】:How to detect anomaly in a time series data(specifically) with trend and seasonality present in it?如何检测时间序列数据(特别是)中存在趋势和季节性的异常?
【发布时间】:2019-07-17 06:39:53
【问题描述】:

我想检测包含趋势和季节性成分的“时间序列数据”中的异常值。我想省略季节性的峰,只考虑其他峰并将它们标记为异常值。由于我是时间序列分析的新手,请帮助我解决这个时间序列问题。

编码平台使用的是Python。

尝试 1:使用 ARIMA 模型

我已经训练了我的模型并预测了测试数据。然后能够计算预测结果与我的测试数据的实际值之间的差异,然后能够根据观察到的方差找出异常值。

Auto Arima 的实现

!pip install pyramid-arima
from pyramid.arima import auto_arima
stepwise_model = auto_arima(train_log, start_p=1, start_q=1,max_p=3, max_q=3,m=7,start_P=0, seasonal=True,d=1, D=1, trace=True,error_action='ignore', suppress_warnings=True,stepwise=True)

import math
import statsmodels.api as sm
import statsmodels.tsa.api as smt
from sklearn.metrics import mean_squared_error

将数据拆分为训练集和测试集

train, test = actual_vals[0:-70], actual_vals[-70:]

日志转换

train_log, test_log = np.log10(train), np.log10(test)

转换为列表

history = [x for x in train_log]
predictions = list()
predict_log=list()

拟合逐步 ARIMA 模型

for t in range(len(test_log)):
stepwise_model.fit(history)
    output = stepwise_model.predict(n_periods=1)
    predict_log.append(output[0])
    yhat = 10**output[0]
    predictions.append(yhat)
    obs = test_log[t]
    history.append(obs)

绘图

figsize=(12, 7)
plt.figure(figsize=figsize)
pyplot.plot(test,label='Actuals')
pyplot.plot(predictions, color='red',label='Predicted')
pyplot.legend(loc='upper right')
pyplot.show()

但我只能在测试数据中检测到异常值。实际上,我必须检测整个时间序列数据的异常值,包括我拥有的火车数据。

尝试 2:使用季节性分解

我使用下面的代码将原始数据拆分为季节性、趋势、残差,如下图所示。

from statsmodels.tsa.seasonal import seasonal_decompose

decomposed = seasonal_decompose()

然后我使用残差数据通过箱线图找出异常值,因为季节性和趋势成分已被删除。这有意义吗?

或者还有其他简单或更好的方法吗?

【问题讨论】:

    标签: python machine-learning time-series anomaly-detection


    【解决方案1】:

    你可以:

    • "Attempt 2 : Using Seasonal Decomposition" 的第四张图(残差图)中,尝试检查极值点,这可能会导致季节性序列出现一些异常。
    • 监督(如果你有一些标记的数据):做一些分类。
    • 无监督:尝试预测下一个值并创建置信区间以检查预测是否在其中。
    • 您可以尝试计算数据的相对极值。使用 argrelextrema 如下所示:
    from scipy.signal import argrelextrema
    x = np.array([2, 1, 2, 3, 2, 0, 1, 0]) 
    argrelextrema(x, np.greater)
    

    输出:

    (数组([3, 6]),)

    一些随机数据(我对上述 argrelextrema 的实现):

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 2022-08-19
      • 2022-01-02
      • 2019-01-08
      • 1970-01-01
      • 2016-03-31
      • 2018-05-18
      • 1970-01-01
      • 2020-06-07
      相关资源
      最近更新 更多