Matematicamente, l'ottimizzazione di un SVM è un problema di ottimizzazione convessa, in genere con un minimizzatore univoco. Ciò significa che esiste una sola soluzione a questo problema di ottimizzazione matematica.
Le differenze di risultati provengono da diversi aspetti: SVC
e LinearSVC
si suppone per ottimizzare lo stesso problema, ma in realtà tutti gli estimatori liblinear
penalizzano l'intercetta, mentre quelli libsvm
Non (IIRC). Ciò porta a un diverso problema di ottimizzazione matematica e quindi a risultati diversi. Potrebbero esserci anche altre sottili differenze come il ridimensionamento e la funzione di perdita di default (modifica: assicurati di impostare loss='hinge'
in LinearSVC
). Successivamente, nella classificazione multiclasse, liblinear
fa uno-contro-pausa di default mentre libsvm
fa uno contro uno.
SGDClassifier(loss='hinge')
è diverso dagli altri due, nel senso che utilizza la discesa del gradiente stocastica e la discesa del gradiente non esatta e potrebbe non convergere nella stessa soluzione. Tuttavia la soluzione ottenuta può generalizzare meglio.
Tra SVC
e LinearSVC
, un importante criterio di decisione è che LinearSVC
tende ad essere più veloce per convergere il più grande è il numero di campioni è. Ciò è dovuto al fatto che il kernel lineare è un caso speciale, che è ottimizzato per in Liblinear, ma non in Libsvm.
Non è che gli scikit-learn abbiano sviluppato un algoritmo dedicato per SVM lineare. Piuttosto hanno implementato le interfacce in aggiunta a due diffuse implementazioni esistenti. L'implementazione C sottostante per 'LinearSVC' è liblinear, e il risolutore per' SVC' è libsvm. Un terzo è l'implementazione 'SGDClassifier (loss =" hinge ")'. –
Possibile duplicato di [In quali parametri SVC e LinearSVC sono equivalenti in scikit-learn?] (Http: // stackoverflow.it/questions/33843981/under-what-parameters-are-svc-and-linearsvc-in-scikit-learn-equivalent) – lejlot