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)