Python: Menangani Kelas Ketidakseimbangan dalam Pembelajaran Mesin python

9

Saya memiliki dataset yang saya coba prediksi variabel targetnya.

Col1    Col2    Col3    Col4    Col5    
  1      2       23      11     1
  2      22      12      14     1
  22     11      43      38     3
  14     22      25      19     3
  12     42      11      14     1
  22     11      43      38     2
  1      2       23      11     4
  2      22      12      14     2
  22     11      43      38     3

Saya telah memberikan data sampel, tetapi catatan saya memiliki ribuan catatan yang didistribusikan dengan cara yang sama. Di sini, Col1, Col2, Col3, Col4 adalah fitur saya dan Col5 adalah variabel target. Karenanya prediksi harus 1,2,3 atau 4 karena ini adalah nilai saya untuk variabel target. Saya telah mencoba menggunakan algoritme seperti hutan acak, pohon keputusan, dll. Untuk prediksi.

Di sini, jika Anda melihat, nilai 1,2 dan 3 lebih sering terjadi dibandingkan dengan 4. Oleh karena itu sambil memprediksi, model saya lebih condong ke arah 1 2 dan 3 sedangkan saya hanya mendapatkan sedikit prediksi untuk 4 (Hanya mendapat 1 prediksi untuk policy4 dari ribuan catatan ketika saya melihat matriks kebingungan).

Untuk membuat model saya digeneralisasi, saya menghapus persentase data yang sama yang memiliki nilai 1,2 dan 3 secara acak. Saya dikelompokkan berdasarkan setiap nilai dalam Col5 dan kemudian menghapus persentase tertentu, sehingga saya menurunkan jumlah catatan. Sekarang saya bisa melihat peningkatan tertentu dalam persentase akurasi dan juga peningkatan yang wajar dalam prediksi untuk nilai 4 dalam matriks kebingungan.

Apakah ini pendekatan yang tepat untuk ditangani (menghapus data secara acak dari kelompok-kelompok yang menjadi bias model)?

Saya mencoba untuk algoritma python in-built seperti Adaboost, teknik GradientBoost menggunakan sklearn. Saya membaca algoritma ini untuk menangani kelas ketidakseimbangan. Tapi saya tidak bisa berhasil meningkatkan akurasi saya, bukan dengan menghapus data secara acak, di mana saya bisa melihat beberapa perbaikan.

Apakah pengurangan ini adalah teknik undersampling dan apakah ini pendekatan yang tepat untuk pengambilan sampel yang kurang?

Apakah ada paket pra-didefinisikan dalam sklearn atau logika apa pun yang dapat saya terapkan dalam python untuk menyelesaikan ini, jika penghapusan acak saya salah?

Juga, saya belajar tentang teknik SMOTE, yang berhubungan dengan oversampling. Haruskah saya mencoba ini untuk nilai 4? Dan bisakah kita melakukan ini menggunakan paket bawaan dengan python? Akan lebih bagus jika seseorang membantu saya dalam situasi ini.

SRS
sumber

Jawaban:

5

Makalah ini menyarankan menggunakan peringkat (saya menulisnya). Alih-alih menggunakan, misalnya, SVM secara langsung, Anda akan menggunakan RankSVM. Karena peringkat membandingkan pengamatan dengan pengamatan, pelatihan harus seimbang. Namun ada dua "tetapi": pelatihan jauh lebih lambat, dan, pada akhirnya, apa yang dilakukan model-model ini adalah membuat peringkat pengamatan Anda dari seberapa besar kemungkinan mereka menjadi bagian dari satu kelas hingga seberapa besar kemungkinan mereka menjadi bagian dari yang lain sehingga Anda perlu terapkan ambang batas setelahnya.

Jika Anda akan menggunakan pra-pemrosesan untuk memperbaiki ketidakseimbangan Anda, saya sarankan Anda memeriksa MetaCost . Algoritma ini melibatkan pembuatan bagging model dan kemudian mengubah prior class untuk membuatnya seimbang berdasarkan sulitnya memprediksi kasus. Sangat elegan. Hal keren tentang metode seperti SMOTE adalah bahwa dengan membuat pengamatan baru, Anda mungkin membuat kumpulan data kecil lebih kuat.

