[譯] 時間序列異常檢測算法

通俗易懂的異常檢測技術現狀

Statsbot 中, 咱們不斷回顧了異常檢測方法的發展,並在此基礎上從新完善了咱們的模型。前端

本文概述了最經常使用的時間序列異常檢測算法及其優缺點。android

本文針對的是隻想了解一下異常檢測技術現狀的無經驗讀者。咱們不想用複雜的數學模型來唬人,因此咱們把全部的數學原理推導都放在下面的推薦連接裏面了。ios

重要的異常類型

時間序列的異常檢測問題一般表示爲相對於某些標準信號或常見信號的離羣點。雖然有不少的異常類型,可是咱們只關注業務角度中最重要的類型,好比意外的峯值、降低、趨勢變化以及等級轉換。git

想象一下,你在本身的網站上跟蹤用戶數量,發現用戶在短期內出現了意想不到的增加,看起來就像一個峯值。這些類型的異常一般稱爲附加異常github

關於網站的另外一個例子是,當你的服務器宕機時,你會看到在短期內有零個或者很是少的用戶訪問。這些類型的異常一般被分類爲時間變化異常web

在你處理一些關於轉化率問題時,轉化率可能會降低。若是發生這種狀況,目標度量一般不會改變信號的形狀,而是改變在一段時間內它的總價值。根據變化的性質,這些類型的變化一般被稱爲水平位移或季節性水平位移異常算法

一般,異常檢測算法應該將每一個時間點標記爲異常/非異常,或者預測某個點的信號,並衡量這個點的真實值與預測值的差值是否足夠大,從而將其視爲異常。後端

使用後面的方法,你將可以獲得一個可視化的置信區間,這有助於理解爲何會出現異常並進行驗證。服務器

Statsbot 的異常報告顯示,實際的時間序列、預測的時間序列和置信區間有助於理解異常發生的緣由。網絡

讓咱們從應用的角度來回顧一下這兩種算法類型,以及找到各種型的異常值。

STL 分解

STL 表示基於損失的季節性分解的過程。該技術可以將時間序列信號分解爲三個部分:季節性變化(seasonal)、趨勢變化(trend)和剩餘部分(residue)

由上到下依次爲:原始時間序列和使用 STL 分解獲得的季節變化部分、趨勢變化部分以及殘差部分。

顧名思義,這種方法適用於季節性的時間序列,這是比較常見的狀況。

分析殘差的誤差,而後引入殘差閾值,這樣就能獲得一種異常檢測得算法。

這裏不太明顯的地方是,咱們爲了獲得更可靠的異常檢測結果,使用了絕對中位誤差。該方法目前最好的實現是 Twitter 的異常檢測庫,它使用了 Generalized Extreme Student Deviation(廣義的 ESD 算法)測試殘差點是不是一個離羣點。

優勢

該方法的優勢在於其簡單性和健壯性。它能夠處理不少不一樣的狀況,而且全部的異常狀況仍然能夠直觀解釋。

它主要擅長於附加的異常值檢測。若是想要檢測一些水平變化,則能夠對移動平均信號進行分析。

缺點

該方法的缺點是在調整選項方面過於死板。你所能作的只有經過顯著性水平來調整置信區間。

當信號特徵發生了劇烈變化時,該方法就失效了。例如,跟蹤本來對公衆是關閉狀態的,卻忽然對公衆開放的網站用戶數量。在這種狀況下,就應該分別跟蹤在啓動開放以前和開放以後發生的異常。

分類迴歸樹

分類迴歸樹(CART)是目前最穩健、最有效的機器學習技術之一。它也能夠應用於異常檢測問題。

  • 首先,可使用監督學習來訓練分類樹對異常和非異常數據點進行分類。這裏須要標記好的異常數據點。
  • 第二種方法,可使用無監督學習算法來訓練 CART 來預測時序數據的下一個數據點,獲得和 STL 分解方法相似的置信區間或預測偏差。而後使用廣義的 ESD 算法來測試或者使用 Grubbs 檢驗算法來檢查數據點是否位於置信區間以內。

實際的時序數據(綠色),CART 模型預測的時序數據(藍色),異常檢測算法檢測到的異常。

分類樹學習的最流行實現是 xgboost 庫

優勢

這種方法的優勢是它不受信號結構的任何約束,並且能夠引入許多的特徵參數進行學習,以得到更爲複雜的模型。

缺點

該方法的缺點是會出現愈來愈多的特徵,這很快會影響到總體的計算性能。在這種狀況下,你應該有意識地選擇有效特徵。

ARIMA 模型

自迴歸移動平均模型(ARIMA)是一種設計上很是簡單的方法,但其效果足夠強大,能夠預測信號並發現其中的異常。

該方法的思路是從過去的幾個數據點來生成下一個數據點的預測,在過程當中添加一些隨機變量(一般是添加白噪聲)。以此類推,預測獲得的數據點能夠用來生成新的預測。很明顯:它會使得後續預測信號數據更平滑。

使用這種方法最困難的部分是選擇差別數量、自動迴歸數量和預測偏差係數。

每次使用新信號時,你都應該構建一個新的 ARIMA 模型。

該方法的另外一個障礙是信號通過差分後應該是固定的。也就是說,這意味着信號不該該依賴於時間,這是一個比較顯著的限制。

異常檢測是利用離羣點來創建一個通過調整的信號模型,而後利用 t-統計量來檢驗該模型是否比原模型能更好的擬合數據。

利用原始 ARIMA 模型和對異常值進行調整的 ARIMA 模型構建的兩個時間序列。

該方法最受歡迎的實現是 R 語言中的 tsoutliers 包。在這種狀況下,你能夠找到適合信號的 ARIMA 模型,它能夠檢測出全部類型的異常。

指數平滑方法

指數平滑方法與 ARIMA 方法很是類似。基本的指數模型等價於 ARIMA (0, 1, 1) 模型。

從異常檢測的角度來看,最有趣的方法是 Holt-Winters 季節性方法。該方法須要定義季節性週期,好比周、月、年等等。

若是須要跟蹤多個季節週期,好比同時跟蹤周和年週期,那麼應該只選擇一個。一般是選擇最短的那個:因此這裏咱們就應該選擇周季節。

這顯然是該方法的一個缺點,它會大大影響總體的預測範圍。

和使用 STL 或 CARTs 方法同樣,咱們能夠經過統計學方法對離羣值進行統計來實現異常檢測。

神經網絡

與 CART 方法同樣,神經網絡有兩種應用方式:監督學習和無監督學習。

咱們處理的數據是時間序列,因此最適合的神經網絡類型是 LSTM。若是構建得當,這種循環神經網絡將能夠建模實現時間序列中最複雜的依賴關係,包括高級的季節性依賴關係。

若是存在多個時間序列相互耦合,該方法也很是有用

該領域還在研究中,能夠參考這裏,構建時序模型須要大量的工做。構建成功完成後,就可能在精確度方面取得優異的成績。

💡 謹記 💡

  1. 嘗試最適合你的問題的最簡單的模型和算法。
  2. 若是無效,則改用更高級的技術。
  3. 從包含全部狀況的通用性解決方案開始是一個誘人的選擇,但並不老是最好的。

在 Statsbot 中,爲了進行大規模的異常檢測,咱們開始使用了 STL,而後使用到 CART 和 LSTM 模型的不一樣技術組合。

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索