Python: Umgang mit Ungleichgewichtsklassen in Python Machine Learning

9

Ich habe einen Datensatz, für den ich versuche, Zielvariablen vorherzusagen.

Col1    Col2    Col3    Col4    Col5    
  1      2       23      11     1
  2      22      12      14     1
  22     11      43      38     3
  14     22      25      19     3
  12     42      11      14     1
  22     11      43      38     2
  1      2       23      11     4
  2      22      12      14     2
  22     11      43      38     3

Ich habe Beispieldaten bereitgestellt, aber bei mir sind Tausende von Datensätzen auf ähnliche Weise verteilt. Hier sind Col1, Col2, Col3, Col4 meine Funktionen und Col5 ist die Zielvariable. Daher sollte die Vorhersage 1,2,3 oder 4 sein, da dies meine Werte für die Zielvariable sind. Ich habe versucht, Algorithmen wie zufällige Gesamtstruktur, Entscheidungsbaum usw. für Vorhersagen zu verwenden.

Wenn Sie hier sehen, treten die Werte 1,2 und 3 im Vergleich zu 4 häufiger auf. Daher ist mein Modell während der Vorhersage stärker auf 1 2 und 3 ausgerichtet, während ich für 4 nur weniger Vorhersagen erhalte (nur 1 vorhergesagt) für policy4 aus Tausenden von Datensätzen, als ich die Verwirrungsmatrix sah).

Um mein Modell zu verallgemeinern, habe ich den gleichen Prozentsatz der Daten, die zu den Werten 1,2 und 3 gehören, zufällig entfernt. Ich habe nach jedem Wert in Spalte 5 gruppiert und dann einen bestimmten Prozentsatz entfernt, sodass ich die Anzahl der Datensätze verringert habe. Jetzt konnte ich eine gewisse Zunahme des Prozentsatzes der Genauigkeit und auch eine vernünftige Zunahme der Vorhersagen für Wert 4 in der Verwirrungsmatrix feststellen.

Ist dies der richtige Ansatz (Entfernen der Daten zufällig aus den Gruppen, auf die sich das Modell bezieht)?

Ich habe versucht, eingebaute Python-Algorithmen wie Adaboost, GradientBoost-Techniken mit sklearn. Ich habe gelesen, dass diese Algorithmen für den Umgang mit Ungleichgewichtsklassen vorgesehen sind. Es gelang mir jedoch nicht, meine Genauigkeit zu verbessern, indem ich die Daten zufällig entfernte, wo ich einige Verbesserungen feststellen konnte.

Handelt es sich bei dieser Reduzierung um eine Unterabtastungstechnik, und ist dies der richtige Ansatz für eine Unterabtastung?

Gibt es vordefinierte Pakete in sklearn oder eine Logik, die ich in Python implementieren kann, um dies zu erreichen, wenn meine zufällige Entfernung falsch ist?

Außerdem habe ich etwas über die SMOTE-Technik gelernt, die sich mit Oversampling befasst. Soll ich das für Wert 4 versuchen? Und können wir dies mit eingebauten Paketen in Python tun? Es wäre toll, wenn mir jemand in dieser Situation helfen würde.

SRS
quelle

Antworten:

5

In diesem Artikel wird die Verwendung von Ranking vorgeschlagen (ich habe es geschrieben). Anstatt beispielsweise SVM direkt zu verwenden, würden Sie RankSVM verwenden. Da Ranglisten Beobachtung mit Beobachtung vergleichen, ist das Training notwendigerweise ausgewogen. Es gibt jedoch zwei "Aber": Das Training ist viel langsamer, und am Ende ordnen diese Modelle Ihre Beobachtungen von der Wahrscheinlichkeit, dass sie zu einer Klasse gehören, bis zu der Wahrscheinlichkeit, dass sie zu einer anderen gehören, so dass Sie dies tun müssen Wenden Sie anschließend einen Schwellenwert an.