Bagaimanapun, meskipun saya menulis beberapa hal tentang ketidakseimbangan kelas, saya masih ragu bahwa itu adalah masalah penting di dunia nyata. Saya akan berpikir bahwa sangat tidak umum bahwa Anda memiliki ketidakseimbangan prior dalam set pelatihan Anda, tetapi imbangan seimbang dalam data dunia nyata Anda. Apakah kamu? Apa yang biasanya terjadi adalah bahwa kesalahan tipe I berbeda dari kesalahan tipe II dan saya yakin kebanyakan orang akan lebih baik menggunakan matriks biaya, yang diterima oleh sebagian besar metode pelatihan atau Anda dapat menerapkannya dengan pra-pemrosesan menggunakan MetaCost atau SMOTE. Saya pikir berkali-kali "memperbaiki ketidakseimbangan" adalah singkat untuk "Saya tidak ingin repot memikirkan pertukaran relatif antara kesalahan tipe I dan II."

Tambahan:

Saya mencoba untuk algoritma python in-built seperti Adaboost, teknik GradientBoost menggunakan sklearn. Saya membaca algoritma ini untuk menangani kelas ketidakseimbangan.

AdaBoost memberikan hasil yang lebih baik untuk ketidakseimbangan kelas ketika Anda menginisialisasi distribusi berat dengan mempertimbangkan ketidakseimbangan. Saya dapat menggali tesis di mana saya membaca ini jika Anda mau.

Bagaimanapun, tentu saja, metode-metode itu tidak akan memberikan akurasi yang baik. Apakah Anda memiliki ketidakseimbangan kelas dalam pelatihan dan set data validasi Anda? Anda harus menggunakan metrik seperti skor F1, atau meneruskan matriks biaya ke fungsi akurasi. Ketidakseimbangan kelas "Memperbaiki" adalah ketika prioritas Anda berbeda dalam pelatihan dan kasus validasi Anda.

Ricardo Cruz
sumber
4

Beberapa algoritma sklearn memiliki parameter bernama class_weight yang dapat Anda atur menjadi "seimbang" . Dengan cara itu sklearn akan menyesuaikan bobot kelasnya tergantung pada jumlah sampel yang Anda miliki di setiap kelas.

Untuk pengelompokan hutan acak, coba yang berikut dan lihat apakah itu meningkatkan skor Anda:

rf = RandomForestClassifier(class_weight="balanced") # also add your other parameters!
stmax
sumber
(class_weight = "seimbang") tidak memberikan peningkatan yang cukup ketika saya mencoba menggunakannya
SRS
2
@Srinath apa yang Anda mengerti dengan peningkatan? Metrik apa yang Anda gunakan? Jika pelatihan dan validasi Anda tidak seimbang, Anda tidak dapat menggunakan skor akurasi. Apa yang class_weightdilakukan adalah membuat matriks biaya untuk Anda di mana untuk setiap kelask, Ck=2NkN. Anda harus baik lulus sample_weight=[C_k for k in y]ke accuracy_scoreatau penggunaan sesuatu seperti f1_score.
Ricardo Cruz
2

Ya, ini adalah teknik yang bagus untuk mengatasi masalah ketidakseimbangan kelas. Namun, metode under-sampling memang menyebabkan hilangnya informasi dalam kumpulan data (katakanlah, Anda baru saja menghapus pola yang menarik di antara variabel-variabel lainnya, yang dapat berkontribusi pada pelatihan model yang lebih baik). Inilah sebabnya mengapa metode over-sampling lebih disukai, khususnya dalam hal kumpulan data yang lebih kecil.

Menanggapi pertanyaan Anda tentang paket Python, kotak alat belajar yang tidak seimbang khusus didedikasikan untuk tugas yang sama. Ini menyediakan beberapa metode under-sampling dan over-sampling. Saya akan merekomendasikan mencoba teknik SMOTE .

