共用方式為


series_decompose_anomalies()

適用於:✅Microsoft網狀架構Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel

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

函式會採用包含數列(動態數值數位)的表達式作為輸入,並擷取具有分數的異常點。

語法

series_decompose_anomalies (數列, [ 臨界,,季節性趨勢,Test_points AD_method,, Seasonality_threshold ])

深入瞭解 語法慣例

參數

姓名 類型​​ 必要 描述
系列 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 控制剩餘時間序列上的異常偵測方法,其中包含下列其中一個值:

- ctukeyTukey 的圍欄測試 與自定義第 10-90 個百分位數範圍。 這是預設值。
- tukeyTukey 的圍欄測試 與標準 25-75 百分位數範圍。

如需剩餘時間序列的詳細資訊,請參閱 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  

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