異常檢測-時序異常檢測建模

摘要:雖然計算機軟硬件的快速發展已經極大提升了應用程序的可靠性,可是在大型集羣中仍然存在大量的軟件錯誤和硬件故障。系統要求7x24小時不間斷運行,所以,對這些系統進行持續監控相當重要。這就要求咱們就被從系統中持續採集系統運行日誌,業務運行日誌的能力,並能快速的分析和監控當前狀態曲線的異常,一旦發現異常,能第一時間將信息送到相關人員手中。html

文章系列連接

  • SLS機器學習介紹(01):時序統計建模node

  • SLS機器學習介紹(02):時序聚類建模算法

  • SLS機器學習介紹(03):時序異常檢測建模sql

  • SLS機器學習介紹(04):規則模式挖掘小程序


  • SLS機器學習最佳實戰:時序異常檢測和報警微信

摘要與背景

雖然計算機軟硬件的快速發展已經極大提升了應用程序的可靠性,可是在大型集羣中仍然存在大量的軟件錯誤和硬件故障。系統要求7x24小時不間斷運行,所以,對這些系統進行持續監控相當重要。這就要求咱們就被從系統中持續採集系統運行日誌,業務運行日誌的能力,並能快速的分析和監控當前狀態曲線的異常,一旦發現異常,能第一時間將信息送到相關人員手中。所以,使用機器學習和數據挖掘的手段對系統自動化進行異常檢測相當重要。網絡

讓咱們來看時序數據的一些常見異常:機器學習

  1. 延時的毛刺:在對讀寫敏感的場景中,常常會有IO毛刺問題困擾,這些毛刺每每被平均難以經過肉眼或P99等監控方法發現ide



2.業務系統調用量異常:以雲服務提供的API爲例,因各類緣由會有一個短暫的Burst和降低。對於重要接口能夠在監控系統上發現,但當咱們面向幾百個接口的監控時也會力不從心函數



3.水位上升:新版本發佈後,各個指標的形態與歷史吻合,可是總體的平均水位有拔高



當業務組合(B)複雜,部署規模(N)變大後,依靠傳統的人眼+依賴同比環比等絕對值算法來判斷就捉襟見肘了,如下咱們提供對這一類問題的分類與解法。

Scale=BNNumberOfSeriesData

異常類型概述

一般說的異常大體分爲異常值、波動值、異常時間序列等幾種狀況:

  • 異常值(Outlier)

    • 給定輸入時間序列x,異常值是時間戳值對(t,xt),其中觀測值xt與該時間序列的指望值(E(xt))不一樣。

  • 波動點(Change Point)

    • 給定輸入時間序列x,波動點是指在某個時間t,其狀態在這個時間序列上表現出與t先後的值不一樣的特性。

  • 斷層異常(Breakout)

    • 時序系統中某一時刻的值比前一時刻的值陡增或者陡降不少。

  • 異常時間序列(Anomalous Time Series)

    • 給定一組時間序列X=xi,異常時間序列xiX是在X上與大多數時間序列值不一致的部分。

PS:上述概括的異常均是針對單條時序曲線的形態異常,在工做交流中,發現網絡流量的同窗不只要關注流量數值的大小異常、增量異常,同時還要考慮在必定的窗口期內,針對單業務線的各個網絡包成分的異常,這些特定場景的異常須要設計特定的算法進行判別。在此不展開討論,作異常的同窗能夠私下釘釘我,多多交流!

開源異常檢測系統

  • 這裏添加了一些我在調研中找到的異常檢測算法包,有Java版本、R版本供各位同窗參考使用

算法 具體描述
EGADS ExtremeLow 密度模型異常值 EGADS基於密度的異常檢測
EGADS CP EGADS中波動點檢測
EGADS KSigmaModel 異常值 EGADS中經典的KSigma模型
Extreme R異常值 開源的異常值檢測、閾值絕對值和殘差檢測異常
Twitter Outliter 基於廣義的ESD方法的Twitter R語言異常檢測庫
BreakOut Twitter CP Twitter一個基於ESD統計檢測來實現變點檢測的R語言庫
Change Pt1-2-3 R R語言版本的變點檢測庫

