series_decompose_anomalies()
適用対象: ✅Microsoft Fabric✅Azure データ エクスプローラー✅Azure Monitor✅Microsoft Sentinel
異常検出は、系列分解に基づいて行われます。 詳細については、series_decompose() を参照してください。
この関数は、系列 (動的な数値配列) を含む式を入力として受け取り、スコアを使用して異常なポイントを抽出します。
構文
series_decompose_anomalies (
Series,
[ Threshold,
Seasonality,
Trend,
Test_points,
AD_method,
Seasonality_threshold ])
構文規則について詳しく知る。
パラメーター
件名 | タイプ | Required | 説明 |
---|---|---|---|
系列 | 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 |
Seasonalityが自動検出に設定されている場合の季節性スコアのしきい値。 既定のスコアしきい値は 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
次に、同じ例を実行します。ただし、系列での傾向を期待しているため、傾向パラメーターには 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