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.
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 ")'. –
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