異常檢測方法

對時序曲線進行大體的概括整理後,能夠發現,單條曲線形態大體能夠分紅以下三個場景:

  • 數據無規律波動,可是正常穩定狀況下,時序數據大體在一個穩定的區間內波動,一般能夠設計一組不一樣等級的閾值,進行閾值的異常報警;

  • 數據長期波動幅度較大,可是正常狀況下,短時間內數據波動幅度較小,總體展示出較爲平穩的上漲或者降低,這裏對應的異常就是斷層異常,是否在某個時刻數據陡增或者陡降;

  • 數據有明顯的規律性和週期性,經過學習週期變化、漲幅變化獲得最終異常數據;

本文圍繞着異常檢測、變點檢測、斷層檢測這三個主題進行展開,這一期主要利用基於預測的方法進行異常檢測。這其中主要展開關於ARMA、Holt Winters和STL模型集中討論。


基於預測的異常檢測



針對單條時序數據,能夠利用這篇文章中的方法進行建模預測SLS機器學習介紹(01):時序統計建模,根據預測出來的時序曲線和歷史數據求出時序的殘差,對殘差序列建模,利用KSigma或者分位數等方法進行異常檢測。

數據平滑

以網絡流量曲線爲例,該曲線局部都懂的很厲害,若對原始數據建模,則會吸取很很大的噪音,影響模型的效果,能夠先用平滑函數對數據進行平滑處理。下圖中,藍色曲線是原始的網絡流量數據,紫色是通過長度爲5的矩形窗口平滑以後的結果。

* | select ts_smooth_fir( stamp, val, 'rectangle', 5, 1, 'avg') limit 1000

爲了讓你們有對比的看清楚平滑的效果,上圖中兩條曲線是畫在不一樣的Y軸座標系下的。先將兩條曲線繪製在同一個Y軸下面,計算對應的點的殘差序列,能夠較好的找到異常的點。以下圖中的紅色圓圈標記出來的結果。

閾值檢測

  • 爲了不單點抖動產生的誤報,須要將求取累積的窗口均值進行閾值判別

  • 具體的累積就是經過窗口進行操做

ˆx(t)=xt+xt1+...+xtw+1w

  • 同時業務同窗能夠根據本身的接受範圍對閾值進行分級設置,不一樣的閾值對應不一樣的操做

KSigma異常檢測

假設數據集由一個正太分佈產生,該分佈能夠用 N(μ,σ)表示,其中μ是序列的均值,σ是序列的標準差,數據落在(μ3σ,μ+3σ)以外的機率僅有0.27%,落在(μ4σ,μ+4σ)以外的區域的機率僅有0.01%,能夠根據對業務的理解和時序曲線,找到合適的K值用來做爲不一樣級別的異常報警。

分位數(Box Plot)異常檢測

箱型圖,是一種用做顯示一組數據分散狀況資料的統計圖。主要用於反映原始數據分佈的特徵,還能夠進行多組數據分佈特徵的比較,其繪製方法是:先找出一組數據的最大值、最小值、中位數和上下兩個四分位數。經過不一樣分位數來劃分異常值和疑似異常值。


平臺實驗結果

* | select ts_predicate_simple(stamp, val, 6, 1, 'avg') from log limit 500
* | select ts_predicate_arma(stamp, val, 5, 2, 6, 1, 'avg') from log limit 500


基於統計的異常檢測

變點的描述


使用數學的方法描述上述情況,給定時序數據,z1,z2,...,zn,若是τ,使得z1,z2,...,zτ在某統計特性上區別於zτ+1,zτ+2,...,zn,則τ就是咱們須要尋找的Change Ponit。

  • 以均值爲統計特性,去分析存在變點的條件:

