series_decompose_anomalies()

Deteksi Anomali didasarkan pada dekomposisi seri. Untuk informasi selengkapnya, lihat series_decompose().

Fungsi ini mengambil ekspresi yang berisi seri (array numerik dinamis) sebagai input, dan mengekstrak titik anomali dengan skor.

Sintaks

series_decompose_anomalies (Seri, [ Ambang batas,Musiman,Tren,, Test_points, AD_methodSeasonality_threshold ])

Pelajari selengkapnya tentang konvensi sintaksis.

Parameter

Nama Jenis Diperlukan Deskripsi
Seri dynamic ✔️ Array nilai numerik, biasanya output yang dihasilkan dari operator make-series atau make_list .
Ambang real Ambang anomali. Defaultnya adalah 1,5, nilai k, untuk mendeteksi anomali ringan atau lebih kuat.
Musiman int Mengontrol analisis musiman. Nilai yang mungkin adalah:

- -1: Musiman otomatis terdeteksi menggunakan series_periods_detect. Ini adalah nilai default.
- Periode waktu bilangan bulat: Bilangan bulat positif yang menentukan periode yang diharapkan dalam jumlah bin. Misalnya, jika seri berada dalam 1h bin, periode mingguan adalah 168 bin.
- 0: Tidak ada musiman, jadi lewati mengekstrak komponen ini.
Tren string Mengontrol analisis tren. Nilai yang mungkin adalah:

- avg: Tentukan komponen tren sebagai average(x). Ini adalah default.
- linefit: Ekstrak komponen tren menggunakan regresi linier.
- none: Tidak ada tren, jadi lewati mengekstrak komponen ini.
Test_points int Bilangan bulat positif yang menentukan jumlah titik di akhir seri untuk dikecualikan dari proses pembelajaran, atau regresi. Parameter ini harus ditetapkan untuk tujuan prakiraan. Nilai default adalah 0.
AD_method string Mengontrol metode deteksi anomali pada rangkaian waktu residu, yang berisi salah satu nilai berikut:

- ctukey: Uji pagar Tukey dengan rentang persentil ke-10-90 kustom. Ini adalah default.
- tukey: Uji pagar Tukey dengan rentang persentil standar ke-25-75.

Untuk informasi selengkapnya tentang rangkaian waktu residual, lihat series_outliers.
Seasonality_threshold real Ambang batas untuk skor musiman saat Musiman diatur ke autodetect. Ambang skor default adalah 0,6.

Untuk informasi selengkapnya, lihat series_periods_detect.

Mengembalikan

Fungsi ini mengembalikan format berikut:

  • ad_flag: Seri ternar yang berisi (+1, -1, 0) menandai atas/bawah/tidak ada anomali masing-masing
  • ad_score: Skor anomali
  • baseline: Nilai yang diprediksi dari seri, menurut dekomposisi

Algoritme

Fungsi ini mengikuti langkah-langkah berikut:

  1. Panggilan series_decompose() dengan parameter masing-masing, untuk membuat seri garis besar dan residual.
  2. Menghitung seri ad_score dengan menerapkan series_outliers() dengan metode deteksi anomali yang dipilih pada seri residu.
  3. Menghitung seri ad_flag dengan menerapkan ambang batas pada ad_score untuk menandai atas/turun/tidak ada anomali masing-masing.

Contoh

Mendeteksi anomali dalam musim mingguan

Dalam contoh berikut, buat seri dengan musiman mingguan, lalu tambahkan beberapa outlier ke dalamnya. series_decompose_anomalies mendeteksi otomatis musim dan menghasilkan garis dasar yang menangkap pola berulang. Outlier yang Anda tambahkan dapat terlihat jelas di komponen 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  

Musiman mingguan menunjukkan garis besar dan outlier.

Mendeteksi anomali dalam musim mingguan dengan tren

Dalam contoh ini, tambahkan tren ke seri dari contoh sebelumnya. Pertama, jalankan series_decompose_anomalies dengan parameter default yang mana nilai default avg tren hanya mengambil rata-rata dan tidak menghitung tren. Garis besar yang dihasilkan tidak berisi tren dan kurang tepat, dibandingkan dengan contoh sebelumnya. Akibatnya, beberapa outlier yang Anda masukkan ke dalam data tidak terdeteksi karena varians yang lebih tinggi.

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

Outlier musiman mingguan dengan tren.

Selanjutnya, jalankan contoh yang sama, tetapi karena Anda mengharapkan tren dalam seri, tentukan linefit dalam parameter tren. Anda dapat melihat bahwa garis besar jauh lebih dekat dengan seri input. Semua outlier yang dimasukkan terdeteksi, dan juga beberapa positif palsu. Lihat contoh berikutnya tentang mengutak-atik ambang batas.

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  

Anomali musiman mingguan dengan tren linefit.

Mengutak-atik ambang deteksi anomali

Beberapa titik bising terdeteksi sebagai anomali dalam contoh sebelumnya. Sekarang tingkatkan ambang deteksi anomali dari default 1,5 menjadi 2,5. Gunakan rentang interpersentil ini, sehingga hanya anomali yang lebih kuat yang terdeteksi. Sekarang, hanya outlier yang Anda masukkan ke dalam data, yang akan terdeteksi.

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  

Anomali seri mingguan dengan ambang anomali yang lebih tinggi.