Saurav--
sumber
1

Itu tergantung pada teknik ensemble yang ingin Anda gunakan. Masalah mendasar yang Anda hadapi dengan masalah ketidakseimbangan data multi-kelas. Under sampling dapat digunakan secara efisien dalam mengantongi dan juga dalam meningkatkan teknik. Algoritma SMOTE sangat efisien dalam menghasilkan sampel baru. Masalah ketidakseimbangan data telah banyak dipelajari dalam literatur. Saya sarankan Anda untuk membaca tentang salah satu dari algoritma ini: SMOTE-Boost SMOTE-Bagging Rus-Boost EusBoost Ini adalah teknik boosting / bagging yang dirancang khusus untuk masalah data ketidakseimbangan. Alih-alih SMOTE Anda dapat mencoba ADA-SMOTE atau BOTE-SMOTE. Saya telah menggunakan dan memodifikasi SMOTE Border-Line untuk multi-kelas dan sangat efisien. Jika basis data Anda sangat besar dan masalahnya mudah, coba: viola - jones classifier. Saya juga menggunakan masalah ketidakseimbangan data dan ini sangat efisien

Bashar Haddad
sumber
Terima kasih untuk panduannya. Saya mencari topik yang disebutkan oleh Anda. Tetapi teknik yang saya gunakan untuk undersample (mengurangi data secara acak) adalah cara yang benar untuk dilakukan?
SRS
Anda dapat menggunakannya jika basis data Anda sangat besar. Tetapi jika basis data Anda kecil, Anda akan kehilangan sebagian informasinya. Baca Rus-Boosting, dalam metode ini mereka menggunakan random under sampling sebagai bagian dari algoritma peningkatan untuk menghindari kehilangan informasi. Mereka di bawah sampel sub set yang akan digunakan untuk melatih pembelajar dasar berikutnya tetapi tidak untuk keseluruhan basis data
Bashar Haddad
Dataset saya memiliki hampir 80 ribu catatan yang saya gunakan sebagai set pelatihan. Saya menerapkan ini dalam python. Saya sedang mencari beberapa paket dalam sklearn atau sesuatu yang lain dengan python. Saya tidak dapat menemukan mereka. Apakah ini sesuatu yang saya harus benar logika di tempat untuk menerapkannya?
SRS
Saya rasa tidak ada implementasi untuk metode ini. Masalah ketidakseimbangan data masih dalam penelitian. Jika Anda memiliki implementasi yang baik untuk Adaboost.M1 atau M2. Anda dapat dengan mudah memodifikasinya menjadi Rus Boost
Bashar Haddad
Saya pikir database yang Anda miliki cukup besar dan jika Anda mau, Anda bisa menggunakan viola - jones classifier. Untuk yang ini, Anda mungkin menemukan implementasi yang tersedia
Bashar Haddad
0

Sudah ada beberapa jawaban bagus di sini. Saya hanya berpikir saya akan menambahkan satu teknik lagi karena Anda terlihat menggunakan ansambel pohon. Dalam banyak kasus, Anda ingin mengoptimalkan kurva Angkat atau AUC untuk ROC. Untuk ini saya akan merekomendasikan kriteria jarak Hellinger untuk memisahkan cabang di pohon Anda. Pada saat penulisan ini tidak ada dalam paket belajar-seimbang tetapi sepertinya ada rencana .

Keith
sumber
0

Ketika berhadapan dengan masalah ketidakseimbangan kelas, Anda terutama harus berkonsentrasi pada metrik kesalahan dan Anda harus memilih skor F1 sebagai metrik kesalahan.

Setelah memilih metrik yang benar, kami dapat menggunakan Teknik berbeda untuk menangani masalah ini.

Jika tertarik Anda dapat melihat blog berikut, dijelaskan dengan sangat baik tentang teknik yang digunakan untuk memecahkan masalah ketidakseimbangan kelas ini:

https://knowledgengg.wordpress.com/2019/03/04/this-is-suresh/

saisubrahmanyam janapati
sumber