zt={μ1if1tτ1μ2ifτ2<≤τ2......μk+1ifτk<tτk+1=n

1. 查找單個變點的模型

假設,時間序列的分佈遵循以下模型:

Zt|θtN(θt,1)

其中,θt可使用一個分段函數進行描述,設計相關的算法找到分段函數的分段點。咱們使用以下模型進行求解:

LR=maxτ{l(z1:τ)+l(zτ+1:n)l(z1:n)}

給定一個懲罰係數,當LR>λ時,去求取以下參數:

τ=argmax{l(z1:τ)+l(zτ+1:n)l(z1:n)}

2. 查找多個變點的模型

假設,時序數據中存在多個變點,這裏假設爲k個,τ=(τ0,τ1,...,τk+1),這裏τ0=0τk+1=n,能夠獲得以下定義:

mink,τk+1i=1[l(zτi1:τi)]+λf(k)

針對上述問題,其解空間巨大:

  • 對於含有N個點的時序數據,存在2N1中可能性

  • 若k是已知的,這組合的空間也是巨大的Ck1n1

經常使用的方法

局部峯值點檢測策略

針對上述流程圖的說明:

  • 務必確保濾波以後的序列是平滑的,由於一階差分對噪聲數據很敏感,若噪聲未能很好的過濾掉,會產生太多的候選點,影響查找效率

  • 尋找局部峯值點

  • 均值漂移策略:須要肯定窗口的大小,具體的計算公式以下所示:

ˆx(t)=xt+xt1+...+xtw+1xtw+xtw1+...+xt2w+1

EDM(E-Divisive with Medians)

EDM算法是由Twitter在2014年提出來,具體細節介紹請見論文《Leveraging Cloud Data to Mitigate User Experience from ‘Breaking Bad’》。這裏僅僅簡單的描述下該算法的特色和原理。

  • 算法特色

    • EDM使用E-statstics統計方法來檢測平均值的差別,一般,EDM算法也能夠用於檢測給定時間序列中的分佈的變化狀況。

    • EDM使用較爲魯棒的統計指標,並經過組合測試的方法進行顯著性的檢驗。

    • EDM算法是非參數的,不少雲端數據並不遵循簡單意義上的正太分佈,具備較好的適用性。

  • 算法原理

    • if forwardMove = 1 then

    • end

    • else

    • end

    • forwardMove = 1 - forwardMove

    • Perform ForwardUpdate

    • Perform BackwardUpdate

    • for 1jσdo

    • end

    • Insert |ZiZj+σ|to TAB

    • for i+1jσdo

    • end

    • Insert |ZiZj|to TA

    • Insert |Zi+σZj+σ|to TB

    • Parameters: Z,σ,D

    • Let TA,TB,TABbe interval trees with 2Dleaf nodes

    • // Initialize within distance trees

    • for iiσdo

    • end

    • // Initialize between distance tree

    • for 1iσdo

    • end

    • =approxmedian

    • bestStat=τ(kτ)k(2m1m2m3)

    • bestLoc=σ

    • τ=σ

    • forwardMove = 0

    • // Update trees

    • while τnσdo

    • end

    • return bestLoc

  • 其中關於BackwardUpdate和ForwardUpdate等具體操做請詳見論文

  • 涉及具體參數的選擇等問題論文中有簡單的說明,並經過實驗不斷調試理解

PELT(Pruned Exact Linear Time)

PELT算法是優化有了由Yao和Jackson提出的最優劃分方法(The Optimal Partitioning Method),該方法的目標是最小化以下目標:

m+1i=1[C(y(τi1+1):τi)+β)]

F(s)等於上式,對於y1:s序列中,存在Γs={τ:0=τ0<τ1<τ1<...<τm<τm+1=s}是待檢測出來的變點集合,令F(0)=β,能夠獲得以下的表達式:

