Чи можете ви пояснити різницю між SVC та LinearSVC у scikit-learn?


19

Нещодавно я почав вчитися працювати sklearnі щойно натрапив на цей своєрідний результат.

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

Коли я тестував модель підтримки Vector Vector на даних, я виявив, що існує два різних класи sklearnдля класифікації SVM: SVCі LinearSVC, коли перший використовує підхід один проти одного, а другий використовує підхід один проти відпочинку .

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

Звичайний SVC-оцінювач видав наступну гістограму помилок: Швидкість помилок SVC Хоча лінійний оцінювач SVC виробляв наступну гістограму: Лінійний показник помилок SVC

Що може пояснити таку різку різницю? Чому лінійна модель більшу частину часу має таку більш високу точність?

І, що, відповідно, що може бути причиною різкої поляризації в результатах? Точність, близька до 1, або точність, близька до 0, нічого середнього.

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


Я припускаю, що документація наукового навчання не підкреслює різницю? Ви перевірили?
Рохіт

1. Яке ядро ​​ви використовували у SVC? налаштування за замовчуванням = "rbf"? 2. Один проти одного і один проти всіх - це різні підходи
kpb

документація на якусь тему рідка / розпливчаста. Він згадує різницю між «проти» і «проти», і що лінійний 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 - це різні підходи, але, мабуть, саме це я хочу знати - чому вони дають такі різні результати? Це вибір ядра чи різний підхід до класифікації кількох категорій?
metjush

Відповіді:


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.