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.
березня

Відповіді:


7

Я думаю, це може залежати від значень C і кількості моделей, які ви маєте. SVM намагається знайти максимальну різницю межі, тому якщо у вас є розрізнені дані, то, можливо, SVM може знайти рішення з жорсткою маржиною без того, щоб будь-який множник Lagrange досягнув їх верхньої межі (у цьому випадку співвідношення штрафних санкцій для кожного клас суттєво не має значення, оскільки слабкі показники малі або нульові. Спробуйте збільшити кількість моделей тренувань і побачити, чи має це ефект (оскільки це робить меншою ймовірність того, що рішення з жорстким запасом можна знайти в межах обмежень) .

Що ще важливіше, оптимальні значення C залежать від даних, ви можете не просто встановити їх на певні заздалегідь визначені значення, а натомість оптимізувати їх, зводячи до мінімуму помилку "вихід-один-вихід" або деяку прив'язку узагальнення. Якщо у вас незбалансовані класи, ви можете виправити співвідношення значень для кожного класу та оптимізувати середнє покарання за всіма шаблонами.


Це має сенс. Коли я зменшую кількість функцій та збільшую кількість спостережень у цій симуляції, вихідне значення рухається ближче до 0,5. Однак він ніколи не потрапляє туди - навіть із 900 рядками та лише 1 стовпчиком.
Джон Колбі

Звичайно, щодо реальних даних я завжди використовую caretпакет або вбудовану tune()функцію для настройки параметрів моделі, тому мені особливо подобається ваша друга ідея того, як впоратися з цим на практиці, налаштовуючи схему перекомпонування, щоб надавати перевагу класу меншин. Цінується.
Джон Колбі

рада, що пропозиція була корисною. Існує документ про встановлення оптимального співвідношення, яке також може бути корисним theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf Однак оптимальна теоретична корекція не завжди є оптимальною на практиці, тому найкращі результати можуть бути насправді отримують, налаштовуючи два окремих параметра C, не примушуючи певного співвідношення, але зважуючи шаблони відповідно до класу при оцінці критерію вибору моделі «відхід один».
Дікран Марсупіал

2
Я також додам, що в ці дні я, як правило, використовую регресію хребта ядра, а не SVM, оскільки у вас немає подібних контрінтуїтивних проблем через розрив похідної функції втрати. Досить часто, якщо ви правильно налаштували L2 SVM, ви отримуєте дуже мале значення C, а всі дані - SV, і в будь-який момент у вас є модель KRR. Чим більше я їх використовував, тим менш корисними я знаходив SVM на практиці, хоча теоретичні уявлення, які вони принесли, були життєво важливими.
Дікран Марсупіал

0

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


Ця відповідь на даний момент досить незрозуміла - я розглядав можливість її редагування копії, але є кілька місць, де я не знаю, що ти маєш намір. Пунктуація та граматика важливі для передачі значення.
Срібна рибка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.