Puoi spiegare la differenza tra SVC e LinearSVC in scikit-learn?


19

Di recente ho iniziato a imparare a lavorare con sklearne ho appena riscontrato questo risultato peculiare.

Ho usato il digitsset di dati disponibile sklearnper provare diversi modelli e metodi di stima.

Quando ho testato un modello di Support Vector Machine sui dati, ho scoperto che ci sono due diverse classi sklearnper la classificazione SVM: SVCe LinearSVC, dove il primo utilizza un approccio uno contro uno e l'altro utilizza un approccio uno contro riposo .

Non sapevo quale effetto potesse avere sui risultati, quindi ho provato entrambi. Ho fatto una stima in stile Monte Carlo in cui ho eseguito entrambi i modelli 500 volte, dividendo ogni volta il campione casualmente in 60% di allenamento e 40% di test e calcolando l'errore della previsione sul set di test.

Lo stimatore SVC regolare ha prodotto il seguente istogramma di errori: Tasso di errore SVC Mentre lo stimatore SVC lineare ha prodotto il seguente istogramma: Tasso di errore SVC lineare

Cosa potrebbe spiegare una differenza così netta? Perché il modello lineare ha una precisione così elevata la maggior parte delle volte?

E, di conseguenza, cosa potrebbe causare la forte polarizzazione nei risultati? Un'accuratezza prossima a 1 o un'accuratezza vicina a 0, niente in mezzo.

Per fare un confronto, una classificazione dell'albero decisionale ha prodotto un tasso di errore distribuito molto più normalmente con una precisione di circa .85.


Presumo che la documentazione di scikit-learn non evidenzi la differenza? Hai controllato?
Rohit,

1. Quale kernel hai usato in SVC? impostazioni predefinite = "rbf"? 2. Uno contro uno e uno contro tutti sono approcci diversi
kpb,

la documentazione è piuttosto scarsa / vaga sull'argomento. Indica la differenza tra uno contro uno e uno contro il riposo e che lo SVS lineare è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).
metjush,

per i normali SVC, ho usato il kernel predefinito. So che 1v1 e 1vR sono approcci diversi, ma immagino che sia quello che voglio sapere - perché producono risultati così diversi? È la scelta del kernel o il diverso approccio alla classificazione per più categorie?
metjush,

Risposte:


23

Un normale SVM con valori predefiniti utilizza una funzione di base radiale come kernel SVM. Questo è fondamentalmente un kernel gaussiano noto anche come curva a campana. Ciò significa che la terra di nessuno tra classi diverse viene creata con una funzione gaussiana. Il linear-SVM usa un kernel lineare per la funzione base, quindi puoi pensare a questa come una funzione a forma di ^. È molto meno sintonizzabile ed è fondamentalmente solo un'interpolazione lineare.

Le persone stanno scrivendo questa domanda perché non hai fornito molte informazioni, ma esaminando a fondo ciò che hai pubblicato ... questo colpisce alcuni aspetti fondamentali della comprensione dei dettagli di distorsione e varianza e della differenza tra lineare e non lineare funzioni di base in SVM.

Dai un'occhiata a questa immagine che descrive le quattro regioni con distorsione alta e bassa e varianza alta e bassa. Ovviamente il posto migliore dove trovarsi è la bassa varianza e la scarsa propensione.

dardeggia l'immagine di varianza

Per prima cosa valutiamo la varianza -

Ora dai un'occhiata alle tue trame: inserisci qui la descrizione dell'immagine

La funzione di base non lineare ha una varianza più elevata. Guarda come è più rumoroso del kernel lineare! Il kernel lineare ha una varianza inferiore. Guarda come è meno rumoroso!

Ora consente di valutare la distorsione:

Quale kernel è più preciso? Possiamo aggiungere gli errori che hai fornito. Il kernel non lineare ha un errore totale di ~ 550 + 325 = ~ 875. Il kernel lineare ha un errore di ~ 690 + ~ 50 = ~ 740. Quindi il kernel lineare sembra fare complessivamente meglio, ma nel complesso sono abbastanza vicini. Questo è dove le cose si fanno difficili!

Mettere tutto insieme

Guarda come il kernel lineare ha fatto un pessimo lavoro su 1 e un ottimo lavoro su 0. Questo è abbastanza sbilanciato. Dove il kernel non lineare è più bilanciato. Sembra che il punto debole potrebbe essere quello di creare un modello equilibrato che non abbia una varianza così elevata. Come controlliamo per l'alta varianza? Bingo - regolarizzazione. Possiamo aggiungere regolarizzazione al modello non lineare e probabilmente vedremo risultati molto migliori. Questo è il parametro C in scikit learn SVM, che vorresti aumentare dal valore predefinito. Potremmo anche giocare con il parametro gamma. La gamma controlla la larghezza del gaussiano. Forse prova ad aumentarlo leggermente per ottenere risultati meno rumorosi, ad esempio una terra di nessuno più grande tra le classi.

Spero che sia di aiuto!


Il parametro C deve essere ridotto dal valore predefinito non aumentato.
Hamdi

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.