時間序列異常檢測 EGADS Surus iForest

時間序列異常檢測

本文總結了我在時間序列異常算法方面的一些經驗。讀者需要對常規機械學習算法有一定的了解。希望本文能幫助有相關需求的工程師快速切入。

EGADS Java Library

EGADS (Extendible Generic Anomaly Detection System)是Yahoo一個開源的大規模時間序列異常檢測項目。它的框架主要由兩個模塊構成,一個是時間序列構造模塊,另一個是異常檢測模塊。給定一段時間的離散值(構成一個序列),時間序列模塊會學習這段序列的特征,并試圖重新構建一個和原序列盡量接近的序列。結果和原序列一同送入異常檢測模塊,基于不同的算法(原則,閾值),異常點會被標記出來。

Time-series Modeling Module

時間序列構造模塊提供了多種算法。簡單介紹如下:

Olympic Model(Seasonal Naive)一個簡單的窗口模型,對點Px的預測為點Px前n個值的Smoothed Average.

Exponential Smoothing Model 一個平滑模型,由簡單的數列獲得。ETS模型可以自動選擇Single、Double、Triple里面匹配最好的輸出。

Moving Average Model 也是平滑模型,點Px的預測值取鄰近點的平均值。

Regression Models 一般是線性回歸,特殊例子或者異常偏差特別大的時候有用。

Anomaly Detection Module

異常檢測模塊

ExtremeLowDensityModel 超低密度模型,很簡單有效的密度模型。

AdaptiveKernelDensityChangePointDetector 拐點檢測模型

KSigmaModel 經典K-sigma模型

DBScanModel(Density-Based Spatial Clustering of Applications with Noise)又是一個基于密度的模型,在空間中作聚類,如果目標序列可以比較好的分類的話會有不錯的效果。

實踐經驗

序列構造自動選優

不同類型的數據可能適合不同的模型。選擇AutoForecastModel,程序會自動把所有TMM都跑一遍,并推選偏差值最小的模型送入異常檢測模塊。值得注意的是,這里自動選取的標準只關注了還原度,但還原度高并不直接代表能更好的查找異常,在使用本方法的時候要留意在心。

多數投票算法

不同的異常檢測算法從不同的角度定義了異常。實踐過程中我發現,單一異常算法并不能找出所有異常點,同時還會出現一系列的假陽性異常。使用Majority Voting,規定半數以上算法識別為異常的點才輸出為結果,在實際數據中提供了遠高于單一算法的準確度。

Surus

Surus是Netflix開源的一個項目,因為Netflix內部大量使用Pig和Hive,Surus主要的功能是提供RPCA的Pig/Hive封裝。核心算法Robust PCA是Java實現的,可以單獨調用。

Netflix首先對他們的問題定了一個基調。Profile是一個非常好的習慣,對決策者來說可以提供命中率,也就提高了團隊效率。問題的特征定義如下:

高緯度。數據集緯度高,數據間相互交織,人工檢測基本不可能。

最低加陽性。作為異常檢測問題,我們不希望有過多的假陽性報警來干擾監控人員。

周期性。每小時/每天/每周/每月這樣的周期性數據如果不妥善處理,某些周期性的行為可能誤報為異常。實際數據中,每天固定時段的峰值數據相對于大部分采樣點都可能被判定為異常,但實際為周期性正常現象。

數據并不是均勻分布的。像Netflix在兩年中實現了高增長,算法需要足夠健壯來處理非均勻分布的數據集(增長性數據是一個普遍現象,如長期來看的股市指數等)。

算法細節

Robust PCA是一個非常常見的主要成分提取算法。RPCA本質其實是一個矩陣分解算法。目標是將輸入X分解為X=L+S+E。L代表了X的low rank approximation(低秩估計)。而低秩估計本質就是將矩陣中相關性強的行投影到更低維的線性空間,實現了一個降維平滑的功能,同時剔除了冗余信息,提取了矩陣特征。提取完主要成分L后,獲得了剩下的稀疏矩陣S,和噪點E。

這里做異常檢測的時候簡單認為低秩矩陣L就能大部分還原輸入序列。異常點的特征應該就表現在S或者E中。實際應用中可以把RPCA作為一個時間序列構造模型添加入EGADS中,用后者的異常檢測模塊提取異常。

Isolation Forest

上面兩個項目使用了若干種類的異常檢測算法。如基于模型的(統計模型,線性模型);基于距離的(K臨近等聚類算法);基于密度模型的(Extreme Low Density Model)。隔離森林(Isolation Forest)跟他們都有比較明顯的區別。論文代碼

在訓練階段,小樣本抽樣更利于獲得優質的分類結果。

因為不用計算點與點直接的距離,計算時間大大優于各種基于距離的算法。

同樣因為小樣本抽樣后迭代,時間、空間復雜度都可以維持在相當低的水平。

基于上一點,iForest有能力處理超高維,超大規模的數據。

iForest適用場景需要符合兩個要求:1. 異常點非常少 2. 異常點的某些屬性要跟正常點非常不同。

iForest是基于隨機森林的算法。對異常的分類能力基于兩個假設:

數據集中少數的異常點會形成少量的聚類。

異常點具有明顯不同的屬性,使他們很快在分類中被區分出來。正常點很難被分類,而存在于樹的更深層。

上圖橫坐標表示了隨機森林的迭代過程。選取一個異常點Xo和一個正常點Xi。縱軸代表了點Xo和Xi在迭代中被區分出時樹深度的平均值。可以明顯的看到,正常節點平均需要12次隨機分類,而異常點只需要4次多就可以被區分出來。

上圖展示了小規模隨機抽樣同樣可以達到非常好的聚類效果。這在處理大規模數據的時候尤其有用,在多篇文章中,iForest因為這一特性被推薦為首選算法。實現方面有R,Java,Python,搜索一下就有。

BENCHMARKING ALGORITHMS FOR DETECTING ANOMALIES IN LARGE DATASETS

這篇論文使用了比較常見,簡單易得的算法,基于學術界認可的標準數據集,進行了一系列性能,準確度試驗,希望得到異常檢測這一問題的一個基準。

本文使用了以下幾種算法,因為是調用的Weka,所以算是比較簡單的試驗。

K鄰近(K Nearest Neighbor)

多層神經網絡(Multi-layer Perceptron) 可以簡單認為是一個復雜參數學習的分類器。

基于密度的聚類算法:LOF (Local Outlier Factor)

隨機森林(Random Forest)

Isolation Forest

經過一系列試驗,結論中推舉了以下步驟:

如果是維度非常高的數據,用J48選Attribute。

用iForest預選異常點,標準為score > 0.50

把ANN,J48,RF作為一個組合再處理2步得到的異常點。

被較多算法標注為異常的點就認為有高可信度。

主要數據集

KDDCUP99網絡流數據。常用入侵檢測數據,學術界大量使用。不過據說后來被證明不太可靠。

Amazon監控數據Amazon EC2性能檢測的真實檢測數據,放出的數據有真實異常,并且有人工標注。

內部威脅數據CERT人造的內部威脅數據。人造的方法還是比較科學的,不過異常模式比較簡單,知道答案倒推就很容易。不過要自己發現異常就需要比較大的工作量了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容