SVM с неравными размерами групп в данных обучения

12

Я пытаюсь построить SVM из данных обучения, где одна группа представлена ​​больше, чем другая. Тем не менее, группы будут в равной степени представлены в возможных данных испытаний. Поэтому я хотел бы использовать class.weightsпараметр e1071интерфейса пакета R, libsvmчтобы сбалансировать влияние двух групп в данных обучения.

Поскольку я не был уверен, как именно эти веса должны быть указаны, я настроил небольшой тест:

  1. Генерация некоторых нулевых данных (случайные особенности; соотношение 2: 1 между метками группы)
  2. Установите SVM с class.weightsнабором параметров.
  3. Предскажите кучу новых нулевых наборов данных и посмотрите на пропорции классов.
  4. Повторяйте весь процесс много раз для разных нулевых тренировочных наборов.

Вот код 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 достаточно зрелы)

Джон Колби
источник
У меня нет опыта работы с libsvm, но с LiblineaR вес классов очень важен. При правильной настройке вы получите неоптимальные результаты, если ваши классы сильно разбалансированы. Я бы посоветовал: получить реальный набор данных с несбалансированными классами и попробовать разные значения class.weights (в LiblineaR wi). LiblineaR на несколько порядков быстрее для линейного ядра и также использует штрафные методы. По моему опыту, вы сначала находите приличный вес класса, а затем оптимизируете C.
Marbel

Ответы:

7

Я думаю, что это может зависеть от значений C и количества паттернов, которые у вас есть. SVM пытается найти дискриминант максимального запаса, поэтому, если у вас есть разреженные данные, возможно, что SVM найдет решение с жестким запасом, если ни один из множителей Лагранжа не достигнет своих верхних границ (в этом случае соотношение штрафов для каждого класс, по сути, не имеет значения, так как слабые переменные малы или равны нулю. Попробуйте увеличить количество тренировочных шаблонов и посмотрите, оказывает ли это влияние (поскольку это снижает вероятность того, что решение с жестким запасом может быть найдено в пределах ограничений блока) ,

Что еще более важно, оптимальные значения C зависят от данных, вы не можете просто установить для них некоторые заранее определенные значения, но вместо этого оптимизировать их, сводя к минимуму ошибку однозначного исключения или некоторую границу обобщения. Если у вас есть несбалансированные классы, вы можете зафиксировать соотношение значений для каждого класса и оптимизировать средний штраф по всем шаблонам.

Дикран Сумчатый
источник
Это имеет смысл. Когда я уменьшаю количество объектов и увеличиваю количество наблюдений в этой симуляции, выходное значение приближается к 0,5. Тем не менее, это никогда не дойдет до конца - даже с 900 строк и только 1 столбец.
Джон Колби
Конечно, на реальных данных я всегда использую caretпакет или встроенную tune()функцию для настройки параметров модели, поэтому мне особенно нравится ваша вторая идея о том, как справиться с этим на практике путем настройки схемы повторной выборки в соответствии с классом меньшинства. Очень признателен.
Джон Колби
рад, что ваше предложение было полезно. Существует документ по настройке оптимального соотношения, который также может быть полезен theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf Однако оптимальная теоретическая коррекция не всегда оптимальна на практике, поэтому лучшие результаты могут фактически получить путем настройки двух отдельных параметров C без принудительного определения конкретного соотношения, но при этом оценивая шаблоны в соответствии с классом при оценке критерия выбора модели "оставь один".
Дикран Marsupial
2
Я также хотел бы добавить, что в настоящее время я склонен использовать регрессию гребня ядра, а не SVM, поскольку у вас нет подобных противоречивых проблем из-за разрыва производной функции потерь. Довольно часто, если вы правильно настраиваете SVM L2, вы получаете очень маленькое значение C, и все данные являются SV, и в любом случае у вас есть модель KRR. Чем больше я их использовал, тем менее полезными я нашел SVM на практике, хотя теоретические идеи, которые они привели, были жизненно важны.
Дикран Marsupial
0

в обучении svm находят опорные векторы, чтобы создать дискриминационную границу, и когда для этого будет достаточно опорных векторов для данных всех классов, это не будет проблемой. в точности результатов тестового набора вы должны учитывать равенство количества данных для всех классов в реальном мире, и для получения реальных результатов вы должны манипулировать данными, а также правильно учитывать их в реальной ситуации.

ho3ein
источник
Этот ответ на данный момент довольно неясен - я подумал о том, чтобы дать ему копию-редактирование, но есть несколько мест, где я не был уверен, что вы намеревались. Пунктуация и грамматика важны для передачи значения.
Серебряная рыба