Bir grubun diğerinden daha fazla temsil edildiği eğitim verilerinden bir SVM oluşturmaya çalışıyorum. Ancak, gruplar nihai test verilerinde eşit olarak temsil edilecektir. Bu nedenle, iki paketin eğitim verilerindeki etkisini dengelemek için R paketi arabiriminin class.weights
parametresini kullanmak istiyorum .e1071
libsvm
Bu ağırlıkların tam olarak nasıl belirlenmesi gerektiğinden emin olmadığım için küçük bir test yaptım:
- Bazı boş veriler oluşturun (rastgele özellikler; grup etiketleri arasında 2: 1 oran)
class.weights
Parametre seti ile bir svm takın .- Bir grup yeni null veri kümesini tahmin edin ve sınıf oranlarına bakın.
- Tüm farklı eğitim setleri için tüm süreci birçok kez çoğaltın.
İşte kullanıyorum R kodu:
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)))
Bütün bu şeyden ~ 0.5 bir çıktı bekliyordum, ancak, ne var bu değil:
> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987
class.weights
Menü noktası, çalışıyor çeşit alt Ben ağırlığı olarak, a
bu simülasyon temsil edilir (ve atlarsanız düşürmek, class.weights
yakın 1'e döner) ... ama sadece 1 ağırlıkları kullanılarak neden anlamıyorum: 2 ( 2: 1 olan egzersiz verileri için) beni% 50'ye kadar indirmiyor.
SVM'leri yanlış anlıyorsam, birisi bu noktayı açıklayabilir mi? (veya bazı referanslar gönderilsin mi?)
Yanlış yapıyorsam, birisi bana class.weights
parametreyi kullanmanın doğru yolunu söyleyebilir mi?
Muhtemelen bir hata olabilir mi? (Bence, bu yazılımı ve altta yatan libsvm'nin oldukça olgun olduğunu anladığım için)