Sto cercando di creare un SVM dai dati di allenamento in cui un gruppo è rappresentato più dell'altro. Tuttavia, i gruppi saranno equamente rappresentati nei dati di prova finali. Pertanto, vorrei utilizzare il class.weightsparametro dell'interfaccia del e1071pacchetto R libsvmper bilanciare l'influenza dei due gruppi nei dati di allenamento.
Dato che non ero sicuro di come specificare questi pesi, ho impostato un piccolo test:
- Genera alcuni dati null (funzioni casuali; rapporto 2: 1 tra le etichette di gruppo)
- Adatta uno svm al
class.weightsset di parametri. - Prevedi un sacco di nuovi set di dati null e osserva le proporzioni della classe.
- Replicare più volte l'intero processo per diversi set di addestramento null.
Ecco il codice R che sto usando:
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)))
Da tutta questa cosa mi aspettavo un output di ~ 0,5, tuttavia, non è quello che ho ottenuto:
> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987
Il class.weightsparamter sta lavorando, una sorta di , come il peso mi minore a, più basso è rappresentato in questa simulazione (e se tralascio class.weightsritorna prossimo a 1) ... ma io non capisco perché semplicemente utilizzando pesi di 1: 2 ( per i dati di allenamento 2: 1) non mi porta fino al 50%.
Se sto fraintendendo gli SVM, qualcuno può spiegare questo punto? (o inviare alcuni riferimenti?)
Se sto sbagliando, qualcuno può dirmi il modo corretto di utilizzare il class.weightsparametro?
Potrebbe essere forse un bug? (Penso di no, dal momento che capisco che questo software e il libsvm sottostante sono abbastanza maturi)