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.weights
parameter e1071
antarmuka paket R libsvm
untuk menyeimbangkan pengaruh dua kelompok dalam data pelatihan.
Karena saya tidak yakin persis bagaimana bobot ini harus ditentukan, saya membuat sedikit tes:
- Hasilkan beberapa data nol (fitur acak; rasio 2: 1 antara label grup)
- Paskan svm dengan
class.weights
set parameter. - Memprediksi sekelompok dataset nol baru dan melihat proporsi kelas.
- 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.weights
Penyempitan bekerja, semacam , sebagai saya berat badan lebih rendah a
, yang menurunkan itu diwakili dalam simulasi ini (dan jika saya menghilangkan class.weights
itu 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.weights
parameter?
Mungkinkah itu bug? (Saya pikir tidak, karena saya mengerti perangkat lunak ini dan libsvm yang mendasarinya cukup matang)
sumber
Jawaban:
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.
sumber
caret
paket atau fungsi built-intune()
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.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.
sumber