Wenn Sie die Vorverarbeitung verwenden möchten, um Ihr Ungleichgewicht zu beheben, empfehlen wir Ihnen, sich mit MetaCost zu befassen . Bei diesem Algorithmus wird ein Bagging von Modellen erstellt und anschließend die Klassenprioren geändert, um sie basierend auf den schwer vorhersehbaren Fällen auszugleichen. Es ist sehr elegant. Das Coole an Methoden wie SMOTE ist, dass Sie durch die Erstellung neuer Beobachtungen kleine Datensätze möglicherweise robuster machen.

Obwohl ich einige Dinge über Klassenungleichgewichte geschrieben habe, bin ich dennoch skeptisch, dass dies ein wichtiges Problem in der realen Welt ist. Ich würde denken, dass es sehr ungewöhnlich ist, dass Sie unausgeglichene Prioritäten in Ihrem Trainingsset haben, aber ausgeglichene Prioritäten in Ihren Daten der realen Welt. Machst du? Was normalerweise passiert, ist, dass sich Fehler vom Typ I von Fehlern vom Typ II unterscheiden, und ich würde wetten, dass die meisten Menschen besser dran sind, eine Kostenmatrix zu verwenden, die die meisten Schulungsmethoden akzeptieren, oder Sie können sie durch Vorverarbeitung mit MetaCost oder SMOTE anwenden. Ich denke oft, "Ungleichgewicht beheben" ist kurz für "Ich möchte nicht über den relativen Kompromiss zwischen Typ I- und II-Fehlern nachdenken".

Nachtrag:

Ich habe versucht, eingebaute Python-Algorithmen wie Adaboost, GradientBoost-Techniken mit sklearn. Ich habe gelesen, dass diese Algorithmen für den Umgang mit Ungleichgewichtsklassen vorgesehen sind.

AdaBoost liefert bessere Ergebnisse für Klassenungleichgewichte, wenn Sie die Gewichtsverteilung unter Berücksichtigung von Ungleichgewichten initialisieren. Ich kann die These graben, wo ich sie lese, wenn Sie wollen.

Natürlich liefern diese Methoden keine guten Genauigkeiten. Haben Sie ein Klassenungleichgewicht sowohl in Ihrem Training als auch in Ihrem Validierungsdatensatz? Sie sollten Metriken wie die F1-Bewertung verwenden oder eine Kostenmatrix an die Genauigkeitsfunktion übergeben. Das "Ungleichgewicht" in der Klasse wird behoben, wenn sich Ihre Prioritäten in Ihrem Training und in Ihren Validierungsfällen unterscheiden.

Ricardo Cruz
quelle
4

Einige der Algorithmen von sklearn haben einen Parameter namens class_weight , den Sie auf "ausgeglichen" setzen können . Auf diese Weise passt sklearn seine Klassengewichte abhängig von der Anzahl der Stichproben jeder Klasse an.

Versuchen Sie für den zufälligen Waldklassifizierer Folgendes und prüfen Sie, ob er Ihre Punktzahl verbessert:

rf = RandomForestClassifier(class_weight="balanced") # also add your other parameters!
stmax
quelle
(class_weight = "ausgeglichen") gibt nicht genügend Verbesserungen, als ich versuchte, es zu verwenden
SRS
2
class_weightkCk=2NkNsample_weight=[C_k for k in y]accuracy_scoref1_score
2

Ja, dies ist eine gute Technik, um das Problem des Klassenungleichgewichts anzugehen. Unterabtastungsmethoden führen jedoch zum Verlust von Informationen im Datensatz (z. B. haben Sie gerade ein interessantes Muster unter den verbleibenden Variablen entfernt, das zu einem besseren Training des Modells hätte beitragen können). Aus diesem Grund werden Überabtastungsmethoden bevorzugt, insbesondere bei kleineren Datenmengen.

Als Antwort auf Ihre Frage zu Python-Paketen ist die Toolbox für unausgeglichenes Lernen speziell für dieselbe Aufgabe vorgesehen. Es bietet verschiedene Methoden für Unter- und Überproben. Ich würde empfehlen, die SMOTE- Technik auszuprobieren .

Saurav--
quelle
1

