時間序列異常檢測算法S-H-ESD

1. 基於統計的異常檢測

Grubbs' Test

Grubbs' Test爲一種假設檢驗的方法,常被用來檢驗服從正太分佈的單變量數據集(univariate data set)\(Y\) 中的單個異常值。如有異常值,則其必爲數據集中的最大值或最小值。原假設與備擇假設以下:php

\(H_0\): 數據集中沒有異常值
\(H_1\): 數據集中有一個異常值html

Grubbs' Test檢驗假設的所用到的檢驗統計量(test statistic)爲git

\[ G = \frac{\max |Y_i - \overline{Y}|}{s} \]github

其中,\(\overline{Y}\)爲均值,\(s\)爲標準差。原假設\(H_0\)被拒絕,當檢驗統計量知足如下條件web

\[ G > \frac{(N-1)}{\sqrt{N}}\sqrt{\frac{ (t_{\alpha/(2N), N-2})^2}{N-2 + (t_{\alpha/(2N), N-2})^2}} \]算法

其中,\(N\)爲數據集的樣本數,\(t_{\alpha/(2N), N-2}\)爲顯著度(significance level)等於\(\alpha/(2N)\)、自由度(degrees of freedom)等於\(N-2\)的t分佈臨界值。實際上,Grubbs' Test可理解爲檢驗最大值、最小值偏離均值的程度是否爲異常。dom

ESD

在現實數據集中,異常值每每是多個而非單個。爲了將Grubbs' Test擴展到\(k\)個異常值檢測,則須要在數據集中逐步刪除與均值偏離最大的值(爲最大值或最小值),同步更新對應的t分佈臨界值,檢驗原假設是否成立。基於此,Rosner提出了Grubbs' Test的泛化版ESD(Extreme Studentized Deviate test)。算法流程以下:spa

  • 計算與均值偏離最遠的殘差,注意計算均值時的數據序列應是刪除上一輪最大殘差樣本數據後;

\begin{equation}
R_j = \frac{\max_i |Y_i - \overline{Y'}|}{s}, \quad 1 \leq j \leq k
\label{eq:esd_test}
\end{equation}htm

  • 計算臨界值(critical value);

\[ \lambda_j = \frac{(n-j) * t_{p,n-j-1}}{\sqrt{(n-j-1+t_{p,n-j-1}^2)(n-j+1)}}, \quad 1 \leq j \leq k \]blog

  • 檢驗原假設,比較檢驗統計量與臨界值;若\(R_i > \lambda_j\),則原假設\(H_0\)不成立,該樣本點爲異常點;

  • 重複以上步驟\(k\)次至算法結束。

2. 時間序列的異常檢測

鑑於時間序列數據具備週期性(seasonal)、趨勢性(trend),異常檢測時不能做爲孤立的樣本點處理;故而Twitter的工程師提出了S- ESD (Seasonal ESD)與S-H-ESD (Seasonal Hybrid ESD)算法,將ESD擴展到時間序列數據。

S-ESD

STL將時間序列數據分解爲趨勢份量、週期份量和餘項份量。想固然的解法——將ESD運用於STL分解後的餘項份量中,便可獲得時間序列上的異常點。可是,咱們會發如今餘項份量中存在着部分假異常點(spurious anomalies)。以下圖所示:

在紅色矩形方框中,向下突起點被誤報爲異常點。爲了解決這種假陽性下降準確率的問題,S-ESD算法用中位數(median)替換掉趨勢份量;餘項計算公式以下:

\[ R_X = X - S_X- \tilde{X} \]

其中,\(X\)爲原時間序列數據,\(S_X\)爲STL分解後的週期份量,\(\tilde{X}\)\(X\)的中位數。

S-H-ESD

因爲個別異常值會極大地拉伸均值和方差,從而致使S-ESD未能很好地捕獲到部分異常點,召回率偏低。爲了解決這個問題,S-H-ESD採用了更具魯棒性的中位數與絕對中位差(Median Absolute Deviation, MAD)替換公式\eqref{eq:esd_test}中的均值與標準差。MAD的計算公式以下:

\[ MAD = median(|X_i - median(X)|) \]

S-H-ESD的Python實現有pyculiarity,時間序列異常檢測數據集有Yahoo公開的A Labeled Anomaly Detection Dataset

3. 參考資料

[1] Hochenbaum, Jordan, Owen S. Vallis, and Arun Kejariwal. "Automatic Anomaly Detection in the Cloud Via Statistical Learning." arXiv preprint arXiv:1704.07706 (2017).

相關文章
相關標籤/搜索