F(s)=minτΓs{m+1i=1[C(y(τi1+1:τi))+β]}

F(s)=mint{minτΓtmi=1[C(y(τi1+1):τi)+β+C(y(t+1):n)+β}

F(s)=mint{F(t)+C(y(t+1):n)+β}

  • 根據上述公式推導,獲得以下的算法描述(Optimal Partitioning)




    • Let n=length of data and set F(0)=βcp(0)=NULL

    • A set of data of the form, (y1,y2,...,yn)where yiR

    • A measure of fit C(.)dependent on the data

    • A penalty constant βwhich does not depend on the number or location of changepoints

    • Input

    • Initialise:

    • Interate for τ=1,2,...,n

    • Output the change points recorded in cp(n)

    1. Calculate F(τ)=min0τ<τ[F(τ)+C(y(τ+1):τ)+β]

    2. Let τ=arg{min0τ<τ[F(τ)+C(y(τ+1):τ)+β]}

    3. Set cp(τ)=(cp(τ,τ))

  • PELT是將上述算法修改稱線性時間,其中設計到一些推論證實,具體的請參照論文《Optimal detection of changepoints with a linear computational cost》


折點描述

在物理學中,折點是不可導點,這代表該店沒有切線,因此也不會有速度,在到折點以前,一定要通過一個減速階段,將速度變成零,而後在向另外一個方向加速。

在時序描述中,要發現數據中的尖刺點,同時也要發現時序中的斷層點(或者解釋成突增、突降點檢測)。

1. 峯值分位數檢測

將原始時序數據x(t)通過平滑後,求序列的一階差分序列xdiff(t),利用以下方法尋找異常值:

  • 使用KSigma方法找到時序中的異常點

  • 使用Quantile方法找到時序中的峯值點

2. 均值漂移檢測

給定檢測窗口長度w,經過下式能夠計算t{2w,N}以前每一個點的均值漂移值。

r(t)=xt+xt1+...+xtw+1xtw+xtw1+...+xt2w+1

根據檢測出來r(t)值,利用KSigma異常檢測方法,能夠較好的獲得時序中的斷層點信息。


平臺實驗結果
  • 調用命令

* | select ts_cp_detect(stamp, val, 1.0, 1, 'avg') limit 500
* | select ts_breakout_detect(stamp, val, 5, 1, 'avg') limit 500

硬廣時間

日誌進階

阿里雲日誌服務針對日誌提供了完整的解決方案,如下相關功能是日誌進階的必備良藥:

  1. 機器學習語法與函數: https://help.aliyun.com/document_detail/93024.html

  2. 日誌上下文查詢:https://help.aliyun.com/document_detail/48148.html

  3. 快速查詢:https://help.aliyun.com/document_detail/88985.html

  4. 實時分析:https://help.aliyun.com/document_detail/53608.html

  5. 快速分析:https://help.aliyun.com/document_detail/66275.html

  6. 基於日誌設置告警:https://help.aliyun.com/document_detail/48162.html

  7. 配置大盤:https://help.aliyun.com/document_detail/69313.html

更多日誌進階內容能夠參考:日誌服務學習路徑。


聯繫咱們

糾錯或者幫助文檔以及最佳實踐貢獻,請聯繫:悟冥
問題諮詢請加釘釘羣:



參考文獻

  1. Leveraging Cloud Data to Mitigate User Experience from ‘Breaking Bad’

  2. An Algorithm for Optimal Partitioning of Data on an Interval

  3. Optimal detection of changepoints with a linear computational cost

  4. Introduction to optimal changepoint detection algorithms

  5. Survey of Peaks/Valleys identification in Time Series

  6. Box Plot: Display of Distribution

  7. 箱形圖

【雲棲快訊】阿里巴巴小程序繁星計劃,20億補貼第一彈雲應用當即開通購買,限量從速!  

詳情請點擊


本文分享自微信公衆號 - SQL數據分析(dianwu_dw)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索