Verzerrte Daten für mehrere Klassen

10

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?

mike1886
quelle

Antworten:

5

Ich würde Ihnen empfehlen, libsvm zu verwenden, in dem bereits einstellbare Klassengewichte implementiert sind. Anstatt die Trainingsbeispiele zu replizieren, ändert man den C-Parameter für verschiedene Klassen in der SVM-Optimierung. Wenn Ihre Daten beispielsweise zwei Klassen haben und die erste Klasse nur 10% der Daten ausmacht, würden Sie die Klassengewichte für Klasse 1 bzw. 2 mit 10 und 1 auswählen. Daher würden Margin-Verstöße der ersten Klasse zehnmal mehr kosten als Margin-Verstöße der zweiten Klasse, und die Genauigkeit pro Klasse wäre ausgewogener.

Magicharp
quelle
danke für den rat, weißt du ob libsvm dies automatisch macht oder muss ich die klassengewichte manuell übergeben?
Mike1886
Sie müssen die Klassengewichte manuell übergeben. Die Vorgehensweise hängt von der verwendeten Schnittstelle ab (Python, Java, Matlab, c). Es ist in den Readme- Dateien gut dokumentiert, wenn Sie das Tool von csie.ntu.edu.tw/~cjlin/libsvm herunterladen . Außerdem scheint Ihre Datengröße groß zu sein, und die Standardimplementierung von libsvm für mehrere Klassen verwendet eine Eins-gegen-Eins-Klassifizierung, deren Ausführung möglicherweise zu lange dauert. Sie können versuchen, 50 binäre Ein-gegen-Alle-Klassifikatoren zu trainieren, indem Sie die Gewichte entsprechend angeben.
Magicharp
2

Ich bin kein Export in die Verwendung von SVMs, aber normalerweise (wenn Sie eine Bibliothek für maschinelles Lernen wie Pythons scikit-learnoder Rs verwenden libsvm, gibt es den class_weightParameter class.weightsbzw ..

Oder wenn Sie einen Bayes-Klassifikator verwenden würden, würden Sie diesen "Versatz" über die "vorherigen (Klassen-) Wahrscheinlichkeiten" P (ω j ) berücksichtigen.


quelle
1

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βYyij=+1ijyij=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
1

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.

user776193
quelle
Danke für die Antwort! Ich habe tatsächlich zahlreiche andere Algorithmen / Kernel ausprobiert und habe immer noch die gleiche Art von Problem. Ich suche also eher nach einem Ansatz wie Unterabtastung oder einer Möglichkeit, die Klassen auszugleichen.
Mike 1886
Ok, vielleicht möchten Sie auch versuchen, Zeilen für Klassen mit spärlichen Daten zu replizieren, obwohl dies nur dann nützlich ist, wenn die Funktionen der spärlichen Daten wirklich gut sind.
user776193