Saya bekerja dengan sejumlah besar deret waktu. Rangkaian waktu ini pada dasarnya adalah pengukuran jaringan yang datang setiap 10 menit, dan beberapa di antaranya periodik (yaitu bandwidth), sementara beberapa lainnya tidak (yaitu jumlah lalu lintas perutean).
Saya ingin algoritma sederhana untuk melakukan "deteksi outlier" online. Pada dasarnya, saya ingin menyimpan dalam memori (atau pada disk) seluruh data historis untuk setiap seri waktu, dan saya ingin mendeteksi setiap pencilan dalam skenario langsung (setiap kali sampel baru diambil). Apa cara terbaik untuk mencapai hasil ini?
Saat ini saya menggunakan moving average untuk menghilangkan beberapa noise, tapi lalu bagaimana selanjutnya? Hal-hal sederhana seperti standar deviasi, mad, ... terhadap seluruh kumpulan data tidak berfungsi dengan baik (saya tidak dapat menganggap deret waktu stasioner), dan saya ingin sesuatu yang lebih "akurat", idealnya kotak hitam seperti:
double outlier_detection (double * vector, double value);
di mana vektor adalah array ganda yang berisi data historis, dan nilai kembali adalah skor anomali untuk "nilai" sampel baru.
Jawaban:
Berikut adalah fungsi R sederhana yang akan menemukan outlier deret waktu (dan secara opsional menunjukkannya dalam plot). Ini akan menangani seri waktu musiman dan non-musiman. Ide dasarnya adalah untuk menemukan perkiraan yang kuat dari tren dan komponen musiman dan kurangi. Kemudian cari outlier di residu. Tes untuk outlier residual adalah sama seperti untuk boxplot standar - poin lebih besar dari 1,5IQR di atas atau di bawah kuartil atas dan bawah diasumsikan outlier. Jumlah IQR di atas / di bawah ambang ini dikembalikan sebagai "skor" outlier. Jadi skornya bisa berupa angka positif, dan akan menjadi nol untuk yang bukan pencilan.
Saya menyadari Anda tidak menerapkan ini dalam R, tetapi saya sering menemukan fungsi R tempat yang baik untuk memulai. Maka tugasnya adalah menerjemahkan ini ke bahasa apa pun yang diperlukan.
sumber
Solusi yang baik akan memiliki beberapa bahan, termasuk:
Gunakan jendela bergerak yang halus dan tahan untuk menghilangkan ketidakstabilan.
Nyatakan kembali data asli sehingga residu berkenaan dengan kelancaran kira-kira terdistribusi secara simetris. Mengingat sifat data Anda, kemungkinan akar kuadrat atau logaritma mereka akan memberikan residu simetris.
Menerapkan metode bagan kendali, atau setidaknya pemikiran bagan kendali, untuk residu.
Sejauh yang terakhir berjalan, pemikiran diagram kontrol menunjukkan bahwa ambang "konvensional" seperti 2 SD atau 1,5 kali IQR di luar kuartil bekerja buruk karena mereka memicu terlalu banyak sinyal palsu di luar kendali. Orang biasanya menggunakan 3 SD dalam pekerjaan diagram kontrol, di mana 2,5 (atau bahkan 3) kali IQR di luar kuartil akan menjadi titik awal yang baik.
Saya kurang lebih telah menguraikan sifat dari solusi Rob Hyndman sambil menambahkan dua poin utama: potensi kebutuhan untuk mengekspresikan kembali data dan kebijaksanaan untuk menjadi lebih konservatif dalam memberi sinyal outlier. Saya tidak yakin bahwa Loess baik untuk detektor online, karena itu tidak berfungsi dengan baik di titik akhir. Sebagai gantinya, Anda mungkin menggunakan sesuatu yang sederhana seperti filter median bergerak (seperti pada smoothing tahan Tukey). Jika outlier tidak muncul secara berurutan, Anda dapat menggunakan jendela sempit (5 titik data, mungkin, yang akan terurai hanya dengan ledakan 3 atau lebih outlier dalam grup 5).
Setelah Anda melakukan analisis untuk menentukan ekspresi ulang data yang baik, Anda tidak perlu mengubah ekspresi ulang. Oleh karena itu, detektor online Anda benar-benar hanya perlu merujuk nilai terbaru (jendela terbaru) karena tidak akan menggunakan data sebelumnya sama sekali. Jika Anda memiliki rangkaian waktu yang sangat lama, Anda dapat melangkah lebih jauh untuk menganalisis autokorelasi dan musiman (seperti fluktuasi harian atau mingguan) untuk meningkatkan prosedur.
sumber
(Jawaban ini menanggapi pertanyaan rangkap (sekarang ditutup) di Mendeteksi peristiwa luar biasa , yang menyajikan beberapa data dalam bentuk grafis.)
Deteksi outlier tergantung pada sifat data dan pada apa yang Anda anggap tentang mereka. Metode tujuan umum mengandalkan statistik yang kuat. Semangat dari pendekatan ini adalah untuk mengkarakterisasi sebagian besar data dengan cara yang tidak dipengaruhi oleh outlier dan kemudian menunjuk pada nilai-nilai individual yang tidak sesuai dengan karakterisasi tersebut.
Karena ini adalah deret waktu, ini menambah komplikasi karena perlu (kembali) mendeteksi pencilan secara berkelanjutan. Jika ini harus dilakukan saat seri dibuka, maka kami hanya diizinkan menggunakan data yang lebih lama untuk pendeteksian, bukan data mendatang! Selain itu, sebagai perlindungan terhadap banyak pengujian berulang, kami ingin menggunakan metode yang memiliki tingkat positif palsu yang sangat rendah.
Pertimbangan ini menyarankan menjalankan tes outlier jendela sederhana, kuat bergerak atas data . Ada banyak kemungkinan, tetapi yang sederhana, mudah dipahami dan diimplementasikan dengan mudah didasarkan pada MAD yang sedang berjalan: median deviasi absolut dari median. Ini adalah ukuran variasi yang sangat kuat dalam data, mirip dengan standar deviasi. Puncak terpencil akan menjadi beberapa MAD atau lebih besar dari median.
R
Diterapkan ke dataset seperti kurva merah yang diilustrasikan dalam pertanyaan, ini menghasilkan hasil ini:
Data ditampilkan dalam warna merah, jendela 30 hari dari median + 5 * ambang batas MAD berwarna abu-abu, dan outlier - yang hanya berupa nilai data di atas kurva abu-abu - berwarna hitam.
(Ambang hanya dapat dihitung mulai dari akhir jendela awal. Untuk semua data di dalam jendela awal ini, ambang pertama digunakan: itu sebabnya kurva abu-abu datar antara x = 0 dan x = 30.)
Efek dari mengubah parameter adalah (a) meningkatkan nilai
window
akan cenderung memuluskan kurva abu-abu dan (b) meningkatkanthreshold
akan meningkatkan kurva abu-abu. Mengetahui hal ini, seseorang dapat mengambil segmen awal dari data dan dengan cepat mengidentifikasi nilai-nilai parameter yang paling baik memisahkan puncak-puncak terpencil dari sisa data. Terapkan nilai parameter ini untuk memeriksa sisa data. Jika plot menunjukkan metode semakin memburuk dari waktu ke waktu, itu berarti sifat data berubah dan parameter mungkin perlu disetel ulang.Perhatikan betapa sedikitnya metode ini mengasumsikan tentang data: mereka tidak harus didistribusikan secara normal; mereka tidak perlu menunjukkan periodisitas apa pun; mereka bahkan tidak harus non-negatif. Semua itu mengasumsikan bahwa data berperilaku dengan cara yang hampir sama dari waktu ke waktu dan bahwa puncak terpencil tampak lebih tinggi daripada sisa data.
Jika ada yang ingin bereksperimen (atau membandingkan beberapa solusi lain dengan yang ditawarkan di sini), berikut adalah kode yang saya gunakan untuk menghasilkan data seperti yang ditunjukkan dalam pertanyaan.
sumber
Jika Anda khawatir tentang asumsi dengan pendekatan tertentu, satu pendekatan adalah melatih sejumlah peserta didik pada sinyal yang berbeda, kemudian gunakan metode ensemble dan agregat atas "suara" dari peserta didik Anda untuk membuat klasifikasi outlier.
BTW, ini mungkin layak dibaca atau membaca sekilas karena referensi beberapa pendekatan untuk masalah ini.
sumber
Saya menduga model deret waktu yang canggih tidak akan bekerja untuk Anda karena waktu yang dibutuhkan untuk mendeteksi pencilan menggunakan metodologi ini. Oleh karena itu, berikut ini solusinya:
Pertama-tama tentukan pola lalu lintas 'normal' untuk satu tahun berdasarkan analisis manual dari data historis yang mencakup waktu, hari kerja vs akhir pekan, bulan tahun dll.
Gunakan baseline ini bersama dengan beberapa mekanisme sederhana (mis. Moving average yang disarankan oleh Carlos) untuk mendeteksi outlier.
Anda mungkin juga ingin meninjau literatur kontrol proses statistik untuk beberapa ide.
sumber
Menyesuaikan data secara musiman sehingga hari biasa terlihat lebih dekat dengan rata. Anda bisa mengambil sampel 17:00 hari ini dan mengurangi atau membagi rata-rata 30 hari sebelumnya pada pukul 17:00. Kemudian lihat melewati standar deviasi N (diukur dengan menggunakan data pra-sesuaikan) untuk pencilan. Ini bisa dilakukan secara terpisah untuk "musim" mingguan dan harian.
sumber
Alternatif untuk pendekatan yang digariskan oleh Rob Hyndman adalah menggunakan Holt-Winters Forecasting . Pita kepercayaan yang diturunkan dari Holt-Winters dapat digunakan untuk mendeteksi pencilan. Berikut adalah makalah yang menjelaskan cara menggunakan Holt-Winters untuk "Deteksi Perilaku Aberrant dalam Rangkaian Waktu untuk Pemantauan Jaringan". Implementasi untuk RRDTool dapat ditemukan di sini .
sumber
Analisis spektral mendeteksi periodisitas dalam deret waktu stasioner. Pendekatan domain frekuensi berdasarkan estimasi kepadatan spektral adalah pendekatan yang saya sarankan sebagai langkah pertama Anda.
Jika untuk periode-periode tertentu, ketidakteraturan berarti puncak yang jauh lebih tinggi daripada tipikal untuk periode itu maka deret dengan penyimpangan seperti itu tidak akan stasioner dan analisis spektral tidak akan sesuai. Tetapi dengan asumsi Anda telah mengidentifikasi periode yang memiliki penyimpangan Anda harus dapat menentukan kira-kira berapa tinggi puncak normal akan dan kemudian dapat menetapkan ambang batas pada tingkat di atas rata-rata untuk menunjuk kasus tidak teratur.
sumber
Karena ini adalah data deret waktu, filter eksponensial sederhana http://en.wikipedia.org/wiki/Exponential_smoothing akan memperlancar data. Ini adalah filter yang sangat baik karena Anda tidak perlu mengumpulkan poin data lama. Bandingkan setiap nilai data yang baru dihaluskan dengan yang tidak terhapuskan . Setelah penyimpangan melebihi ambang batas yang telah ditentukan sebelumnya (tergantung pada apa yang Anda yakini sebagai pencilan dalam data Anda), maka pencilan Anda dapat dengan mudah dideteksi.
Dalam CI akan melakukan hal berikut untuk sampel 16 bit real-time (saya percaya ini ditemukan di suatu tempat di sini <Penjelasan - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order) -iir-aproksimasi-ke-a-moving-average-filter >)
sumber
Anda bisa menggunakan standar deviasi dari pengukuran N terakhir (Anda harus memilih N yang sesuai). Skor anomali yang baik adalah berapa banyak standar deviasi yang diukur dari moving average.
sumber
Apa yang saya lakukan adalah mengelompokkan pengukuran dengan jam dan hari dalam seminggu dan membandingkan standar deviasi itu. Masih tidak benar untuk hal-hal seperti liburan dan musim panas / musim dingin tetapi sebagian besar benar.
The downside adalah bahwa Anda benar-benar perlu mengumpulkan satu tahun atau lebih data untuk memiliki cukup sehingga stddev mulai masuk akal.
sumber
Saya menyarankan skema di bawah ini, yang seharusnya dapat diimplementasikan dalam satu hari atau lebih:
Latihan
Menghitung "outlierness":
Untuk satu sampel yang ingin Anda ketahui "outlierness" -nya:
Itu akan menjadi skor outlier Anda: 100% adalah outlier ekstrem.
PS. Dalam menghitung jarak Mahalanobis , gunakan matriks korelasi, bukan matriks kovarians. Ini lebih kuat jika ukuran sampel bervariasi dalam satuan dan jumlah.
sumber
Untuk kasus di mana seseorang harus menghitung outlier dengan cepat, seseorang dapat menggunakan ide Rob Hyndman dan Mahito Sugiyama ( https://github.com/BorgwardtLab/sampling-outlier-detection , library (spoutlier), fungsi qsp) untuk menghitung pencilan sebagai berikut:
sumber
Deteksi anomali membutuhkan konstruksi persamaan yang menggambarkan ekspektasi. Deteksi Intervensi tersedia dalam pengaturan non-kausal dan kausal. Jika seseorang memiliki seri prediktor seperti harga maka hal-hal bisa menjadi sedikit rumit. Respons lain di sini tampaknya tidak memperhitungkan penyebab yang dapat dialihkan ke akun yang disebabkan oleh seri prediktor yang ditentukan pengguna seperti harga dan karenanya mungkin cacat. Kuantitas yang dijual mungkin tergantung pada harga, mungkin harga sebelumnya dan mungkin kuantitas yang dijual di masa lalu. Dasar untuk deteksi anomali (pulsa, pulsa musiman, pergeseran level, dan tren waktu lokal) ditemukan di https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf
sumber