Dies hängt von der Ensemble-Technik ab, die Sie verwenden möchten. Das Grundproblem, mit dem Sie arbeiten, ist ein Problem mit dem Datenungleichgewicht mehrerer Klassen. Unterprobenahme kann sowohl beim Absacken als auch beim Boosten effizient eingesetzt werden. Der SMOTE-Algorithmus ist sehr effizient bei der Erzeugung neuer Samples. Das Problem des Datenungleichgewichts wurde in der Literatur umfassend untersucht. Ich empfehle Ihnen, einen dieser Algorithmen zu lesen: SMOTE-Boost SMOTE-Bagging Rus-Boost EusBoost Hierbei handelt es sich um Boosting- / Bagging-Techniken, die speziell für Probleme mit Ungleichgewichtsdaten entwickelt wurden. Anstelle von SMOTE können Sie auch ADA-SMOTE oder Border-Line SMOTE ausprobieren. Ich habe das Border-Line SMOTE für mehrere Klassen verwendet und modifiziert und es ist sehr effizient. Wenn Ihre Datenbank sehr groß ist und das Problem einfach ist, versuchen Sie: Viola - Jones Klassifikator. Ich habe auch mit Datenungleichgewicht Problem verwendet und es ist wirklich effizient

Bashar Haddad
quelle
Vielen Dank für die Anleitung. Ich beschäftige mich mit den von Ihnen genannten Themen. Aber die Technik, mit der ich unterabgetastet habe (die Daten zufällig reduzieren), ist ein richtiger Weg?
SRS
Sie können es verwenden, wenn Ihre Datenbank sehr groß ist. Wenn Ihre Datenbank jedoch klein ist, verlieren Sie einige Informationen. Lesen Sie das Rus-Boosting. Bei dieser Methode wird als Teil des Boosting-Algorithmus eine zufällige Stichprobe verwendet, um zu vermeiden, dass Informationen verloren gehen. Sie unter Probe die Untergruppe, die für die Ausbildung des nächsten Grundschülers verwendet wird, aber nicht die gesamte Datenbank
Bashar Haddad
Mein Datensatz enthält fast 80.000 Datensätze, die ich als Trainingssatz verwende. Ich implementiere dies in Python. Ich suchte nach einigen Paketen in sklearn oder etwas anderem in Python. Ich konnte sie nicht finden. Ist dies etwas, für das ich eine Logik korrigieren sollte, um sie implementieren zu lassen?
SRS
Ich glaube nicht, dass es eine Implementierung für diese Methoden gibt. Das Problem des Datenungleichgewichts wird derzeit noch untersucht. Wenn Sie eine gute Implementierung für Adaboost.M1 oder M2 haben. Sie können es leicht ändern, um Rus Boost
Bashar Haddad
Ich denke, Ihre Datenbank ist ziemlich groß und wenn Sie möchten, können Sie den Viola-Jones-Klassifikator verwenden. Für diese können Sie verfügbare Implementierung finden
Bashar Haddad
0

Hier gibt es bereits einige gute Antworten. Ich dachte nur, ich würde noch eine Technik hinzufügen, da Sie anscheinend Ensembles von Bäumen verwenden. In vielen Fällen möchten Sie die Auftriebskurve oder die AUC für den ROC optimieren. Dafür würde ich das Hellinger-Entfernungskriterium empfehlen, um die Zweige in Ihren Bäumen zu teilen. Zum Zeitpunkt des Schreibens ist dies nicht im Paket für unausgeglichenes Lernen enthalten, aber es sieht so aus, als ob es einen Plan gibt .

Keith
quelle
0

Wenn Sie sich mit dem Problem des Klassenungleichgewichts befassen, sollten Sie sich hauptsächlich auf die Fehlermetrik konzentrieren und die F1-Punktzahl als Fehlermetrik auswählen.

Nach Auswahl der richtigen Metrik können wir verschiedene Techniken verwenden, um dieses Problem zu beheben.

Wenn Sie interessiert sind, können Sie in den folgenden Blog schauen, in dem die Techniken zur Lösung dieses Problems des Klassenungleichgewichts sehr gut erklärt werden:

https://knowledgengg.wordpress.com/2019/03/04/this-is-suresh/

Saisubrahmanyam Janapati
quelle