Algoritma apa yang harus saya gunakan untuk mendeteksi anomali pada deret waktu?

70

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: sejumlah pengguna per sistem

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:

Sumber daya eksternal:

Ilya Khadykin
sumber
1
Apakah Anda melihat salah satu algoritma paling sederhana seperti CUSUM?
Vladislavs Dovgalecs
@ xeon, belum. Saya baru mengenal subjek dan perlu waktu untuk mencerna semuanya. Terima kasih telah membahas ini, ini adalah titik awal yang baik, saya dapat menerapkannya sekarang
Ilya Khadykin
1
Itu pertanyaan yang bagus, @ ma-ge. Saya punya skenario yang sama. Pendekatan saya adalah mengatur peringatan dengan membuat prakiraan berkala berkala menggunakan auto.arimafungsi dari forecastpaket R yang sangat baik (lihat jstatsoft.org/v27/i03/paper ). Anda dapat menyetel tingkat kepercayaan dengan menyesuaikan levelparameter, misalnya data.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99).
Alex Woolford
3
Cowok dari Twitter menulis artikel yang sangat menarik tentang topik ini. Lihatlah: blog.twitter.com/2015/…
ognjenz
Hey @IlyaKhadykin Semoga kamu baik-baik saja! apakah Anda pernah mendapat solusi untuk masalah ini. Saya melakukan sesuatu yang persis sama di mana setiap menit kami memiliki pengguna tertentu dan kami juga mendapatkan banyak false positive. Sampai sekarang kami sedang menghitung skor untuk setiap 5 menit data interval dan mencocokkannya dengan pola historis. JIKA ANDA MENDAPAT ALGORITMA TERTENTU, BISA ANDA BERBAGI BAGAIMANA ANDA MELAKUKANNYA. Terima kasih sebelumnya!
ak3191

Jawaban:

24

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+ϕyt1+Φ24yt24+Φ25yt25+εttet=yty^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.

Aksakal
sumber
5
Pendekatan ini mengasumsikan model ARIMA tertentu yang akan memiliki parameter bias berdasarkan anomali yang secara implisit dianggap tidak ada. Pendekatan yang lebih umum adalah dengan JUGA mengidentifikasi anomali pertama dan kemudian model ARIMA optimal yang mengarah ke inline tes signifikansi. Tambahan anomali dapat berupa perubahan level, pulsa musiman, dan tren waktu lokal yang membutuhkan solusi yang lebih umum daripada yang diusulkan di sini. Lihat unc.edu/~jbhill/tsay.pdf untuk prosedur komprehensif. Anda juga dapat Google "Deteksi Intervensi Otomatis" untuk informasi lebih lanjut.
IrishStat
@IrishStat Saya menyarankan ARIMAX dengan boneka untuk acara. OP dapat menjelaskan peristiwa yang diketahui seperti crash situs web dengan boneka. Ini akan mengurangi varians kesalahan, dan akan ada lebih banyak peringatan. Tidak ada alasan untuk membangun model yang rumit, karena tidak mungkin mempertanggungjawabkan segalanya ketika menyangkut lalu lintas situs web. Model-model sederhana akan bekerja paling baik.
Aksakal
2
@ ma-ge, satu hal lagi: Anda mungkin ingin menggunakan interval yang tumpang tindih. Katakanlah Anda mengumpulkan data setiap menit, tetapi untuk pemodelan Anda dapat memilih langkah dalam 10 menit. Ini menciptakan beberapa masalah untuk estimasi (karena autokorelasi), tetapi model yang dihasilkan kemungkinan besar akan lebih kuat.
Aksakal
@Aksakal Models harus sesederhana yang diperlukan TAPI tidak terlalu sederhana.
IrishStat
17

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

Paul McGettigan
sumber
12

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:

  1. tsoutliers : Menerapkan algoritma deteksi outlier Chen dan Liu dalam kerangka arima. lihat pertanyaan saya sebelumnya di situs ini. Pendekatan yang fantastis, tetapi sangat lambat tidak yakin apakah itu akan dapat menangani data frekuensi tinggi seperti milik Anda. Ini memiliki keunggulan mendeteksi semua jenis pencilan seperti yang disebutkan dalam pertanyaan / posting saya sebelumnya.
  2. Deteksi Anomali Twitter : Menggunakan algoritma Rosner untuk mendeteksi anomali berdasarkan seri waktu. Algoritma ini menguraikan deret waktu dan kemudian mendeteksi anomali. Menurut pendapat pribadi saya, ini tidak efisien dan akurat dalam mendeteksi outlires dalam deret waktu.
  3. tsoutlier dalam paket perkiraan: Mirip dengan algoritma twitter dalam hal mendekomposisi seri waktu dan kemudian mendeteksi outlier. Hanya akan mendeteksi pencilan aditif atau pulsa.

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

peramal cuaca
sumber
Terima kasih, ini memberi saya perspektif tentang masalah dan pendekatan yang serupa; terima kasih khusus untuk tautannya!
Ilya Khadykin
Jika ada yang mencari Metafor, kami diakuisisi oleh Splunk. Algoritma TSAD kami termasuk dalam versi terbaru Splunk IT Service Intelligence ("ITSI").
Alex Cruise
5

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

L(m,τ1:m,θ1:(m+1))=i=1m+1p(y(τi1+1):τiθi)

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,,yn1<τ1<<τm<npθiimchangepoint

Rebecca Killick dan Idris A. Eckley. (2013) changepoint: Paket R untuk Analisis Changepoint. (kertas online)

Eckley, IA, Fearnhead, P. dan Killick, R. (2011) Analisis model changepoint. [di:] Bayesian Time Series Models , eds. D. Barber, AT Cemgil dan S. Chiappa, Cambridge University Press.

Tim
sumber
4

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).

MarkR
sumber
4

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

yt=ytyt1

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.

yt=ytytnwhere n=length of period

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 = 168n247=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.

yt=ytytn

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.

masukkan deskripsi gambar di sini

AkselA
sumber
3

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.

DavidF
sumber
2

Saya bisa mendapatkan beberapa hasil bagus untuk rangkaian waktu multi-musim (harian, mingguan) menggunakan dua algoritma berbeda:

  • Dekomposisi tren musiman menggunakan loess (atau STL) untuk menetapkan seri titik tengah.
  • Regresi nonlinear untuk menetapkan ambang batas sekitar titik tengah itu, berdasarkan pada hubungan antara varians dan level.

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/

Willie Wheeler
sumber
1

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.

Romeo Kienzler
sumber