series_decompose_anomalies()

異常偵測是以序列分解為基礎。 如需詳細資訊,請參閱 series_decompose()

此函數會採用包含序列 (動態數值陣列) 的運算式作為輸入,並使用分數來擷取異常點。

語法

series_decompose_anomalies (系列,[ 臨界值,季節性,趨勢,, Test_pointsAD_method,Seasonality_threshold ])

深入瞭解 語法慣例

參數

名稱 類型 必要 Description
數列 dynamic ✔️ 數值的陣列,通常是 make-seriesmake_list 運算子所產生的輸出。
閾值 real 異常臨界值。 默認值為 1.5 k 值,用於偵測異常或更強的異常。
季節性 int 控制季節性分析。 可能的值包括:

- -1:使用 series_periods_detect自動偵測季節性。 這是預設值。
- 整數時間週期:正整數,指定間隔數目的預期期間。例如,如果數列位於 1h 量化中,則每周期間為168個間隔。
- 0:沒有季節性,因此請略過擷取此元件。
趨勢 string 控制趨勢分析。 可能的值包括:

- avg:將趨勢元件 average(x)定義為 。 此為預設值。
- linefit:使用線性回歸擷取趨勢元件。
- none:沒有趨勢,因此請略過擷取此元件。
Test_points int 正整數,指定要從學習或回歸程式排除之數列結尾的點數。 此參數應針對預測用途進行設定。 預設值為 0。
AD_method string 控制剩餘時間序列上的異常偵測方法,其中包含下列其中一個值:

- ctukey:具有自定義 10-90 個百分位數範圍的 Tukey 柵欄測試 。 此為預設值。
- tukey:具有標準 25-75 百分位數範圍的 Tukey 柵欄測試

如需剩餘時間序列的詳細資訊,請參閱 series_outliers
Seasonality_threshold real 當季節性設定為自動偵測時, 季節性 分數的臨界值。 默認分數閾值為 0.6。

如需詳細資訊,請參閱 series_periods_detect

傳回

函數會傳回下列個別序列:

  • ad_flag:三元系列,包含分別標示向上/向下/無異常的 (+1, -1, 0)
  • ad_score:異常分數
  • baseline:根據分解的序列預測值

演算法

此函數會遵循下列步驟:

  1. 使用各自的參數呼叫 series_decompose(),以建立基準和殘差序列。
  2. 在殘差序列上套用具有所選擇異常偵測方法的 series_outliers(),以計算 ad_score 系列。
  3. 在 ad_score 上套用閾值來計算 ad_flag 系列,以分別標示向上/向下/無異常。

範例

偵測每週季節性的異常

在下列範例中,會產生包含每週季節性的序列,然後在其中新增一些極端值。 series_decompose_anomalies 自動偵測季節性,並產生可擷取重複模式的基準。 您已新增的極端值可以清楚地在 ad_score 元件中找到。

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 10.0, 15.0) - (((t%24)/10)*((t%24)/10)) // generate a series with weekly seasonality
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y)
| render timechart  

每周季節性,顯示基準和極端值。

使用趨勢偵測每週季節性異常

在此範例中,會將趨勢新增至上述範例的序列中。 首先,使用預設參數來執行 series_decompose_anomalies,其中趨勢 avg 預設值只會採用平均值,而不會計算趨勢。 與上一個範例相較之下,產生的基準未包含趨勢,而且較不精確。 因此,因為變異數較高,所以偵測不到您在資料中插入的某些極端值。

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y)
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart

具有趨勢的每周季節性極端值。

接下來,執行相同的範例,但因為您預期序列中會有趨勢,所以請在 trend 參數中指定 linefit。 您可以看到基準較接近輸入序列。 會偵測到所有插入的極端值,還會有一些誤判為真。 請參閱下一個調整閾值的範例。

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y, 1.5, -1, 'linefit')
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart  

具有折線趨勢的每周季節性異常。

調整異常偵測閾值

在上一個範例中,將一些噪點偵測為異常。 現在,請將異常偵測閾值從預設值 1.5 增加至 2.5。 使用此四分位數範圍,只偵測較強的異常。 現在,只會偵測到您在資料中插入的極端值。

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and onlgoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y, 2.5, -1, 'linefit')
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart  

具有較高異常閾值的每周數列異常。