異常偵測和預測

雲端服務和IoT裝置會產生遙測數據,可用來取得見解,例如監視服務健康情況、實體生產程式和使用量趨勢。 相較於一般基準模式,執行時間序列分析是識別這些計量模式模式中偏差的一種方式。

Kusto 查詢語言 (KQL) 包含建立、操作和分析多個時間序列的原生支援。 透過 KQL,您可以建立和分析數千個時間序列,以秒為單位,啟用近乎即時的監視解決方案和工作流程。

本文詳細說明 KQL 的時間序列異常偵測和預測功能。 適用的時間序列函式是以強固的已知分解模型為基礎,其中每個原始時間序列都會分解成季節性、趨勢和剩餘元件。 異常是由剩餘元件的極端值所偵測,而預測則是藉由推斷季節性和趨勢元件來完成。 KQL 實作藉由自動季節性偵測、強固的極端值分析和向量化實作,大幅增強基本分解模型,以在幾秒內處理數千個時間序列。

必要條件

  • Microsoft 帳戶或 Microsoft Entra 使用者身分識別。 不需要 Azure 訂用帳戶。
  • 如需時間序列功能的概觀,請閱讀 時間序列分析

時間序列分解模型

時間序列預測和異常偵測的 KQL 原生實作會使用已知的分解模型。 此模型會套用至預期要顯示定期和趨勢行為的計量時間序列,例如服務流量、元件活動訊號和IoT定期測量,以預測未來的計量值並偵測異常計量值。 此回歸程式的假設是,除了先前已知的季節性和趨勢行為之外,時間序列會隨機分佈。 然後,您可以從季節性和趨勢元件預測未來的計量值,統稱為基準,並忽略剩餘部分。 您也可以只使用剩餘部分,根據極端值分析來偵測異常值。 若要建立分解模型,請使用 函式 series_decompose()。 函 series_decompose() 式會採用一組時間序列,並自動將每個時間序列分解為其季節性、趨勢、殘差和基準元件。

例如,您可以使用下列查詢來分解內部 Web 服務的流量:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t step dt by sid 
| where sid == 'TS1'   //  select a single time series for a cleaner visualization
| extend (baseline, seasonal, trend, residual) = series_decompose(num, -1, 'linefit')  //  decomposition of a set of time series to seasonal, trend, residual, and baseline (seasonal+trend)
| render timechart with(title='Web app. traffic of a month, decomposition', ysplit=panels)

時間序列分解。

  • 原始時間序列標示為 紅色) (。
  • 此程式一開始會使用 series_periods_detect() 函式自動偵測季節性,並以紫色) 擷取 季節性 模式 (。
  • 季節性模式會從原始時間序列減去,並使用 函 series_fit_line() 式執行線性回歸,以淺藍色) 尋找 趨勢 元件 (。
  • 函式會減去趨勢,其餘部分是綠色) 的剩餘 元件 (。
  • 最後,函式會新增季節性和趨勢元件,以藍色) 產生 基準 (。

時間序列異常偵測

函式 series_decompose_anomalies() 會尋找一組時間序列上的異常點。 此函式會呼叫 series_decompose() 來建置分解模型,然後在剩餘元件上執行 series_outliers()series_outliers() 使用 Tukey 的柵欄測試,計算剩餘元件每個點的異常分數。 高於1.5或低於 -1.5的異常分數分別表示異常增加或下降。 高於 3.0 或低於 -3.0 的異常分數表示強式異常。

下列查詢可讓您偵測內部 Web 服務流量中的異常狀況:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t step dt by sid 
| where sid == 'TS1'   //  select a single time series for a cleaner visualization
| extend (anomalies, score, baseline) = series_decompose_anomalies(num, 1.5, -1, 'linefit')
| render anomalychart with(anomalycolumns=anomalies, title='Web app. traffic of a month, anomalies') //use "| render anomalychart with anomalycolumns=anomalies" to render the anomalies as bold points on the series charts.

時間序列異常偵測。

  • 紅色) 的原始時間序列 (。
  • 藍色) 的基準 (季節性 + 趨勢) 元件 (。
  • 原始時間序列頂端的紫色) 異常點 (。 異常點明顯偏離預期的基準值。

時間序列預測

函式 series_decompose_forecast() 會預測一組時間序列的未來值。 此函式會呼叫 series_decompose() 來建置分解模型,然後針對每個時間序列,將基準元件推斷到未來。

下列查詢可讓您預測下周的 Web 服務流量:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
let horizon=7d;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t+horizon step dt by sid 
| where sid == 'TS1'   //  select a single time series for a cleaner visualization
| extend forecast = series_decompose_forecast(num, toint(horizon/dt))
| render timechart with(title='Web app. traffic of a month, forecasting the next week by Time Series Decomposition')

時間序列預測。

  • 紅色) 的原始計量 (。 根據預設,未來值遺失並設定為0。
  • 以藍色) 推斷基準元件 (,以預測下一周的值。

可擴縮性

Kusto 查詢語言語法可讓單一呼叫處理多個時間序列。 其獨特的優化實作允許快速效能,這對於在近乎即時的案例中監視數千個計數器時的有效異常偵測和預測而言非常重要。

下列查詢顯示同時處理三個時間序列:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
let horizon=7d;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t+horizon step dt by sid
| extend offset=case(sid=='TS3', 4000000, sid=='TS2', 2000000, 0)   //  add artificial offset for easy visualization of multiple time series
| extend num=series_add(num, offset)
| extend forecast = series_decompose_forecast(num, toint(horizon/dt))
| render timechart with(title='Web app. traffic of a month, forecasting the next week for 3 time series')

時間序列延展性。

摘要

本文件詳細說明時間序列異常偵測和預測的原生 KQL 函式。 每個原始時間序列都會分解成季節性、趨勢和剩餘元件,以偵測異常和/或預測。 這些功能可用於近乎即時的監視案例,例如錯誤偵測、預測性維護,以及需求和負載預測。