L'output di Scikit SVM nella classificazione multiclasse fornisce sempre la stessa etichetta


10

Attualmente sto usando Scikit Learn con il seguente codice:

clf = svm.SVC(C=1.0, tol=1e-10, cache_size=600, kernel='rbf', gamma=0.0, 
              class_weight='auto')

e quindi adattarsi e prevedere un set di dati con 7 etichette diverse. Ho ottenuto un risultato strano. Indipendentemente dalla tecnica di convalida incrociata che utilizzo l'etichetta prevista sul set di convalida sarà sempre l'etichetta 7.

Provo alcuni altri parametri, incluso quello di default completo ( svm.SVC()) ma fintanto che il metodo del kernel che uso è rbfinvece di polyo linearsemplicemente non funzionerebbe, mentre funziona davvero bene per polye linear.

Inoltre ho già provato la previsione sui dati del treno anziché sui dati di convalida e si adatta perfettamente.

Qualcuno ha visto questo tipo di problema prima e sa cosa sta succedendo qui?

Non guardo mai in dettaglio la mia distribuzione di classe ma so che dovrebbe essere circa il 30% di loro sono 7, il 14% sono 4.

Provo anche un'implementazione manuale 1-vs-rest e non è ancora utile.


Quali sono le proporzioni dei tuoi dati che rientrano in ciascuna delle classi?
gung - Ripristina Monica

Ci sono davvero più "7" nei miei dati, ma non così tanto. Circa il 30% di questi sono 7. @gung
Tamaki Sakura,

Risposte:


10

Una causa probabile è il fatto che non stai ottimizzando il tuo modello. Devi trovare buoni valori per e . Nel tuo caso, le impostazioni predefinite risultano essere cattive, il che porta a modelli banali che producono sempre una certa classe. Ciò è particolarmente comune se una classe ha molte più istanze delle altre. Qual è la tua distribuzione di classe?Cγ

scikit-learn ha funzionalità di ricerca dell'iperparametro limitate, ma è possibile utilizzarlo insieme a una libreria di ottimizzazione come Optunity . Un esempio sulla messa a punto di scikit-learn SVC con Optunity è disponibile qui .

Disclaimer: sono lo sviluppatore principale di Optunity.


In realtà ho provato mannuelly ogni combinazione di C e gamma che è una potenza di 10 da 0 a 4 ma tutti mi danno pieno 7. Ho persino iniziato a dubitare se compilo lo scikit in modo corretto.
Tamaki Sakura,

8

Il problema risulta essere il test dei parametri. Non ho provato quando gammaè compreso tra 0,0 (che è 1 / n_feature) e 1. I miei dati gammadovrebbero essere rivolti a qualcosa in giro1e-8


4
Questo ha perfettamente senso. Valori troppo grandi di portano a una matrice del kernel vicina alla matrice dell'unità. Ogni previsione finirà per essere il termine di bias (poiché tutte le valutazioni del kernel sono molto vicine allo zero), che nel tuo caso porta alla classe 7. γ
Marc Claesen,
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.