Klassenungleichgewicht beim überwachten maschinellen Lernen

47

Dies ist im Allgemeinen eine Frage, die sich nicht auf eine Methode oder einen Datensatz bezieht. Wie gehen wir mit einem Klassenungleichgewichtsproblem beim überwachten maschinellen Lernen um, bei dem die Zahl 0 etwa 90% und die Zahl 1 etwa 10% in Ihrem Datensatz beträgt. Wie trainieren wir den Klassifikator optimal.

Eine der Möglichkeiten, die ich befolge, besteht darin, Stichproben zu entnehmen, um den Datensatz auszugleichen, den Klassifikator zu trainieren und dies für mehrere Stichproben zu wiederholen.

Ich denke, das ist zufällig. Gibt es einen Rahmen, um diese Art von Problemen anzugehen?

NG_21
quelle

Antworten:

45

Es gibt viele Frameworks und Ansätze. Dies ist ein immer wiederkehrendes Problem.

Beispiele:

  • Unterabtastung . Wählen Sie ein Teilmuster der Nullensätze so aus, dass seine Größe mit der der Einsen übereinstimmt. Es liegt ein offensichtlicher Informationsverlust vor, es sei denn, Sie verwenden ein komplexeres Framework (zum Beispiel würde ich die erste Menge auf 9 kleinere, sich gegenseitig ausschließende Teilmengen aufteilen, ein Modell für jede von ihnen trainieren und die Modelle zusammenstellen).
  • Überabtastung . Produziere künstliche, bis der Anteil 50% / 50% beträgt. Mein früherer Arbeitgeber hat dies standardmäßig verwendet. Dafür gibt es viele Frameworks (ich denke, SMOTE ist das beliebteste, aber ich bevorzuge einfachere Tricks wie Noisy PCA ).
  • One Class Learning . Nehmen Sie einfach an, Ihre Daten haben ein paar echte Punkte (die einen) und viele zufällige Geräusche, die physikalisch nicht vorhanden sind, sind in den Datensatz eingedrungen (alles, was keine Eins ist, ist Rauschen). Verwenden Sie einen Algorithmus, um die Daten zu entstören, anstatt einen Klassifizierungsalgorithmus.
  • Kostensensitives Training . Verwenden Sie eine asymmetrische Kostenfunktion, um den Trainingsprozess künstlich auszugleichen.

Einige Überprüfungen in aufsteigender Reihenfolge der technischen Komplexität und des Detaillierungsgrades:

Ach ja, 90% / 10% sind übrigens nicht unausgeglichen. Datasets für Kartentransaktionsbetrug sind häufig zu 99,97% / 0,03% aufgeteilt. Das ist unausgeglichen.

Lucas Gallindo
quelle
Ich habe gerade bemerkt, dass der von mir angegebene PCA-Wert für "Noisy" je nach Implementierungsdetails entweder als "Oversampling", "Regularization" oder "Jitter" angesehen werden kann.
Lucas Gallindo
Danke Lucas für die Ressourcen. Hilft sehr. Ich habe ein besonderes Problem, bei dem alle meine Proben mit "1" gekennzeichnet sind. In der Realität weisen diese Proben jedoch eine minimale Verunreinigung auf, dh es gibt einige Datensätze, die eigentlich "0" sein sollen, aber als "1" gekennzeichnet sind. Ich glaube, diese Art von Problem gehört zu einer Klasseneinteilung. Ist mein Verständnis korrekt? Gibt es ein gemeinsames Framework, um sie zu identifizieren, anfangs habe ich versucht, Clustering, aber das funktioniert nicht.
NG_21,
1
Für alle diese Algorithmen sind Daten erforderlich, die mit 0 und 1 gekennzeichnet sind, wobei 100% der Richtigkeit der Beschriftung (oder sehr nahe an 100%) zu bezweifeln sind. Sie haben alle, aber Sie wissen, dass ein kleiner Prozentsatz dieser Daten falsch beschriftet ist, eine andere Situation. Ohne Kenntnisse über den Anwendungsbereich würde ich ihn mithilfe der Anomalieerkennung angreifen und die Anomalien dann als Null kennzeichnen. Dann versuchen Sie es mit einem Klassifizierungsalgorithmus (One Class Learning, vielleicht). Mit Kenntnissen über den Anwendungsbereich würde ich mich vor allem an einen Domain-Experten wenden.
Lucas Gallindo
13

Dies hängt stark von der Lernmethode ab. Die meisten allgemeinen Ansätze haben eine (oder mehrere) Möglichkeiten, um damit umzugehen. Ein häufiger Fix besteht darin, der Minderheitsklasse eine höhere Fehlklassifizierungsstrafe zuzuweisen, die den Klassifizierer zwingt, sie zu erkennen (SVM, logistische Regression, neuronale Netze, ...).

Das Ändern der Stichproben ist ebenfalls eine Möglichkeit, wie Sie bereits erwähnt haben. In diesem Fall ist eine Überabtastung der Minderheitsklasse normalerweise eine bessere Lösung als eine Unterabtastung der Mehrheitsklasse.

Einige Methoden, wie z. B. zufällige Gesamtstrukturen, müssen nicht geändert werden.

Marc Claesen
quelle
Vielen Dank. Können Sie auf eine Ressource verweisen, die anhand einiger Beispiele erläutert wird? Gibt es eine Möglichkeit, dies in R / Python zu erreichen, ohne den Algorithmus von Grund auf neu zu codieren?
NG_21
1
Überprüfen Sie die erste Funktion dieses R-Pakets: cran.r-project.org/web/packages/unbalanced/unbalanced.pdf
Lucas Gallindo
7
Warum braucht Random Forest keine Modifikation? Ich denke, Sie können noch Klassengewicht zuweisen
Mac
4

Oft liegt das Problem nicht in der Häufigkeit, sondern in der absoluten Anzahl der Fälle in der Minderheitenklasse. Wenn Sie nicht genügend Abweichungen im Ziel im Vergleich zu Abweichungen in den Features haben, kann dies bedeuten, dass der Algorithmus die Dinge nicht sehr genau klassifizieren kann.

Eine Sache ist, dass eine Fehlklassifizierungsstrafe beim Klassifizierungsschritt und nicht beim Parameterschätzungsschritt verwendet werden könnte, falls vorhanden. Einige Methoden haben kein Parameterkonzept, sondern erzeugen lediglich eindeutige Klassenbezeichnungen oder Klassenwahrscheinlichkeiten.

Wenn Sie einen Wahrscheinlichkeitsschätzer haben, können Sie eine Klassifizierungsentscheidung auf der Grundlage von informationstheoretischen Gründen oder mit einer Kombination von Geschäftswert treffen.

Analytiker
quelle
1

Fügen Sie zwei Tricks hinzu: 1. Verwenden Sie CDF, zählen Sie die Häufigkeit in Ihren Trainingsdaten oder verwenden Sie eine sehr umfangreiche Validierung (wenn sich Ihr Testsatz nicht ändert, der Validierungssatz jedoch dieselbe Verteilung wie der Trainingssatz haben muss), sortieren Sie dann Ihre Vorhersage und erhalten Sie Die ersten X% (Sie zählen die Häufigkeit zuvor) für die eine Klasse und die anderen sind / 2. gewichtete Stichprobe, das Modell tendiert zur gewichteten Stichprobenklasse. Sie können die Stichprobenvarianz v verwenden, z. weighti = 1/2 (1- (vmax - vi) / vmax)

user102423
quelle