Я пытаюсь построить SVM из данных обучения, где одна группа представлена больше, чем другая. Тем не менее, группы будут в равной степени представлены в возможных данных испытаний. Поэтому я хотел бы использовать class.weights
параметр e1071
интерфейса пакета R, libsvm
чтобы сбалансировать влияние двух групп в данных обучения.
Поскольку я не был уверен, как именно эти веса должны быть указаны, я настроил небольшой тест:
- Генерация некоторых нулевых данных (случайные особенности; соотношение 2: 1 между метками группы)
- Установите SVM с
class.weights
набором параметров. - Предскажите кучу новых нулевых наборов данных и посмотрите на пропорции классов.
- Повторяйте весь процесс много раз для разных нулевых тренировочных наборов.
Вот код R, который я использую:
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)))
От всего этого я ожидал выхода ~ 0.5, но это не то, что я получил:
> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987
Параметр class.weights
работает, чем меньше вес I a
, тем ниже он представлен в этом моделировании (и если я class.weights
его опускаю, он возвращается близко к 1) ... но я не понимаю, почему просто использовать веса 1: 2 ( для тренировочных данных, которые составляют 2: 1), не доходят до 50%.
Если я неправильно понимаю SVM, кто-то может объяснить этот момент? (или отправить несколько ссылок?)
Если я делаю это неправильно, может кто-нибудь сказать мне правильный способ использования class.weights
параметра?
Может ли это быть ошибкой? (Я думаю, что нет, так как я понимаю, что это программное обеспечение и лежащий в его основе libsvm достаточно зрелы)