Гораздо хуже производительность с ядром RBF, чем линейная в SVM в python scikit-learn

Я выполняю некоторые задачи машинного обучения, используя SVM. Я подозреваю, что данные нелинейны, поэтому я также включил ядро ​​RBF. Я обнаружил, что SVM с ядром RBF НАМНОГО хуже, чем линейный SVM. Интересно, сделал ли я что-то не так со спецификациями параметров моего классификатора.

Мой код выглядит следующим образом:

from sklearn.svm import LinearSVC
from sklearn.svm import SVC

svm1 = LinearSVC() # performs the best, similar to logistic regression results which is expected
svm2 = LinearSVC(class_weight="auto") # performs somewhat worse than svm1
svm3 = SVC(kernel='rbf', random_state=0, C=1.0, cache_size=4000, class_weight='balanced') # performs way worse than svm1; takes the longest processing time
svm4 = SVC(kernel='rbf', random_state=0, C=1.0, cache_size=4000) # this is the WORST of all, the classifier simply picks the majority class

person KubiK888    schedule 08.01.2016    source источник


Ответы (2)


С помощью RBF попробуйте настроить параметры C и gamma. Вам поможет поиск по сетке Scikit-learn.

Вот пример для начала:

svc = SVC(...)
params = {"C":[0.1, 1, 10], "gamma": [0.1, 0.01, 0.001]}
grid_search = GridSearchCV(svc, params)
grid_search.fit(X,y)
person David Maust    schedule 08.01.2016
comment
Вы правы, при повороте C и гаммы производительность резко улучшилась. Интересно, если SVM (с нелинейным ядром) работает не лучше, чем SVM с линейным ядром, значит ли это, что классы линейно разделимы? - person KubiK888; 08.01.2016
comment
Попробуйте настроить свой линейный svm. Нет гаммы для линейного, только C. Вы можете быть удивлены тем, что становится линейно разделимым в пространстве высокой размерности. - person David Maust; 08.01.2016
comment
В пространствах большой размерности линейный svm обычно работает лучше. Пространства с низкой размерностью, RBF работает лучше. - person David Maust; 08.01.2016
comment
В высоком измерении вы имеете в виду количество функций, верно? Не могли бы вы объяснить или сослаться на то, почему в больших размерах линейный svm работает лучше? Не должно ли чем больше измерений, тем труднее разделить с помощью прямой линии/плоскости? - person KubiK888; 08.01.2016
comment
да. Под размерами я подразумеваю количество функций. В многомерных пространствах расстояние между точками становится менее значимым, поэтому ядро ​​менее значимо. См. en.wikipedia.org/wiki/Curse_of_Dimensionity. Кроме того, в многомерных пространствах часто становится проще создать линейную границу решения. - person David Maust; 08.01.2016

Следующая статья является хорошим руководством для пользователей SVM.

Практическое руководство по классификации опорных векторов http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

В двух словах, для правильной работы SVM необходимы три момента.

  • (1) подготовка признаков (масштабирование признаков, категоризация признаков)
  • (2) настройка параметров (грубая и точная перекрестная проверка)
  • (3) выбор ядра (#features vs #instances)

Основная идея для (3) состоит в том, чтобы выбрать линейное ядро, если #features >> #instances. С небольшими экземплярами SVM с нелинейными ядрами можно легко переобучить.

person sy2    schedule 10.01.2016