Можете ли вы объяснить разницу между SVC и LinearSVC в scikit-learn?


19

Я недавно начал учиться работать с sklearnи только что столкнулся с этим странным результатом.

Я использовал digitsдоступный набор данных, sklearnчтобы попробовать разные модели и методы оценки.

Когда я тестировал модель машины опорных векторов на данных, я обнаружил, что есть два разных класса sklearnдля классификации SVM: SVCи LinearSVC, где первый использует подход « один против одного», а другой - подход « один против остальных» .

Я не знал, как это повлияет на результаты, поэтому попробовал оба варианта. Я проводил оценку в стиле Монте-Карло, где я выполнял обе модели по 500 раз, каждый раз разбивая выборку случайным образом на 60% обучения и 40% теста и вычисляя ошибку прогноза на тестовом наборе.

Обычная оценка SVC выдает следующую гистограмму ошибок: в Частота ошибок SVC то время как оценка линейного SVC выдает следующую гистограмму: Линейная частота ошибок SVC

Что может объяснить такую ​​резкую разницу? Почему линейная модель большую часть времени обладает такой высокой точностью?

И, соответственно, что может быть причиной резкой поляризации результатов? Либо с точностью, близкой к 1, либо с точностью, близкой к 0, между ними ничего нет.

Для сравнения, классификация дерева решений выявила гораздо более нормально распределенный коэффициент ошибок с точностью около 0,85.


Я предполагаю, что документация scikit-learn не подчеркивает разницу? Ты проверил?
Rohit

1. Какое ядро ​​вы использовали в SVC? настройки по умолчанию = "rbf"? 2. Один против один и один-против-все разные подходы
КПБ

документация довольно скудная / расплывчатая по теме. В нем упоминается разница между «один против одного» и «один против остальных», и что линейный SVSSimilar to SVC with parameter kernel=’linear’, but implemented in terms of liblinear rather than libsvm, so it has more flexibility in the choice of penalties and loss functions and should scale better (to large numbers of samples).
metjush

для обычного SVC я использовал ядро ​​по умолчанию. Я знаю, что 1v1 и 1vR - разные подходы, но я думаю, что это то, что я хочу знать - почему они дают такие разные результаты? Это выбор ядра или другой подход к классификации нескольких категорий?
мая

Ответы:


23

Обычный SVM со значениями по умолчанию использует радиальную базисную функцию в качестве ядра SVM. Это в основном ядро ​​Гаусса, известное как кривая колокола. Это означает, что ничья земля между различными классами создается с помощью гауссовой функции. Линейный SVM использует линейное ядро ​​для базисной функции, поэтому вы можете думать об этом как о функции в форме ^. Это гораздо менее настраиваемый и в основном просто линейная интерполяция.

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

Проверьте это изображение, описывающее четыре области высокого и низкого смещения и высокого и низкого отклонения. Очевидно, что лучшее место для этого - низкая дисперсия и низкий уклон.

изображение отклонения дротиков

Сначала давайте оценим дисперсию -

Теперь взгляните на свои участки: введите описание изображения здесь

Нелинейная базисная функция имеет большую дисперсию. Посмотрите, как оно шумнее, чем линейное ядро! Линейное ядро ​​имеет меньшую дисперсию. Посмотрите, как это менее шумно!

Теперь давайте оценим уклон -

Какое ядро ​​более точное? Мы можем добавить ошибки, которые вы предоставили. Нелинейное ядро ​​имеет общую ошибку ~ 550 + 325 = ~ 875. Линейное ядро ​​имеет ошибку ~ 690 + ~ 50 = ~ 740. Таким образом, линейное ядро в целом выглядит лучше, но в целом они довольно близки. Это было сложно!

Собираем все вместе

Посмотрите, как линейное ядро ​​плохо справилось с 1 и действительно отлично справилось с 0. Это довольно неуравновешенно. Где как нелинейное ядро ​​более сбалансировано. Кажется, что самое приятное в этом вопросе - создать сбалансированную модель, которая не имеет такой высокой дисперсии. Как мы контролируем высокую дисперсию? Бинго - регуляризация. Мы можем добавить регуляризацию к нелинейной модели и, вероятно, увидим гораздо лучшие результаты. Это параметр C в scikit learn SVM, который вы хотите увеличить по умолчанию. Мы также могли бы поиграть с гамма-параметром. Гамма контролирует ширину гауссиана. Может быть, попробуйте увеличить его немного, чтобы получить менее шумные результаты, например, большая ничейная земля между классами.

Надеюсь это поможет!


Параметр C необходимо уменьшить, по умолчанию не увеличивать.
Хамди

4

Если вы использовали ядро ​​по умолчанию в SVC (), ядре Radial Basis Function (rbf), то вы, вероятно, узнали более нелинейную границу решения. В случае набора данных цифр это значительно превзойдет линейную границу решения по этой задаче (см. 3.1 «Базовый линейный классификатор»)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.