series_decompose_anomalies()
適用於:✅Microsoft網狀架構✅Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel
異常偵測是以數列分解為基礎。 如需詳細資訊,請參閱 series_decompose()。
函式會採用包含數列(動態數值數位)的表達式作為輸入,並擷取具有分數的異常點。
語法
series_decompose_anomalies (
數列,
[ 臨界,
值,
季節性趨勢,
Test_points AD_method,
,
Seasonality_threshold ])
深入瞭解 語法慣例。
參數
姓名 | 類型 | 必要 | 描述 |
---|---|---|---|
系列 | dynamic |
✔️ | 數值陣列,通常是make-series或 make_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 : Tukey 的圍欄測試 與自定義第 10-90 個百分位數範圍。 這是預設值。- tukey : Tukey 的圍欄測試 與標準 25-75 百分位數範圍。如需剩餘時間序列的詳細資訊,請參閱 series_outliers。 |
|
Seasonality_threshold | real |
當季節性設定為自動偵測時 ,季節性 分數的臨界值。 默認分數閾值為 0.6。 如需詳細資訊,請參閱 series_periods_detect。 |
傳回
函式會傳回下列個別數列:
ad_flag
:包含 (+1, -1, 0) 的三元數列,分別標示向上/向下/無異常ad_score
:異常分數baseline
:根據分解,數列的預測值
演算法
此函式會遵循下列步驟:
- 呼叫 具有個別參數的 series_decompose() ,以建立基準和殘差數列。
- 透過在殘差數列上套用 series_outliers() 與所選異常偵測方法,以計算ad_score數列。
- 藉由在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