Data multi-kelas miring

10

Saya memiliki dataset yang berisi ~ 100.000 sampel dari 50 kelas. Saya telah menggunakan SVM dengan kernel RBF untuk melatih dan memprediksi data baru. Masalahnya adalah dataset cenderung condong ke kelas yang berbeda.

Misalnya, Kelas 1 - 30 (masing-masing 3%), Kelas 31 - 45 (~ masing-masing 0,6%), Kelas 46 - 50 (masing-masing ~ 0,2%)

Saya melihat bahwa model cenderung sangat jarang memprediksi kelas-kelas yang lebih jarang terjadi di set pelatihan, meskipun set tes memiliki distribusi kelas yang sama dengan set pelatihan.

Saya sadar bahwa ada teknik seperti 'undersampling' di mana kelas mayoritas diturunkan ke kelas minor. Namun, apakah ini berlaku di sini di mana ada begitu banyak kelas yang berbeda? Apakah ada metode lain untuk membantu menangani kasus ini?

mike1886
sumber

Jawaban:

5

Saya akan menyarankan Anda untuk menggunakan libsvm, yang sudah memiliki bobot kelas yang dapat disesuaikan diimplementasikan di dalamnya. Daripada mereplikasi sampel pelatihan, satu memodifikasi parameter C untuk kelas yang berbeda dalam optimasi SVM. Misalnya jika data Anda memiliki 2 kelas, dan kelas pertama hanya 10% dari data, Anda akan memilih bobot kelas menjadi 10 dan 1 untuk masing-masing kelas 1 dan 2. Oleh karena itu, pelanggaran margin kelas pertama akan menelan biaya 10 kali lebih banyak daripada pelanggaran margin untuk kelas kedua, dan akurasi per kelas akan lebih seimbang.

magicharp
sumber
terima kasih atas sarannya, apakah Anda tahu jika libsvm secara otomatis melakukan ini atau apakah saya harus secara manual lulus dalam bobot kelas?
mike1886
Anda harus lulus bobot kelas secara manual. Cara melakukannya berbeda berdasarkan antarmuka yang Anda gunakan (python, java, matlab, c). Ini didokumentasikan dengan baik dalam file baca saya jika Anda mengunduh alat dari csie.ntu.edu.tw/~cjlin/libsvm . Juga ukuran data Anda tampaknya besar dan implementasi libsvm multi-kelas standar akan menggunakan klasifikasi satu-lawan-satu yang mungkin terlalu lama untuk dijalankan. Anda dapat mencoba melatih 50 satu-vs-semua pengklasifikasi biner menentukan bobot dengan tepat.
magicharp
2

Saya bukan ekspor dalam menggunakan SVM, tetapi biasanya (jika Anda menggunakan perpustakaan pembelajaran mesin seperti Python scikit-learnatau R libsvm, ada class_weightparameter, atau class.weights, masing-masing.

Atau jika Anda akan menggunakan pengklasifikasi Bayes, Anda akan mempertimbangkan "condong" ini melalui probabilitas "prior (class)" P (ω j )


sumber
1

Mengenai pendekatan, SVM dengan kernel RBF melakukan pekerjaan dengan baik, tetapi SVM dapat diperlambat oleh ukuran objek besar, kecuali jika Anda menggunakan CV dengan misalnya sepersepuluh dari data yang secara acak ditugaskan untuk setiap lipatan. Namun, apakah Anda bertanya pada diri sendiri mengapa Anda menggunakan SVM sejak awal?

Sudahkah Anda mencoba regresi linier multivariat, , di mana setiap catatan dikodekan jika objek ke- ada di class , dan sebaliknya? Jika akurasi klasifikasi cukup tinggi menggunakan regresi linier, maka data Anda terpisah secara linear, dan metode yang lebih kompleks seperti SVM dan JST tidak diperlukan. Langkah 2 akan menunjukkan bahwa tetangga terdekat k, naif Bayes, analisis diskriminan linear (Fisher), regresi logistik politomous, dll., Rusak dan gagal.Y=XβYyij=+1ijyij=1

Untuk terminologi, Anda mungkin membahas masalah memiliki lebih banyak bobot kelas dalam konteks "proporsi objek yang lebih rendah di kelas tertentu," atau "ukuran kelas hampir nol." Cenderung cenderung digunakan untuk menggambarkan distribusi nilai-nilai fitur, seperti pada kemiringan, ekor gemuk, dll.

Berapa banyak fitur yang Anda miliki? Apakah Anda mencoba pengelompokan tanpa pengawasan (penemuan kelas) pada 100.000 objek sebelum mencoba klasifikasi yang diawasi (prediksi kelas) dengan SVM? Mungkin 100.000 objek dapat dikelompokkan ke dalam kurang dari 50 kelas, yang keanggotaan kelas baru dapat digunakan sebagai kelas target selama analisis klasifikasi. Ini dapat meringankan masalah memiliki ukuran kelas yang hampir nol.


sumber
1

Saya telah menghadapi masalah ini berkali-kali saat menggunakan SVM dengan kernel Rbf. Menggunakan kernel Linear dan bukan kernel Rbf memecahkan masalah saya, tetapi saya berurusan dengan jumlah kelas yang lebih sedikit. Hasilnya kurang miring dan lebih akurat dengan kernel linear. Semoga ini bisa menyelesaikan masalah Anda.

Sunting: Ketika saya menulis jawaban asli saya cukup naif untuk tidak mempertimbangkan bobot kelas sebagai salah satu dari mereka menjawab dengan benar. Juga, saat menggunakan rbf kernel, penting untuk memastikan bahwa parameter penalti atau nilai 'C' sesuai modul svm sklearn terlalu umum. Saya menemukan bahwa nilai default C = 1 terlalu umum sebagian besar waktu dan saya biasanya berakhir dengan nilai C = 10000. Semoga ini bisa membantu orang lain yang mendapatkan hasil yang miring dengan svm (rbf) meskipun memiliki distribusi kelas yang baik dalam data.

pengguna776193
sumber
Terima kasih balasannya! Saya sebenarnya telah mencoba berbagai algoritma / kernel lain dan masih memiliki jenis masalah yang sama. Jadi saya mencari lebih banyak pendekatan seperti undersampling atau cara untuk meratakan kelas.
mike1886
Ok, Anda mungkin juga ingin mencoba mereplikasi baris untuk kelas yang berisi data jarang, meskipun hanya berguna jika fitur data jarang benar-benar bagus.
user776193