Bagaimana cara mengidentifikasi pencilan dalam data kinerja waktu aktif server?

8

Saya memiliki skrip python yang membuat daftar daftar server uptime dan data kinerja, di mana setiap sub-daftar (atau 'baris') berisi statistik cluster tertentu. Misalnya, diformat dengan baik itu terlihat seperti ini:

-------  -------------  ------------  ----------  -------------------
Cluster  %Availability  Requests/Sec  Errors/Sec  %Memory_Utilization
-------  -------------  ------------  ----------  -------------------
ams-a    98.099          1012         678          91
bos-a    98.099          1111         12           91
bos-b    55.123          1513         576          22
lax-a    99.110          988          10           89
pdx-a    98.123          1121         11           90
ord-b    75.005          1301         123          100
sjc-a    99.020          1000         10           88
...(so on)...

Jadi dalam bentuk daftar, ini mungkin terlihat seperti:

[[ams-a,98.099,1012,678,91],[bos-a,98.099,1111,12,91],...]

Pertanyaan saya:

  • Apa cara terbaik untuk menentukan outlier di setiap kolom? Atau apakah outlier tidak selalu merupakan cara terbaik untuk menyerang masalah menemukan 'kejahatan'?

Dalam data di atas, saya pasti ingin tahu tentang bos-b dan ord-b, serta ams-a karena tingkat kesalahannya sangat tinggi, tetapi yang lain bisa dibuang. Bergantung pada kolomnya, karena lebih tinggi tidak selalu lebih buruk, juga tidak lebih rendah, saya mencoba mencari cara paling efisien untuk melakukan ini. Sepertinya numpy disebutkan banyak untuk hal-hal semacam ini, tetapi tidak yakin di mana untuk memulai dengan itu (sayangnya, saya lebih sysadmin daripada ahli statistik ...). Ketika saya bertanya di Stack Overflow, seseorang menyebutkan menggunakan fungsi scoreatpercentile numpy dan membuang apa pun di atas persentil ke-99 - apakah itu sepertinya ide yang bagus?

(Diposting silang dari stackoverflow, di sini: /programming/4606288 )

septagram
sumber

Jawaban:

13

Berdasarkan cara Anda mengucapkan pertanyaan

Apakah outlier tidak selalu merupakan cara terbaik untuk menyerang masalah menemukan 'kejahatan'?

Tidak jelas bahwa Anda mencari pencilan. Sebagai contoh, tampaknya Anda tertarik pada mesin yang melakukan di atas / di bawah ambang tertentu.

Sebagai contoh, jika semua server Anda berada pada 98 ketersediaan 0,1%, server pada ketersediaan 100% akan menjadi pencilan, seperti halnya server dengan ketersediaan 97,6%. Tapi ini mungkin dalam batas yang Anda inginkan.±

Di sisi lain, mungkin ada alasan bagus apriori untuk ingin diberitahu tentang server mana pun yang ketersediaannya kurang dari 95%, apakah ada satu atau banyak server di bawah ambang batas ini.

Untuk alasan ini, pencarian outlier mungkin tidak memberikan informasi yang Anda minati. Ambang batas dapat ditentukan secara statistik berdasarkan data historis, misalnya dengan memodelkan tingkat kesalahan sebagai poisson atau ketersediaan persen sebagai variabel beta. Dalam pengaturan yang diterapkan, ambang batas ini mungkin dapat ditentukan berdasarkan persyaratan kinerja.

David LeBauer
sumber
2
+1 untuk menjawab pertanyaan nyata (bukan yang dinyatakan), yang jauh lebih penting.
whuber
4

Cara sederhana untuk menemukan server anomali adalah dengan mengasumsikan mereka terdistribusi secara identik, memperkirakan parameter populasi, dan mengurutkannya sesuai dengan kemungkinan mereka, naik. Kemungkinan kolom akan digabungkan dengan produk atau minimumnya (atau norma-T lainnya). Ini berfungsi dengan baik selama outlier jarang terjadi. Untuk deteksi outlier itu sendiri, parameter populasi yang stabil biasanya diperkirakan secara iteratif dengan menjatuhkan outlier yang ditemukan, tetapi itu tidak penting selama Anda secara manual memeriksa daftar dan dengan demikian menghindari ambang batas.

Untuk kemungkinannya, Anda dapat mencoba Beta untuk proporsi dan Poisson untuk tarif.

Seperti yang ditunjukkan oleh David, deteksi outlier tidak persis sama dengan analisis reliabilitas, yang akan menandai semua server yang melebihi batas tertentu. Selain itu, beberapa orang akan mendekati masalah melalui fungsi kehilangan - mendefinisikan rasa sakit yang Anda rasakan ketika beberapa server berada pada ketersediaan 50% atau tingkat kesalahan 500, dan kemudian memberi peringkat mereka sesuai dengan rasa sakit itu.

sesqu
sumber
2

Mengidentifikasi titik data tertentu sebagai pencilan menyiratkan bahwa ada beberapa proses atau model pembuatan data dari mana data tersebut diharapkan berasal. Sepertinya Anda tidak yakin model apa untuk metrik dan kluster yang Anda khawatirkan. Jadi, inilah yang akan saya pertimbangkan untuk mengeksplorasi: bagan kendali proses statistik .

Idenya di sini adalah untuk mengumpulkan
-% Ketersediaan
- Permintaan / Detik
- Kesalahan / Detik
-% Memory_Utilization

metrik untuk setiap cluster Anda. Untuk setiap metrik, buat subset data yang hanya mencakup nilai yang "masuk akal" atau terkendali. Buat bagan untuk setiap metrik berdasarkan data in-control ini. Kemudian Anda dapat mulai memasukkan data langsung ke kode grafik Anda dan menilai secara visual apakah metrik mengendalikan atau tidak.

Tentu saja, melakukan ini secara visual untuk banyak metrik di banyak kluster mungkin tidak layak, tetapi ini bisa menjadi cara yang baik untuk mulai belajar tentang dinamika yang Anda hadapi. Anda kemudian dapat membuat layanan notifikasi untuk cluster dengan metrik yang tidak terkendali. Sejalan dengan ini, saya telah bermain dengan menggunakan jaringan saraf untuk secara otomatis mengklasifikasikan pola bagan kendali sebagai OK vs beberapa rasa tertentu di luar kendali (mis.% Tren ketersediaan turun atau perilaku siklik dalam kesalahan / detik). Melakukan hal ini memberi Anda keuntungan dari diagram kontrol proses statistik (lama digunakan dalam pengaturan manufaktur) tetapi meringankan beban karena harus menghabiskan banyak waktu untuk benar-benar melihat grafik, karena Anda dapat melatih jaringan saraf untuk mengklasifikasikan pola berdasarkan pada interpretasi ahli Anda.

Adapun kode, ada paket spc di pypi tapi saya tidak punya pengalaman menggunakan ini. Contoh mainan saya menggunakan jaringan saraf (Naif Bayes juga) dapat ditemukan di sini .

Josh Hemann
sumber
Terima kasih atas penunjuk ke beberapa kode sampel, saya akan memeriksanya!
septagram