2016-01-29 17 views
5

Dalla mia ricerca, ho trovato tre risultati contrastanti:LInearSVC vs SVC (kernel = 'linear'): argomenti in conflitto?

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

qualcuno può spiegarmi quando utilizzare LinearSVC vs. SVC(kernel="linear")?

Sembra che LinearSVC sia leggermente migliore di SVC e di solito è più schizzinoso. Ma se scikit ha deciso di dedicare del tempo a implementare un caso specifico per la classificazione lineare, perché il LinearSVC non dovrebbe superare il SVC?

+1

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

+0

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

risposta

10

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.

1

Il vero problema è nel problema con approccio scikit, dove lo chiamano SVM qualcosa che non è SVM. LinearSVC è effettivamente minimizzando la perdita di cerniera quadrata, invece di cerniera perdita, inoltre, penalizza dimensione della polarizzazione (che non è SVM), per maggiori dettagli vedere altra domanda: Under what parameters are SVC and LinearSVC in scikit-learn equivalent?

Quindi quale usare ? È puramente problema specifico. Poiché a causa del teorema del pranzo libero non è possibile dire "questa funzione di perdita è il migliore, il periodo". A volte la perdita al quadrato funzionerà meglio, a volte normale cerniera.

+0

hai ragione riguardo alla perdita di una cerniera al quadrato (cito che anche le perdite sono diverse). Ma impostarlo su un cardine ancora non gli fa ottenere la stessa risposta del SVC con kernel lineare. – eickenberg

+0

come ho detto - si tratta anche di penalizzare il pregiudizio, si riferiscono alla mia altra risposta – lejlot

+0

In effetti, questa domanda è praticamente un duplicato di ciò che hai già risposto. Ma è importante notare che 'LinearSVC' non è inutile - dovrebbe scalare meglio dei metodi generici del kernel. – eickenberg

Problemi correlati