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

leeyang-tju發表於2019-03-03

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

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

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

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

本文針對的是隻想了解一下異常檢測技術現狀的無經驗讀者。我們不想用複雜的數學模型來唬人,所以我們把所有的數學原理推導都放在下面的推薦連結裡面了。

重要的異常型別

時間序列的異常檢測問題通常表示為相對於某些標準訊號或常見訊號的離群點。雖然有很多的異常型別,但是我們只關注業務角度中最重要的型別,比如意外的峰值、下降、趨勢變化以及等級轉換。

想象一下,你在自己的網站上跟蹤使用者數量,發現使用者在短時間內出現了意想不到的增長,看起來就像一個峰值。這些型別的異常通常稱為附加異常

關於網站的另一個例子是,當你的伺服器當機時,你會看到在短時間內有零個或者非常少的使用者訪問。這些型別的異常通常被分類為時間變化異常

在你處理一些關於轉化率問題時,轉化率可能會下降。如果發生這種情況,目標度量通常不會改變訊號的形狀,而是改變在一段時間內它的總價值。根據變化的性質,這些型別的變化通常被稱為水平位移或季節性水平位移異常

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

使用後面的方法,你將能夠得到一個視覺化的置信區間,這有助於理解為什麼會出現異常並進行驗證。

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

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前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章