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:
- Hasilkan beberapa data nol (fitur acak; rasio 2: 1 antara label grup)
- Paskan svm dengan
class.weightsset 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.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)