Ich habe einen Datensatz, der ~ 100.000 Proben von 50 Klassen enthält. Ich habe SVM mit einem RBF-Kernel verwendet, um neue Daten zu trainieren und vorherzusagen. Das Problem ist jedoch, dass der Datensatz in Richtung verschiedener Klassen verschoben ist.
Zum Beispiel Klasse 1 - 30 (jeweils ~ 3%), Klasse 31 - 45 (jeweils ~ 0,6%), Klasse 46 - 50 (jeweils ~ 0,2%)
Ich sehe, dass das Modell dazu neigt, die Klassen, die im Trainingssatz weniger häufig vorkommen, sehr selten vorherzusagen, obwohl der Testsatz die gleiche Klassenverteilung wie der Trainingssatz hat.
Mir ist bewusst, dass es Techniken wie "Unterabtastung" gibt, bei denen die Mehrheitsklasse auf die Nebenklasse verkleinert wird. Gilt dies jedoch hier, wo es so viele verschiedene Klassen gibt? Gibt es andere Methoden, um diesen Fall zu behandeln?
quelle
Ich bin kein Export in die Verwendung von SVMs, aber normalerweise (wenn Sie eine Bibliothek für maschinelles Lernen wie Pythons
scikit-learn
oder Rs verwendenlibsvm
, gibt es denclass_weight
Parameterclass.weights
bzw ..Oder wenn Sie einen Bayes-Klassifikator verwenden würden, würden Sie diesen "Versatz" über die "vorherigen (Klassen-) Wahrscheinlichkeiten" P (ω j ) berücksichtigen.
quelle
In Bezug auf den Ansatz leistet SVM mit einem RBF-Kernel gute Arbeit, aber SVMs können durch große Objektgrößen verlangsamt werden, es sei denn, Sie verwenden CV mit z. B. einem Zehntel der Daten, die zufällig jeder Falte zugewiesen werden. Haben Sie sich jedoch gefragt, warum Sie SVMs überhaupt einsetzen?
Haben Sie eine multivariate lineare Regression versucht, , wobei jeder Datensatz von mit codiert ist, wenn sich das te Objekt befindet Klasse und sonst? Wenn die Klassifizierungsgenauigkeit bei Verwendung der linearen Regression bemerkenswert hoch ist, sind Ihre Daten linear trennbar und komplexere Methoden wie SVMs und ANNs werden nicht benötigt. Schritt 2 würde zeigen, dass k-nächster Nachbar, naive Bayes, lineare (Fisher) Diskriminanzanalyse, polytome logistische Regression usw. zusammenbrechen und scheitern.Y=Xβ Y yij=+1 i j yij=−1
In Bezug auf die Terminologie könnten Sie das Problem der Erhöhung der Klassengewichte im Zusammenhang mit "geringeren Anteilen von Objekten in bestimmten Klassen" oder "Klassengröße nahe Null" ansprechen. Der Versatz wird in der Regel zur Beschreibung der Verteilung der Werte eines Features verwendet, z. B. bei Versatz, Fettschwänzen usw.
Wie viele Funktionen haben Sie? Haben Sie versucht, unbeaufsichtigtes Clustering (Klassenerkennung) für die 100.000 Objekte durchzuführen, bevor Sie mit SVM eine überwachte Klassifizierung (Klassenvorhersage) versucht haben? Möglicherweise können die 100.000 Objekte in weniger Klassen als 50 gruppiert werden, für die die neue Klassenmitgliedschaft während der Klassifizierungsanalyse als Zielklasse verwendet werden könnte. Dies kann das Problem einer Klassengröße nahe Null lindern.
quelle
Ich habe dieses Problem viele Male bei der Verwendung von SVM mit dem Rbf-Kernel gesehen. Die Verwendung des linearen Kernels anstelle des Rbf-Kernels löste mein Problem, aber ich beschäftigte mich mit einer geringeren Anzahl von Klassen. Die Ergebnisse waren mit dem linearen Kernel weniger verzerrt und genauer. Hoffe das löst dein Problem.
Bearbeiten: Während ich die ursprüngliche Antwort schrieb, war ich naiv genug, die Klassen nicht als eine der richtig beantworteten zu gewichten. Bei der Verwendung des rbf-Kernels ist es außerdem wichtig sicherzustellen, dass der Strafparameter oder der 'C'-Wert gemäß dem svm-Modul von sklearn zu allgemein ist. Ich finde, dass der Standardwert von C = 1 die meiste Zeit zu allgemein ist und ich normalerweise einen Wert von C = 10000 habe. Ich hoffe, dies hilft anderen, die mit svm (rbf) trotz einer guten Verteilung der Klassen in Daten verzerrte Ergebnisse erzielen.
quelle