Die Ausgabe von Scikit SVM in der Klassifizierung mehrerer Klassen ergibt immer die gleiche Bezeichnung

10

Ich verwende derzeit Scikit Learn mit dem folgenden Code:

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

und passen Sie dann einen Datensatz mit 7 verschiedenen Beschriftungen an und sagen Sie ihn voraus. Ich habe eine seltsame Ausgabe. Unabhängig davon, welche Kreuzvalidierungstechnik ich verwende, wird das vorhergesagte Etikett auf dem Validierungssatz immer Etikett 7 sein.

Ich probiere einige andere Parameter aus, einschließlich des vollständigen Standardparameters one ( svm.SVC()), aber solange die Kernel-Methode, die ich verwende, rbfanstelle von polyoder linearfunktioniert, funktioniert sie einfach nicht, während sie für polyund wirklich gut funktioniert linear.

Außerdem habe ich bereits versucht, Zugdaten anstelle von Validierungsdaten vorherzusagen, und sie passen perfekt.

Hat jemand diese Art von Problem schon einmal gesehen und weiß, was hier los ist?

Ich schaue mir meine Klassenverteilung nie im Detail an, aber ich weiß, dass es ungefähr 30% von ihnen sein sollten, 7, 14% sind 4.

Ich versuche sogar eine manuelle 1-gegen-Rest-Implementierung und sie ist immer noch nicht hilfreich.

Tamaki Sakura
quelle
Wie hoch sind die Anteile Ihrer Daten, die in die einzelnen Klassen fallen?
Gung - Reinstate Monica
Es gibt zwar mehr "7" in meinen Daten, aber nicht so viel. Rund 30% von ihnen sind 7. @gung
Tamaki Sakura

Antworten:

10

Eine wahrscheinliche Ursache ist die Tatsache, dass Sie Ihr Modell nicht optimieren. Sie müssen gute Werte für und . In Ihrem Fall erweisen sich die Standardeinstellungen als schlecht, was zu trivialen Modellen führt, die immer eine bestimmte Klasse ergeben. Dies ist besonders häufig, wenn eine Klasse viel mehr Instanzen als die anderen hat. Was ist Ihre Klassenverteilung?γCγ

scikit-learn verfügt nur über begrenzte Suchfunktionen für Hyperparameter. Sie können es jedoch zusammen mit einer Optimierungsbibliothek wie Optunity verwenden . Ein Beispiel zum Optimieren von Scikit-Learn-SVC mit Optunity finden Sie hier .

Haftungsausschluss: Ich bin der Hauptentwickler von Optunity.

Marc Claesen
quelle
Ich habe tatsächlich jede Kombination von C und Gamma ausprobiert, die eine Potenz von 10 von 0 bis 4 ist, aber alle geben mir volle 7. Ich fange sogar an zu zweifeln, ob ich das Scikit-Lernen auf die richtige Weise kompiliere.
Tamaki Sakura
8

Das Problem stellt sich als Parametertest heraus. Ich habe nicht versucht, wann gammazwischen 0.0 (was 1 / n_feature ist) und 1 liegt. Auf meinen Daten gammasollte sich etwas umdrehen1e-8

Tamaki Sakura
quelle
4
Das macht durchaus Sinn. Zu große Werte von führen zu einer Kernelmatrix, die nahe an der Einheitsmatrix liegt. Jede Vorhersage ist am Ende der Bias-Term (da alle Kernel-Bewertungen sehr nahe bei Null liegen), was in Ihrem Fall zu Klasse 7 führt. γ
Marc Claesen