Apa penggunaan scale_pos_weight di xgboost untuk set data yang tidak seimbang?


26

Saya memiliki dataset yang sangat tidak seimbang. Saya mencoba mengikuti saran penyetelan dan menggunakan scale_pos_weighttetapi tidak yakin bagaimana saya harus menyetelnya.

Saya dapat melihat bahwa RegLossObj.GetGradient:

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

jadi gradien sampel positif akan lebih berpengaruh. Namun, menurut makalah xgboost , statistik gradien selalu digunakan secara lokal = di dalam instance dari simpul tertentu di pohon tertentu:

  1. dalam konteks node, untuk mengevaluasi pengurangan kerugian dari kandidat split
  2. dalam konteks simpul daun, untuk mengoptimalkan bobot yang diberikan pada simpul itu

Jadi tidak ada cara untuk mengetahui terlebih dahulu apa yang akan baik scale_pos_weight- itu adalah angka yang sangat berbeda untuk sebuah simpul yang berakhir dengan rasio 1: 100 antara contoh positif dan negatif, dan untuk sebuah simpul dengan rasio 1: 2.

Ada petunjuk?


Mungkin, Anda dapat menyetel parameter dalam CV dengan 5 kali lipat 5 pengulangan. Tapi, Anda mungkin perlu menulis kode untuk melakukan itu.
user2149631

Jawaban:


22

Secara umum, Scale_pos_weight adalah rasio jumlah kelas negatif dengan kelas positif. Misalkan, dataset memiliki 90 pengamatan kelas negatif dan 10 pengamatan kelas positif, maka nilai ideal scale_pos_Weight harus 9. Anda dapat memeriksa tautan berikut. http://xgboost.readthedocs.io/en/latest/parameter.html


1
Bagaimana itu berlaku untuk dataset multiclass? Bagaimana dengan 28 kelas? Itu tidak jelas bagi saya
Gabriel Ziegler

1
@Gabriel Saya percaya maka akan lebih baik untuk mengikuti kelas bobot. Anda dapat menggunakan scale_pos_weight, dengan menggunakan pendekatan satu vs lainnya. Misalnya, membuat boneka untuk 28 kelas. Kemudian Anda bisa menggunakan masing-masing sebagai masalah klasifikasi biner. Dengan begitu Anda akan berhadapan dengan 28 model yang berbeda.
Harshit Mehta

Saya mengerti, tetapi ketika saya menggunakan onevsrest, apakah classifier juga memberi saya output multilabel, bukan? Tidak hanya satu kelas dari 28
Gabriel Ziegler

Bagaimana? Sebagai Contoh: Kelas adalah A, B, C. Jadi Anda dapat memiliki classifier biner untuk mengklasifikasikan (A / Tidak A), yang lain akan menjadi (B / Tidak B). Anda dapat melakukan ini untuk jumlah kelas 'n'. Kemudian di antara semua probabilitas yang terkait dengan setiap classifier, Anda harus menemukan cara untuk menetapkan kelas.
Harshit Mehta

Saya sudah terbiasa menggunakan onevsrest untuk multilabel, tetapi saya akan mencobanya! Terima kasih!
Gabriel Ziegler

3

Semua dokumentasi mengatakan bahwa itu harus:

scale_pos_weight = count(negative examples)/count(Positive examples)

Dalam praktiknya, itu bekerja dengan cukup baik, tetapi jika dataset Anda sangat tidak seimbang, saya sarankan menggunakan sesuatu yang lebih konservatif seperti:

scale_pos_weight = sqrt(count(negative examples)/count(Positive examples)) 

Ini berguna untuk membatasi efek dari penggandaan contoh-contoh positif dengan bobot yang sangat tinggi.


1

Saya memahami pertanyaan dan frustrasi Anda, tetapi saya tidak yakin ini adalah sesuatu yang dapat dihitung secara analitis, alih-alih Anda harus menentukan pengaturan yang baik secara empiris untuk data Anda, seperti yang Anda lakukan untuk sebagian besar parameter hiper, menggunakan validasi silang sebagai @ user2149631 disarankan. Saya sudah cukup sukses menggunakan SelectFPR dengan Xgboost dan sklearn API untuk menurunkan FPR untuk XGBoost melalui pemilihan fitur saja, kemudian menyetel skala_pos_weight antara 0 dan 1.0. O.9 tampaknya bekerja dengan baik tetapi seperti apa pun, YMMV tergantung pada data Anda. Anda juga dapat mempertimbangkan setiap titik data secara individual saat mengirimnya ke XGboost jika Anda melihat-lihat dokumen mereka. Anda harus menggunakan API mereka bukan pembungkus sklearn. Dengan begitu Anda dapat memberi bobot satu set titik data yang jauh lebih tinggi dari yang lain, dan itu akan berdampak pada peningkatan algoritma yang digunakannya.


0

Saya juga menemukan dilema ini dan masih mencari solusi terbaik. Namun, saya akan menyarankan Anda menggunakan metode seperti Pencarian Grid (GridSearchCV di sklearn) untuk penyetelan parameter terbaik untuk classifier Anda. Namun, jika dataset Anda sangat tidak seimbang, ada baiknya mempertimbangkan metode pengambilan sampel (khususnya metode oversampling acak dan metode oversampling SMOTE) dan memodelkan sampel data sampel dengan rasio sampel positif dan negatif yang berbeda. Berikut ini adalah salah satu tutorial yang bagus dan bermanfaat (hampir lengkap) tentang penanganan dataset tidak seimbang.

https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.