Latar Belakang
Saya bekerja di Pusat Operasi Jaringan, kami memantau sistem komputer dan kinerjanya. Salah satu metrik utama untuk dipantau adalah sejumlah pengunjung \ pelanggan yang saat ini terhubung ke server kami. Untuk membuatnya terlihat, kami (tim Ops) mengumpulkan metrik seperti data deret waktu dan menggambar grafik. Graphite memungkinkan kita melakukannya, ia memiliki API yang cukup kaya yang saya gunakan untuk membangun sistem peringatan untuk memberi tahu tim kami jika tiba-tiba turun (kebanyakan) dan perubahan lainnya terjadi. Untuk saat ini saya telah menetapkan ambang statis berdasarkan nilai rata-rata tetapi tidak berfungsi dengan baik (ada banyak false-positif) karena beban yang berbeda di siang hari dan minggu (faktor musiman).
Itu terlihat seperti ini:
Data aktual (contoh untuk satu metrik, rentang waktu 15 menit; angka pertama adalah sejumlah pengguna, cap kedua kali):
[{"target": "metric_name", "datapoints": [[175562.0, 1431803460], [176125.0, 1431803520], [176125.0, 1431803580], [175710.0, 1431803640], [175710.0, 1431803700], [175733.0, 1431803760], [175733.0, 1431803820], [175839.0, 1431803880], [175839.0, 1431803940], [175245.0, 1431804000], [175217.0, 1431804060], [175629.0, 1431804120], [175104.0, 1431804180], [175104.0, 1431804240], [175505.0, 1431804300]]}]
Apa yang saya coba capai
Saya telah membuat skrip Python yang menerima titik data baru-baru ini, membandingkannya dengan rata-rata historis dan peringatan jika ada perubahan atau penurunan mendadak. Karena ambang "statis" musiman tidak berfungsi dengan baik dan skrip menghasilkan lansiran positif palsu. Saya ingin meningkatkan algoritme peringatan menjadi lebih tepat dan membuatnya bekerja tanpa menyetel ambang peringatan secara konstan.
Saran apa yang saya butuhkan dan hal-hal yang saya temukan
Dengan googling saya pikir saya sedang mencari algoritma pembelajaran mesin untuk deteksi anomali (yang tidak diawasi). Penyelidikan lebih lanjut menunjukkan bahwa ada banyak dari mereka dan sangat sulit untuk memahami mana yang berlaku dalam kasus saya. Karena pengetahuan matematika saya yang terbatas, saya tidak dapat membaca karya ilmiah yang canggih dan saya mencari sesuatu yang sederhana untuk pemula di bidangnya.
Saya suka Python dan terbiasa dengan R sedikit, jadi saya akan senang melihat contoh untuk bahasa ini. Harap rekomendasikan buku atau artikel bagus yang akan membantu saya untuk menyelesaikan masalah saya. Terima kasih atas waktu Anda dan permisi untuk deskripsi yang panjang
Tautan yang bermanfaat
Pertanyaan serupa:
- Deret waktu dan deteksi anomali
- Deteksi Anomali Time Series dengan Python
- Anomali seri waktu
- Algoritma untuk Deteksi Anomali Seri Waktu
- Aplikasi wavelet untuk algoritma deteksi anomali berbasis seri waktu
- Algoritme mana yang harus saya gunakan?
Sumber daya eksternal:
auto.arima
fungsi dariforecast
paket R yang sangat baik (lihat jstatsoft.org/v27/i03/paper ). Anda dapat menyetel tingkat kepercayaan dengan menyesuaikanlevel
parameter, misalnyadata.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99)
.Jawaban:
Saya pikir kuncinya adalah kualifikasi "tak terduga" dalam grafik Anda. Untuk mendeteksi hal-hal yang tidak terduga, Anda perlu memiliki gagasan tentang apa yang diharapkan .
Saya akan mulai dengan model deret waktu sederhana seperti AR (p) atau ARMA (p, q). Sesuaikan dengan data, tambahkan musiman sesuai kebutuhan. Misalnya, model SAR (1) (24) Anda dapat berupa: , di mana adalah waktu dalam jam. Jadi, Anda akan memprediksi grafik untuk satu jam berikutnya. Kapan saja kesalahan prediksi adalah "terlalu besar" Anda memberikan peringatan.yt=c+ϕyt−1+Φ24yt−24+Φ25yt−25+εt t et=yt−y^t
Ketika Anda memperkirakan model, Anda akan mendapatkan varians dari kesalahan . Bergantung pada asumsi distribusi Anda, seperti normal, Anda dapat mengatur ambang berdasarkan probabilitas, seperti untuk 99,7% atau satu sisi .σε εt |et|<3σε et>3σε
Jumlah pengunjung mungkin cukup persisten, tetapi sangat musiman. Mungkin lebih baik untuk mencoba boneka musiman daripada musiman multiplikasi, maka Anda akan mencoba ARMAX di mana X adalah variabel eksogen, yang bisa berupa boneka liburan, boneka jam, boneka akhir pekan dll.
sumber
Di blog teknologi Netflix ada artikel tentang alat Deteksi Anomali Kuat (RAD). http://techblog.netflix.com/2015/02/rad-outlier-detection-on-big-data.html
Ini berkaitan dengan dataset musiman dan sangat tinggi sehingga mungkin sesuai dengan kebutuhan Anda. Kode ini open source Java dan Apache Pig https://github.com/Netflix/Surus/blob/master/resources/examples/pig/rad.pig
Algoritma yang mendasari didasarkan pada PCA yang kuat - lihat kertas asli di sini: http://statweb.stanford.edu/~candes/papers/RobustPCA.pdf
sumber
Kebanyakan algoritma pendeteksian outlier dalam paket open source adalah untuk data deret waktu bisnis dengan frekuensi rendah, data frekuensi harian / mingguan / bulanan. Data ini tampaknya untuk area khusus yang ditangkap dalam hitungan menit, jadi saya tidak yakin apakah pendeteksian sumber terbuka open source akan membantu. Anda dapat mencoba menyesuaikan pendekatan ini dengan data Anda.
Di bawah ini saya menguraikan beberapa pendekatan paket yang tersedia di open source
R
:Ada paket komersial yang memiliki pendekatan khusus untuk mencoba dan mendeteksi anomali. Pendekatan klasik lainnya adalah algoritma pendeteksian outlier time series Tsay , mirip dengan pendekatan Chen dan Liu yang mendeteksi berbagai jenis pencilan. Saya baru-baru ini juga menemukan solusi perangkat lunak komersial yang disebut metafor yang mungkin lebih cocok untuk data Anda.
Semoga ini bermanfaat
sumber
Apa jawaban lain yang tampaknya tidak disebutkan adalah bahwa masalah Anda terdengar seperti deteksi changepoint . Gagasan deteksi changapoint adalah bahwa Anda mencari segmen dalam data Anda yang secara signifikan berbeda dalam hal properti (misalnya rata-rata, varians). Hal ini dapat dicapai dengan menggunakan estimasi kemungkinan maksimum saya, di mana untuk mengubah fungsi likelihoodnyam
di mana adalah data Anda, adalah titik batas yang menandai perubahan, dan distribusi probabilitas oleh untuk setiap segmen ke- . Ini dapat dengan mudah digeneralisasikan untuk merekam berbagai situasi. Sejumlah algoritma ada untuk menemukan parameter, termasuk menemukan tidak diketahui . Ada juga perangkat lunak yang tersedia untuk memperkirakan model seperti itu, misalnya paket untuk R. Jika Anda ingin mempelajari lebih lanjut, Anda dapat memeriksa publikasi berikut dan referensi yang mereka sediakan: 1 < τ 1 < ⋯ < τ m < n p θ i i my1,…,yn 1<τ1<⋯<τm<n p θi i m
changepoint
sumber
Sudahkah Anda mencoba menggunakan aturan Kontrol Proses Statistik (mis. Western Electric http://en.wikipedia.org/wiki/Western_Electric_rules )?
Saya menggunakannya untuk data deret waktu - sering dengan sentuhan intuisi tentang data - untuk menilai apakah data tersebut pergi ke suatu tempat saya tidak ingin pergi. Seperti contoh Anda, aturan ini mengatakan jika delta / perubahan konsisten pada beberapa titik data, itu menandai bahwa mungkin ada masalah.
Selain itu, Statistical Process Control (SPC) dapat digunakan untuk berolahraga jika Anda menjadi lebih baik atau lebih buruk dari sebelumnya.
Satu masalah dengan SPC adalah sebagian besar bergantung pada distribusi normal yang mungkin tidak sesuai dengan data Anda yang tidak bisa di bawah nol. Lainnya yang lebih baik daripada saya dengan SPC dapat menyarankan opsi di sini. Saya suka menggunakannya untuk menandai masalah tetapi, seperti semua model, paling baik digunakan dengan pengetahuan tentang data itu sendiri (dan sumber).
sumber
Mengingat bahwa periodisitas deret waktu harus dipahami dengan baik, sederhana, tetapi efektif, algoritma berdasarkan perbedaan dapat dirancang.
Perbedaan satu langkah sederhana akan mendeteksi penurunan tiba-tiba dari nilai sebelumnya
tetapi jika seri ini memiliki komponen periodik yang kuat, Anda akan berharap bahwa penurunan akan cukup besar secara teratur. Dalam hal ini akan lebih baik untuk membandingkan nilai apa pun dengan pasangannya pada titik yang sama pada siklus sebelumnya, yaitu, satu periode yang lalu.
Dalam kasus pertanyaan yang diposting, wajar untuk mengharapkan dua komponen periodik yang signifikan, satu panjang sehari, yang lain panjang seminggu. Tetapi ini tidak terlalu menyulitkan, karena lamanya periode yang lebih panjang dapat dengan rapi dibagi dengan panjang yang lebih pendek.
Jika pengambilan sampel dilakukan setiap jam, dalam persamaan di atas harus ditetapkan ke24 ∗ 7 = 168n 24∗7=168
Jika tetesnya lebih bersifat proporsional, perbedaan sederhana akan dengan mudah gagal mendeteksi penurunan tiba-tiba ketika aktivitas rendah. Dalam keadaan seperti itu, algoritma dapat dimodifikasi untuk menghitung rasio saja.
Saya melakukan beberapa tes dalam R menggunakan dataset simulasi. Di dalamnya data diambil sampelnya 6 kali sehari dan ada periode harian dan mingguan yang kuat, bersama dengan kebisingan dan fluktuasi lainnya. Drops ditambahkan di tempat acak dan durasi antara 1 dan 3.
Untuk mengisolasi tetes pertama rasio dihitung pada jarak 42, maka ambang batas yang ditetapkan pada 0,6, karena hanya perubahan negatif dari ukuran tertentu yang menarik. Kemudian selisih satu langkah dihitung, dan ambang batas ditetapkan pada -0,5. Pada akhirnya satu false positive tampaknya telah lolos (yang pada akhir minggu 16). Grafik di kiri dan kanan menunjukkan data yang sama, hanya dengan cara yang berbeda.
sumber
Apakah akan lebih berguna untuk memikirkan perubahan dalam deret waktu sebagai awal dari tren baru daripada anomali? Mengambil perbedaan antara titik-titik yang berdekatan akan membantu memberi tahu kapan kemiringan (turunan) berubah dan mungkin menandakan awal tren baru pada tanggal tersebut. Juga mengambil perbedaan nilai perbedaan (turunan kedua) mungkin berguna. Melakukan pencarian Google pada "times series of trend) dapat memberikan saran yang baik untuk metode. Dalam data keuangan keterlambatan perhatian diberikan pada tren baru (apakah Anda membeli atau menjual?) Jadi ada makalah tentang topik ini.
Pengantar wavelet yang baik adalah "Dunia menurut wavelet" oleh Hubbard yang saya percaya adalah pengarangnya.
sumber
Saya bisa mendapatkan beberapa hasil bagus untuk rangkaian waktu multi-musim (harian, mingguan) menggunakan dua algoritma berbeda:
STL melakukan dekomposisi domain waktu dari rangkaian waktu Anda menjadi komponen tren, komponen musiman tunggal, dan sisanya. Komponen musiman adalah musiman frekuensi tinggi Anda (misalnya, harian), sedangkan trennya mencakup musiman frekuensi rendah (misalnya, mingguan) dan tren yang sesuai. Anda dapat memisahkan keduanya dengan hanya menjalankan STL lagi pada tren. Bagaimanapun begitu Anda mengisolasi seri sisanya dari komponen lain, Anda dapat melakukan deteksi anomali terhadap seri itu.
Saya melakukan penulisan yang lebih rinci di sini:
https://techblog.expedia.com/2016/07/28/applying-data-science-to-monitoring/
sumber
Terinspirasi oleh David, sudahkah Anda mencoba menggunakan FFT? Mungkin bisa melihat tetes tiba-tiba karena itu menunjukkan anomali Anda. Keanehan mungkin muncul dalam spektrum sempit. Jadi Anda bisa dengan mudah menangkapnya.
sumber