Я пытаюсь построить 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 достаточно зрелы)
источник
Ответы:
Я думаю, что это может зависеть от значений C и количества паттернов, которые у вас есть. SVM пытается найти дискриминант максимального запаса, поэтому, если у вас есть разреженные данные, возможно, что SVM найдет решение с жестким запасом, если ни один из множителей Лагранжа не достигнет своих верхних границ (в этом случае соотношение штрафов для каждого класс, по сути, не имеет значения, так как слабые переменные малы или равны нулю. Попробуйте увеличить количество тренировочных шаблонов и посмотрите, оказывает ли это влияние (поскольку это снижает вероятность того, что решение с жестким запасом может быть найдено в пределах ограничений блока) ,
Что еще более важно, оптимальные значения C зависят от данных, вы не можете просто установить для них некоторые заранее определенные значения, но вместо этого оптимизировать их, сводя к минимуму ошибку однозначного исключения или некоторую границу обобщения. Если у вас есть несбалансированные классы, вы можете зафиксировать соотношение значений для каждого класса и оптимизировать средний штраф по всем шаблонам.
источник
caret
пакет или встроеннуюtune()
функцию для настройки параметров модели, поэтому мне особенно нравится ваша вторая идея о том, как справиться с этим на практике путем настройки схемы повторной выборки в соответствии с классом меньшинства. Очень признателен.в обучении svm находят опорные векторы, чтобы создать дискриминационную границу, и когда для этого будет достаточно опорных векторов для данных всех классов, это не будет проблемой. в точности результатов тестового набора вы должны учитывать равенство количества данных для всех классов в реальном мире, и для получения реальных результатов вы должны манипулировать данными, а также правильно учитывать их в реальной ситуации.
источник