Saya memiliki dataset yang sangat tidak seimbang. Saya mencoba mengikuti saran penyetelan dan menggunakan scale_pos_weight
tetapi 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:
- dalam konteks node, untuk mengevaluasi pengurangan kerugian dari kandidat split
- 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?
unbalanced-classes
xgboost
ihadanny
sumber
sumber
Jawaban:
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
sumber
Semua dokumentasi mengatakan bahwa itu harus:
Dalam praktiknya, itu bekerja dengan cukup baik, tetapi jika dataset Anda sangat tidak seimbang, saya sarankan menggunakan sesuatu yang lebih konservatif seperti:
Ini berguna untuk membatasi efek dari penggandaan contoh-contoh positif dengan bobot yang sangat tinggi.
sumber
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.
sumber
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/
sumber