SVM dengan ukuran kelompok yang tidak sama dalam data pelatihan

12

Saya mencoba membangun SVM dari data pelatihan di mana satu kelompok diwakili lebih dari yang lain. Namun, kelompok-kelompok tersebut akan terwakili secara setara dalam data uji yang akhirnya. Oleh karena itu, saya ingin menggunakan class.weightsparameter e1071antarmuka paket R libsvmuntuk menyeimbangkan pengaruh dua kelompok dalam data pelatihan.

Karena saya tidak yakin persis bagaimana bobot ini harus ditentukan, saya membuat sedikit tes:

  1. Hasilkan beberapa data nol (fitur acak; rasio 2: 1 antara label grup)
  2. Paskan svm dengan class.weightsset parameter.
  3. Memprediksi sekelompok dataset nol baru dan melihat proporsi kelas.
  4. Gandakan seluruh proses berkali-kali untuk set pelatihan nol yang berbeda.

Ini kode R yang saya gunakan:

nullSVM <- function(n.var, n.obs) {
    # Simulate null training data
    vars   = matrix(rnorm(n.var*n.obs), nrow=n.obs)
    labels = rep(c('a', 'a', 'b'), length.out=n.obs)
    data   = data.frame(group=labels, vars)

    # Fit SVM
    fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))

    # Calculate the average fraction of 'a' we would predict from null test data
    mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}

library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))

Dari semua ini saya mengharapkan output ~ 0,5, namun, bukan itu yang saya dapatkan:

> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987

The class.weightsPenyempitan bekerja, semacam , sebagai saya berat badan lebih rendah a, yang menurunkan itu diwakili dalam simulasi ini (dan jika saya menghilangkan class.weightsitu kembali mendekati 1) ... tapi saya tidak mengerti mengapa hanya menggunakan bobot dari 1: 2 ( untuk data pelatihan yang 2: 1) tidak membuat saya sampai 50%.

Jika saya salah memahami SVM, dapatkah seseorang menjelaskan hal ini? (atau mengirim beberapa referensi?)

Jika saya melakukan kesalahan, dapatkah seseorang memberi tahu saya cara yang benar untuk menggunakan class.weightsparameter?

Mungkinkah itu bug? (Saya pikir tidak, karena saya mengerti perangkat lunak ini dan libsvm yang mendasarinya cukup matang)

John Colby
sumber
Saya tidak memiliki pengalaman dengan libsvm tetapi dengan LiblineaR, bobot kelas sangat penting. Tanpa mengaturnya dengan benar, Anda mendapatkan hasil yang kurang optimal jika kelas Anda sangat tidak seimbang. Saya akan menyarankan: Dapatkan dataset nyata dengan kelas yang tidak seimbang dan coba nilai yang berbeda dari class.weights (dalam LiblineaR wi). LiblineaR adalah urutan besarnya lebih cepat untuk kernel lineal dan juga telah menghukum metode. Dalam pengalaman saya, Anda pertama-tama menemukan bobot kelas yang layak dan kemudian mengoptimalkan C.
marbel

Jawaban:

7

Saya pikir itu mungkin tergantung pada nilai-nilai C dan jumlah pola yang Anda miliki. SVM mencoba menemukan margin maksimum yang diskriminatif, jadi jika Anda memiliki data yang jarang maka mungkin SVM dapat menemukan solusi margin keras tanpa pengganda Lagrange yang mencapai batas atas mereka (dalam hal ini rasio hukuman untuk masing-masing kelas pada dasarnya tidak relevan karena slack-valiables kecil atau nol. Cobalah meningkatkan jumlah pola pelatihan dan lihat apakah itu berpengaruh (karena itu membuat kemungkinan yang lebih kecil bahwa solusi hard-margin dapat ditemukan di dalam kotak-kendala) .

Lebih penting lagi, nilai-nilai optimal C bergantung pada data, Anda tidak bisa hanya menetapkannya ke beberapa nilai yang ditentukan sebelumnya, tetapi mengoptimalkannya dengan meminimalkan kesalahan tinggalkan satu atau keluar atau beberapa batasan generalisasi. Jika Anda memiliki kelas yang tidak seimbang, Anda dapat memperbaiki rasio nilai untuk setiap kelas, dan mengoptimalkan penalti rata-rata atas semua pola.

Dikran Marsupial
sumber
Ini masuk akal. Ketika saya mengurangi jumlah fitur dan meningkatkan jumlah pengamatan dalam simulasi ini, nilai output bergerak mendekati 0,5. Namun, itu tidak pernah sampai di sana - bahkan dengan 900 baris dan hanya 1 kolom.
John Colby
Tentu saja pada data nyata saya selalu menggunakan caretpaket atau fungsi built-in tune()untuk tuning parameter model, jadi saya terutama menyukai ide kedua Anda untuk bagaimana menangani hal ini dalam praktik dengan menyesuaikan skema resampling untuk mendukung kelas minoritas. Sangat dihargai.
John Colby
senang saran Anda bermanfaat. Ada makalah tentang pengaturan rasio optimal yang mungkin juga berguna theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf Namun, koreksi teoritis optimal tidak selalu optimal dalam praktiknya, sehingga hasil terbaik mungkin sebenarnya dapat diperoleh dengan menyetel dua parameter C yang terpisah tanpa memaksakan rasio tertentu, tetapi menimbang pola menurut kelas ketika mengevaluasi kriteria pemilihan model meninggalkan-satu-keluar.
Dikran Marsupial
2
Saya juga akan menambahkan, hari ini saya cenderung menggunakan regresi ridge kernel daripada SVM karena Anda tidak memiliki masalah kontra-intuitif semacam ini karena diskontinuitas dalam turunan dari fungsi kerugian. Cukup sering jika Anda menyetel L2 SVM dengan benar, Anda berakhir dengan nilai C yang sangat kecil dan semua data adalah SV, pada titik mana Anda memiliki model KRR. Semakin saya menggunakannya, semakin tidak berguna saya menemukan SVM dalam praktek, meskipun wawasan teoritis yang mereka bawa sangat penting.
Dikran Marsupial
0

dalam pelatihan, svm menemukan vektor dukungan untuk membuat batas diskriminatif dan ketika ada cukup vektor dukungan untuk semua data kelas untuk melakukannya, itu tidak akan menjadi masalah. dalam ketepatan hasil set tes, Anda harus mempertimbangkan jumlah data yang setara untuk semua kelas di dunia nyata dan untuk mendapatkan hasil nyata, Anda harus memanipulasi data dan juga dipertimbangkan dengan benar dalam situasi nyata.

ho3ein
sumber
Jawaban ini agak tidak jelas saat ini - saya mempertimbangkan untuk memberikannya salinan-edit tetapi ada beberapa tempat di mana saya tidak yakin apa yang Anda maksudkan. Tanda baca dan grammmar penting untuk menyampaikan makna.
Silverfish