时间序列中的异常检测

数据挖掘 r 时间序列 离群值
2021-09-18 21:21:35

用例:

每天,我们都有每天建立的指标来检查我们的系统是否运行良好。有时,构建这些指标的工作流程中会出现错误,我必须构建一种算法,当出现问题时会提醒我们,以便我们检查问题的来源。

我正在尝试什么:

我对时间序列了解不多。我拥有的数据显示了每周的季节性,并且数量不是恒定的(它正在增长)。见图片: http: //www.blabala.com(我没有足够的代表来发布多张图片)因此,从我读到的内容来看,ARIMA 似乎是一个相关的算法。

我偶然发现了 中的tsoutlierR及其功能locate.outliers.oloop()discard.outliers(),所以我有了以下想法:与其尝试训练我不掌握的东西,不如让算法的自动部分自己训练,并使用它:如果它检测异常值,然后发出警报。

  • 第一个问题:这似乎是个好主意还是坏主意?

如果这是一个好方法:

我很难得到运行良好的东西。我探索了两种做事方式:

1)训练整个事情,并自行运行。

cval <- 3
mo2 <- locate.outliers.oloop(TS_train, 
                             arima_train, 
                             maxit.iloop = 100, 
                             maxit.oloop = 100, 
                             cval = cval)
d2<-discard.outliers(mo2,TS_train, method = "bottom-up",
                     tsmethod.call = arima_train$call,
                     cval = cval)

OTL <-  TS_train[sort(d2$outliers$ind)]

plot(1:length(TS_train), TS_train, type = 'p')
lines(1:length(TS_train), TS_train, col = "grey")
points(sort(d2$outliers$ind), OTL, col = "red")

这并没有给出很好的结果。见图 1。

2)有一个滑动窗口:以第1到60天为训练数据训练算法,评估第61天,滑动一天,以第2到61天为训练数据训练算法,评估第62天,滑动一天,依此类推.

plage <- 60
cval <- 3
ylim <-  range(DT$col1) + c(-1,1) * .05 * diff(range(DT$col1))

for( i in (plage + 1):65 ) { 
  TS_tmp <- ts(DT[(i-plage):i]$col1, frequency = 7)
  aa <- auto.arima(TS_tmp)
  mo_tmp <- locate.outliers.oloop(TS_tmp, aa, 
                                  maxit.iloop = 100, maxit.oloop = 100, 
                                  cval = cval)
  d_tmp <- discard.outliers(mo_tmp, TS_tmp, method = "bottom-up",
                            tsmethod.call = aa$call, cval = cval)

  Outl <- TS_tmp[sort(d_tmp$outliers$ind)]
  print(plot(DT[(i-plage):i]$col1, type = "b", xlim = c(1, nrow(DT)), ylim = ylim))
  print(points(sort(d_tmp$outliers$ind), Outl , col = "red"))
}

它似乎表现更差......(见图2)

再说一次,我对时间序列了解不多,也不知道如何评估模型的性能。

我的问题:

  • 这两种方法中的任何一种都是好主意吗?哪个最好?有更好的主意吗?

  • 我正在使用方法 n1 中的 9 个月数据。在方法 n2 中(如果相关),我的训练集中应该包含多少数据?(目前:60 天)

  • 关于如何最好地校准模型的任何建议?

在此处输入图像描述

2个回答

我建议您尝试从数据中删除趋势(增长),然后尝试对其进行建模。那么与模型的差异可能是您的异常值和警报

看到这个:https ://anomaly.io/seasonal-trend-decomposition-in-r/

您可以尝试基于本文的 MDI算法

作者在检测时空时间序列数据的异常方面取得了很好的成果。它基于将时间序列的特定间隔上的概率分布与时间序列的其余部分进行比较。该论文描述了他们如何处理这个看似复杂的组合优化问题。

此外,他们还发布了代码它甚至带有用于非空间但时间数据的 GUI。