本文包含的內容:什么是時間序列和時間序列分解模型?如何做時序異常檢測、時序預測和根因分析?為什么需要AMA?
異常檢測是在數據中發現與預期行為不符的模式。對於決策者而言,在檢測到異常時采取必要的積極行動可以避免和減少損失。異常檢測在許多行業中發揮着至關重要的作用,例如金融行業的欺詐檢測、醫院的健康監控、制造業、能源電力、運輸、航空和汽車行業的故障檢測和操作環境監控 、IT環境的智能運維(AIOps)、商業企業運營指標監控等。
什么是時間序列(Time Series)?時間序列是按時間順序索引的一系列數據點。
什么是時間序列分解模型(Decomposition of additive time series)?時間序列分解模型將時間序列分成多個組件的任務,將觀察結果分為趨勢部分、周期/季節部分和隨機殘差部分。時間序列異常檢測則是基於分解模型,識別與大多數數據集明顯不同的觀察結果的過程。如圖,紅線是原始時間序列,藍線是基准線(周期+趨勢)組成部分,紫色點是原始時間序列之上的異常點。
微軟雲Azure提供多種異常檢測方案,其中Azure Stream Analytics(ASA)或Azure Data Explorer(ADX)可以用於實時分析和檢測。ASA適用於連續或流數據實時分析。ADX適用於按需或交互式的近實時分析,可以對大量流數據進行數據探索、周期性分解,即席分析、儀表板以及從近實時到歷史數據的根本原因分析。與異常檢測相關的功能如下:
- ADX提供了基於時間序列分解模型的函數進行時序數據預測,預測對於預防性維護、資源計划等情況很有用
- ADX提供自動檢測時序季節/周期的功能,可以自動檢測時序中的周期時間段,或者用於驗證指標的周期時間段
- ADX提供分解功能,自動將每個時間序列分解為季節,趨勢,殘差和基線部分
- ADX提供異常檢測功能,基於增強周期性分解模型檢測尖峰(Spike)和低谷(Dip),基於分段線性回歸檢測水平轉化或趨勢變化的變化點(change point)
- ADX提供2個通用篩選函數,有限脈沖響應(FIR)篩選器用於計算時序的移動平均值、差異;無限脈沖響應(IIR)篩選器用於指數平滑與累計求和
- ADX異常檢測分析可以找到一組時序上的異常點,並對異常進行根因分析(RCA)
下面以ADX為例,簡要說明時間序列分解模型、異常檢測、時序預測和根因分析的大概過程,具體函數及其參數請參考文檔。
1. 時間序列分解模型
時間序列分解模型在時序數據處理領域眾所周知,ADX基於時序分解模型實現了時序預測和異常檢測。我們使用函數series_decompose()函數來創建分解模型。下面以一個Web服務流量為例,將其觀察結果分解為趨勢、季節和隨機殘差和基准線部分。
如圖所示,我們可以通過不同顏色看到各個部分。
o 紅色線:原始觀測數據
o 藍色線:基准線部分(季節+趨勢)
o 青色線:季節/周期
o 褐色線:趨勢
o 深藍色線:隨機殘差
2. 時間序列異常檢測
使用函數series_decompose_anomalies()可以查找一組時間序列上的異常點。 檢測過程主要分兩步,首先調用series_decompose()構建分解模型,然后在隨機殘差部分上運行series_outliers()函數使用Tukey隔離測試算法計算殘余部分每個點的異常分數,高於異常閾值默認為1.5(可調)或低於-1.5表示輕微異常上升或下降, 高於3.0或低於-3.0則表示嚴重異常。
同樣,我們可以通過不同顏色更清晰的看到每一部分,這里只插入了異常數據點和異常分數部分,其它請參看時序分解模型部分。從上面綜合疊加圖上可以看到觀測數據中異常點與基准線的差距,其差距大小即異常嚴重程度強弱,也反映在了下面對應的異常分數圖中。
- 異常數據點
- 異常分數
3. 時序預測
如何預測一組時間序列下一個時間周期中的值或走勢?可以調用series_decompose_forecast()函數進行預測,過程分2步,首先調用series_decompose()構建分解模型,然后針對每個時序,將其基線分量外推到要預測的將來時間段。下面語句預測下一周的Web服務流量,其中紅色為實際觀測數據,藍色為基准線和預測結果。
4. 根因分析
檢測出時間序列異常數據點之后,需要進行進一步診斷分析,才可以發現異常的業務活動,並及時緩解或解決異常問題。診斷過程通常比較復雜和耗時,也需要業務領域專家花較多精力進行分析。
ADX中的機器學習插件,可以簡化診斷操作並縮短發現根本原因的時間。ADX提供3個機器學習插件,autocluster、basket和diffpatterns。三個插件實現的都是聚類算法,autocluster、basket對單一記錄集進行聚類,diffpatterns對兩個記錄集合的差進行聚類,下面舉例說明。
本示例使用的是一周服務異常日志數據,包含時間戳以及區域、縮放單元、部署ID、追蹤點、服務主機等維度。
使用下面KQL腳本進行異常檢測。KQL首先將數據按照10分鍾間隔序列化,計算出每間隔異常數量。然后調用series_decompose_anomalies()函數進行異常檢測,並使用anomalychart()函數進行可視化。通過觀察異常圖表,可以清楚地發現工作日及周末每日的模式。工作日午間左右服務數量增加,晚間服務數量下降,周末數量持續低平。尖峰數據點分布在周一下午、周二下午、周四和周五的下午。
以星期二下午出現的第二個高峰為例,用下面查詢進一步診斷和驗證它是否是尖峰異常。我們用更高的分辨率圍繞峰值繪制圖表,以便研究它的邊界。
從 15:00 到 15:02 出現了兩分鍾尖峰。 使用以下KQL查詢統計出此兩分鍾時段內的異常數為972,並查看20個產生尖峰的樣本數據。
定位出現異常的服務,行業專家可以很快着手去解決問題。如何定位異常是由哪些服務產生?故障數占比情況如何?此處可以采用 autocluster() 或basket()機器學習插件,二者都是用非監督學習聚類算法進行多維挖掘,autocluster()采用的是自研專有算法,basket()使用了經典的Apriori算法。
從autocluster()聚類的結果可以發現,細分片段0 (SegmentId=0)貢獻了異常記錄總數的65.74%,共享4個維度。后面的細分片段(Segment)占比都相對較少。業務專家可以根據此分析結果,推斷細分片段Segment 0對應的服務是導致尖峰異常的原因。
使用basket()函數步驟和結果類似,此處不贅述。
autocluster() 或basket()機器學習插件是單一數據集聚類分析。單一數據集聚類的局限性在於它是無監督學習,即在沒有標簽的情況下對單個記錄集進行的聚類,因此提取出的模式並不清楚選取的記錄是異常記錄還是全局記錄。
diffpattern() 機器學習插件采用監督學習算法,它突破了此限制。diffpattern()采用兩個記錄集,並從中提取兩個不同的細分片段(Segment)。通常一組包含異常的記錄集,另外一組是參考記錄集,即基准線。兩個記錄集根據時間戳被分別標注為“異常Anomaly”和“基准線Baseline”。
調用diffpattern()可以找到了造成異常的主要細分片段,你會發現這個結果和austocluster()的結果一樣。這個segment在2分鍾的異常區間數量占了65.74%,而在8分鍾的基准線中只占了1.7%,差了64.04%,看上去這和異常尖峰有關。下面一步進行驗證。
從上面這張圖可以看到,星期二下午的高峰正是diffpatterns() 插件所發現的細分分段所導致。
總結:
至此,我們了解了時間序列、時間序列分解模型、時序異常檢測、時序預測和時序異常根因分析等。
您會發現,對業務專家來說,多維時序異常的根因分析復雜而耗時。有沒有一套端到端AI方案自動處理這樣繁重和重復的工作,讓業務專家無需花很長時間和精力進行時序異常診斷,而只需要關注解決業務問題,加快價值實現速度? 答案:Azure Metrics Advisor (AMA)。
下一篇將走進AMA,敬請關注。