Der beste Weg, um mit SVM unausgeglichene Datensätze mit mehreren Klassen zu verarbeiten

9

Ich versuche, ein Vorhersagemodell mit SVMs auf ziemlich unausgeglichenen Daten aufzubauen. Meine Labels / Outputs haben drei Klassen: positiv, neutral und negativ. Ich würde sagen, das positive Beispiel macht ungefähr 10 - 20% meiner Daten aus, neutral ungefähr 50 - 60% und negativ ungefähr 30 - 40%. Ich versuche, die Klassen auszugleichen, da die Kosten, die mit falschen Vorhersagen zwischen den Klassen verbunden sind, nicht gleich sind. Eine Methode bestand darin, die Trainingsdaten erneut abzutasten und einen gleich ausgewogenen Datensatz zu erstellen, der größer als das Original war. Interessanterweise bekomme ich dabei tendenziell bessere Vorhersagen für die andere Klasse (z. B. wenn ich die Daten ausgewogen habe, habe ich die Anzahl der Beispiele für die positive Klasse erhöht, aber bei den Stichprobenvorhersagen hat die negative Klasse besser abgeschnitten). Kann jemand allgemein erklären, warum dies geschieht? Wenn ich die Anzahl der Beispiele für die negative Klasse erhöhe, würde ich aus Stichprobenvorhersagen (z. B. bessere Vorhersagen) etwas Ähnliches für die positive Klasse erhalten?

Sehr offen für andere Gedanken darüber, wie ich die unausgeglichenen Daten beheben kann, indem ich entweder unterschiedliche Kosten für die Fehlklassifizierung auferlege oder die Klassengewichte in LibSVM verwende (ich bin mir jedoch nicht sicher, wie ich diese richtig auswählen / einstellen soll).

tomas
quelle

Antworten:

6

Es ist besser, unterschiedliche Strafen für die Rand-Slack-Variablen für Muster jeder Klasse zu haben, als die Daten erneut abzutasten. Es ist ohnehin asymptotisch gleichbedeutend mit Resampling, ist jedoch einfacher zu implementieren und kontinuierlich als diskret, sodass Sie mehr Kontrolle haben.

Die Auswahl der Gewichte ist jedoch nicht einfach. Im Prinzip können Sie eine theoretische Gewichtung ausarbeiten, die die Fehlklassifizierungskosten und die Unterschiede zwischen den Trainings- und Betriebswahrscheinlichkeiten der vorherigen Klasse berücksichtigt, aber nicht die optimale Leistung liefert. Am besten wählen Sie die Strafen / Gewichte für jede Klasse aus, indem Sie den Verlust (unter Berücksichtigung der Fehlklassifizierungskosten) durch Kreuzvalidierung minimieren.

Dikran Beuteltier
quelle
Gibt es eine automatisierte Möglichkeit, dies zu tun, oder gibt es Lernende, die diese Funktionalität integriert haben?
Vam
Normalerweise schreibe ich einfach eine Matlab-Funktion, um den Verlust für einen bestimmten Satz von Strafen zu bewerten und ihn dann mithilfe des Nelder-Mead-Simplex-Algorithmus zu minimieren. Ich kenne keine Bibliotheken, in die dies eingebaut ist.
Dikran Marsupial
@DikranMarsupial Wäre eine Rastersuche der beiden Rand-Slack-Variablen in einem Zwei-Klassen-Problem gleichbedeutend mit dem, was Sie mit dem Simplex-Algorithmus tun?
Spacey
@Tarantula Ja, die genaue Optimierungsmethode ist relativ unwichtig. Der entscheidende Punkt besteht darin, sicherzustellen, dass Sie die Kreuzvalidierungsstatistik optimieren, an der Sie für die Zwecke Ihrer Anwendung wirklich interessiert sind (dh dieselben Klassenhäufigkeiten, die bei der betrieblichen Verwendung auftreten und unter Berücksichtigung von Fehlklassifizierungskosten, falls bekannt).
Dikran Marsupial