Cara terbaik untuk menangani dataset multiclass tidak seimbang dengan SVM

9

Saya mencoba membangun model prediksi dengan SVM pada data yang cukup tidak seimbang. Label / output saya memiliki tiga kelas, positif, netral dan negatif. Saya akan mengatakan contoh positif membuat sekitar 10 - 20% dari data saya, netral sekitar 50 - 60%, dan negatif sekitar 30 - 40%. Saya mencoba menyeimbangkan kelas karena biaya yang terkait dengan prediksi yang salah di antara kelas tidak sama. Salah satu metode adalah resampling data pelatihan dan menghasilkan dataset yang seimbang, yang lebih besar dari aslinya. Menariknya, ketika saya melakukan itu, saya cenderung mendapatkan prediksi yang lebih baik untuk kelas lain (misalnya ketika saya menyeimbangkan data, saya meningkatkan jumlah contoh untuk kelas positif, tetapi di luar dari sampel prediksi, kelas negatif melakukan lebih baik). Adakah yang bisa menjelaskan mengapa ini terjadi secara umum? Jika saya menambah jumlah contoh untuk kelas negatif, apakah saya akan mendapatkan sesuatu yang serupa dengan kelas positif di luar prediksi sampel (misalnya, prediksi yang lebih baik)?

Juga sangat terbuka untuk pemikiran lain tentang bagaimana saya dapat mengatasi data yang tidak seimbang baik dengan mengenakan biaya yang berbeda pada kesalahan klasifikasi atau menggunakan bobot kelas di LibSVM (tidak yakin bagaimana memilih / menyetel yang benar meskipun).

tomas
sumber

Jawaban:

6

Memiliki hukuman yang berbeda untuk variabel margin slack untuk pola masing-masing kelas adalah pendekatan yang lebih baik daripada melakukan resampling data. Itu asymptotically ekuivalen dengan resampling, tetapi lebih penting untuk diterapkan dan berkelanjutan, daripada diskrit, sehingga Anda memiliki lebih banyak kontrol.

Namun, memilih bobot tidak mudah. Pada prinsipnya Anda dapat menentukan bobot teoretis yang memperhitungkan biaya kesalahan klasifikasi dan perbedaan antara pelatihan yang menetapkan probabilitas kelas sebelum operasional, tetapi tidak akan memberikan kinerja yang optimal. Hal terbaik untuk dilakukan adalah memilih hukuman / bobot untuk setiap kelas melalui meminimalkan kerugian (dengan mempertimbangkan biaya kesalahan klasifikasi) dengan validasi silang.

Dikran Marsupial
sumber
Apakah ada cara otomatis tentang cara melakukannya, atau apakah ada pelajar yang memiliki fungsi ini?
Vam
Saya biasanya hanya menulis fungsi matlab untuk mengevaluasi kerugian untuk serangkaian hukuman tertentu dan kemudian menguranginya menggunakan algoritma simpleks Nelder-Mead. Saya tidak tahu ada perpustakaan yang memiliki built in ini.
Dikran Marsupial
@DikranMarsupial Apakah pencarian grid dari dua variabel slack margin dalam masalah dua kelas setara dengan apa yang Anda lakukan dengan algoritma simpleks?
Spacey
@Tula, ya, metode pengoptimalan yang tepat relatif tidak penting, poin utamanya adalah memastikan bahwa Anda mengoptimalkan statistik validasi silang yang benar-benar Anda minati untuk keperluan aplikasi Anda (yaitu frekuensi kelas yang sama yang ditemukan dalam penggunaan operasional. dan memperhitungkan biaya kesalahan klasifikasi akun jika diketahui).
Dikran Marsupial