2016-01-29 13 views
5

Z moich badań, znalazłem trzy sprzeczne wyniki:LInearSVC vs. SVC (kernel = 'linear'): Sprzeczne argumenty?

  1. SVC(kernel="linear") is better
  2. LinearSVC is better
  3. Doesn't matter

Może ktoś wyjaśnić kiedy używać LinearSVC Vs. SVC(kernel="linear")?

Wygląda na to, że LinearSVC jest nieznacznie lepszy od SVC i jest zwykle bardziej skomplikowany. Ale jeśli scikit postanowił poświęcić czas na zaimplementowanie konkretnego przypadku klasyfikacji liniowej, dlaczego nie miałby on być lepszy od LinearSVC nadrzędnego względem SVC?

+1

To nie jest tak, że scikit-learn opracował dedykowany algorytm dla liniowego SVM. Zamiast tego zaimplementowali interfejsy na dwóch popularnych istniejących implementacjach. Podstawowa implementacja C dla 'LinearSVC' jest liblinear, a solver dla' SVC' to libsvm. Trzecia to implementacja to 'SGDClassifier (loss =" hinge ")'. –

+0

Możliwy duplikat [W jakich parametrach są SVC i LinearSVC w równoważniku naukowym scikit?] (Http: // stackoverflow.com/questions/33843981/under-what-parameters-is-svc-and-linearsvc-in-scikit-learn-equivalent-odpowiednik) – lejlot

Odpowiedz

10

Matematyczne, optymalizacja SVM jest problemem optymalizacji wypukłej, zwykle z unikalnym minimizerem. Oznacza to, że istnieje tylko jedno rozwiązanie tego matematycznego problemu optymalizacji.

Różnice w wynikach pochodzą z kilku aspektach: SVC i LinearSVC mają zoptymalizować ten sam problem, ale w rzeczywistości wszystkie liblinear estymatory ukarać osią, natomiast libsvm te nie (IIRC). Prowadzi to do innego matematycznego problemu optymalizacji, a tym samym różnych wyników. Mogą występować również inne subtelne różnice, takie jak skalowanie i domyślna funkcja utraty (edycja: upewnij się, że ustawiono loss='hinge' w LinearSVC). Następnie, w klasyfikacji wieloklasowej, liblinear wykonuje domyślnie jeden-względem-odpoczynku, podczas gdy libsvm wykonuje jeden-kontra-jeden.

SGDClassifier(loss='hinge') różni się od pozostałych dwóch w tym sensie, że wykorzystuje stochastyczne pochylenie gradientowe, a nie dokładne pochylenie gradientowe i nie może zbiegać się do tego samego rozwiązania. Jednak uzyskane rozwiązanie może generalizować lepiej.

Między SVC i LinearSVC jednym ważnym kryterium jest to, że decyzja LinearSVC bywa szybciej zbiegają większa liczba próbek jest. Wynika to z faktu, że jądro liniowe jest specjalnym przypadkiem, który jest zoptymalizowany pod kątem Liblinear, ale nie w Libsvm.

1

Rzeczywisty problem jest w problemie z podejściem scikit, gdzie nazywają SVM coś który nie jest SVM. LinearSVC faktycznie minimalizuje squared straty zawiasów, a nie tylko zawias straty ponadto, że penalizuje wielkość błędu (co nie jest SVM), więcej szczegółów znajduje się w innej kwestii: Under what parameters are SVC and LinearSVC in scikit-learn equivalent?

Więc który z nich korzystać ? Jest to czysto specyficzny problem. Ponieważ ze względu na brak twierdzenia o swobodnym lunchu nie można powiedzieć "ta funkcja straty jest najlepsza, okres". Czasami strata w kwadracie będzie działać lepiej, czasem normalny zawias.

+0

masz rację co do kwadratu utraty zawiasów (wspomnę również, że straty są różne). Ale ustawienie go na zawias nie powoduje, że otrzymają taką samą odpowiedź jak SVC z liniowym jądrem. – eickenberg

+0

jak już powiedziałem - dotyczy to również karygodnej stronniczości, odnoszą się do mojej innej odpowiedzi – lejlot

+0

Rzeczywiście, więc to pytanie jest właściwie duplikatem tego, co już odpowiedziałeś. Ale ważne jest, aby pamiętać, że 'LinearSVC' nie jest bezużyteczny - powinien skalować się lepiej niż ogólne metody jądra. – eickenberg