Czy potrafisz wyjaśnić różnicę między SVC a LinearSVC w scikit-learn?

19

Niedawno zacząłem uczyć się pracy sklearni właśnie spotkałem się z tym osobliwym rezultatem.

Użyłem digitsdostępnego zestawu danych, sklearnaby wypróbować różne modele i metody szacowania.

Kiedy testowaliśmy model Pomoc Wektor maszynowego na danych, znalazłem tam są dwie różne klasy w sklearnklasyfikacji SVM: SVCa LinearSVC, gdzie dawne zastosowania jednego przed jednym podejściem i innych zastosowań jedno-przeciw-reszta podejście.

Nie wiedziałem, jaki wpływ może to mieć na wyniki, więc spróbowałem obu. Przeprowadziłem oszacowanie w stylu Monte Carlo, w którym testowałem oba modele 500 razy, za każdym razem losowo dzieląc próbkę na 60% treningu i 40% testu i obliczając błąd prognozy na zestawie testowym.

Zwykły estymator SVC wygenerował następujący histogram błędów: Współczynnik błędów SVC Podczas gdy liniowy estymator SVC wytworzył następujący histogram: Współczynnik błędu liniowego SVC

Co może tłumaczyć tak wyraźną różnicę? Dlaczego model liniowy ma większą dokładność przez większość czasu?

I w związku z tym, co może powodować surową polaryzację wyników? Albo dokładność bliska 1, albo dokładność bliska 0, nic pomiędzy.

Dla porównania, klasyfikacja drzewa decyzyjnego dała znacznie bardziej normalnie rozproszony poziom błędu z dokładnością około 0,85.

metjush
źródło
Zakładam, że dokumentacja scikit-learn nie uwypukla różnicy? Czy sprawdziłeś?
Rohit,
1. Jakiego jądra użyłeś w SVC? ustawienia domyślne = „rbf”? 2. Różne są podejścia jeden na jednego i jeden na wszystkich
kpb
dokumentacja jest dość rzadka / niejasna na ten temat. Wspomina różnicę między jednym przeciw Similar 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).
drugiemu
dla zwykłego SVC użyłem domyślnego jądra. Wiem, że 1v1 i 1vR to różne podejścia, ale myślę, że to właśnie chcę wiedzieć - dlaczego dają tak różne wyniki? Czy to wybór jądra, czy inne podejście do klasyfikacji wielu kategorii?
metjush

Odpowiedzi:

23

Zwykły SVM z wartościami domyślnymi wykorzystuje funkcję radialną jako jądro SVM. Jest to w zasadzie jądro gaussowskie, zwane również krzywą dzwonową. Oznacza to, że ziemia niczyja między różnymi klasami jest tworzona za pomocą funkcji Gaussa. Linear-SVM używa liniowego jądra dla funkcji bazowej, więc możesz myśleć o tym jak o funkcji w kształcie ^. Jest znacznie mniej przestrajalny i jest w zasadzie tylko interpolacją liniową.

Ludzie w pewnym sensie wbijają to pytanie, ponieważ nie dostarczyliście zbyt wielu informacji, ale zaglądają głęboko w to, co opublikowaliście ... uderza to w niektóre podstawowe aspekty naprawdę zrozumienia szczegółów odchylenia i wariancji oraz różnicy między liniową i nieliniową funkcje podstawowe w SVM.

Sprawdź ten obraz opisujący cztery regiony wysokiego i niskiego odchylenia oraz wysokiej i niskiej wariancji. Oczywiście najlepszym miejscem jest niska wariancja i niska stronniczość.

rzutki obraz odchylenia odchylenia

Najpierw oceńmy wariancję -

Teraz spójrz na swoje działki: wprowadź opis zdjęcia tutaj

Nieliniowa funkcja podstawowa ma większą wariancję. Zobacz, jak to jest głośniejsze niż jądro liniowe! Jądro liniowe ma mniejszą wariancję. Zobacz, jak jest mniej głośno!

Teraz pozwala ocenić stronniczość -

Które jądro jest bardziej dokładne? Możemy dodać podane błędy. Nieliniowe jądro ma całkowity błąd ~ 550 + 325 = ~ 875. Jądro liniowe ma błąd ~ 690 + ~ 50 = ~ 740. Jądro liniowe wydaje się ogólnie lepiej, ale ogólnie jest całkiem blisko. Sprawy stają się trudne!

Kładąc wszystko razem

Zobacz, jak jądro liniowe wykonało słabą robotę na zerach i naprawdę świetną robotę na zerach. To jest dość niezrównoważone. Gdzie jako nieliniowe jądro jest bardziej zrównoważone. Wygląda na to, że najlepszym rozwiązaniem może być stworzenie zrównoważonego modelu, który nie ma tak dużej wariancji. Jak kontrolujemy wysoką wariancję? Bingo - regularyzacja. Możemy dodać regularyzację do modelu nieliniowego i prawdopodobnie zobaczymy znacznie lepsze wyniki. Jest to parametr C w scikit learn SVM, który chcesz zwiększyć od wartości domyślnej. Możemy również grać z parametrem gamma. Gamma kontroluje szerokość Gaussa. Może spróbuj zwiększyć nieco ten jeden, aby uzyskać mniej hałaśliwych wyników, np. Większy obszar niczyjej pomiędzy klasami.

Mam nadzieję że to pomoże!

AN6U5
źródło
Parametr C należy zmniejszyć od wartości domyślnej nie zwiększonej.
Hamdi