Я намагаюся створити 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 є досить зрілими)