Ich habe festgestellt, dass He and Garcia (2009) eine hilfreiche Wiederholung des Lernens in unausgeglichenen Klassenproblemen ist. Hier sind ein paar auf jeden Fall nicht umfassende Dinge zu beachten:
Datenbasierte Ansätze:
Man kann die Mehrheitsklasse unter- oder die Minderheitsklasse überabtasten. (Breiman wies darauf hin, dass dies formal der Zuweisung von nicht einheitlichen Fehlklassifizierungskosten entspricht.) Dies kann zu Problemen führen: Unterabtastung kann dazu führen, dass der Lernende Aspekte der Mehrheitsklasse übersieht. Überabtastung erhöht das Risiko einer Überanpassung.
Es gibt "informierte Unterabtastungsmethoden", die diese Probleme reduzieren. Eines davon ist EasyEnsemble , das mehrere Teilmengen aus der Mehrheitsklasse unabhängig voneinander abtastet und mehrere Klassifikatoren erstellt, indem jede Teilmenge mit allen Daten der Minderheitenklasse kombiniert wird.
Mit SMOTE (Synthetic Minority Oversampling Technique) oder SMOTEBoost (SMOTE mit Boosten kombinieren) werden synthetische Instanzen der Minderheitsklasse erstellt, indem im Feature-Space die nächsten Nachbarn erstellt werden. SMOTE ist in R im DMwR-Paket implementiert (das Luis Torgos Buch „Data Mining mit R, Lernen mit Fallstudien“ CRC Press 2016 begleitet ).
Ansätze zur Modellanpassung
Wenden Sie in Ihrer Verlustfunktion klassenspezifische Gewichte an (größere Gewichte für Minderheitenfälle).
Für baumbasierte Ansätze können Sie die Hellinger-Distanz als Knotenverunreinigungsfunktion verwenden, wie in Cieslak et al. "Hellinger-Entfernungsentscheidungsbäume sind robust und schräglaufunempfindlich" ( Weka-Code hier .)
Verwenden Sie einen Ein-Klassen-Klassifikator , lernen Sie entweder (je nach Modell) eine Wahrscheinlichkeitsdichte oder eine Grenze für eine Klasse und behandeln Sie die andere Klasse als Ausreißer.
Verwenden Sie die Genauigkeit natürlich nicht als Metrik für die Modellbildung. Cohens Kappa ist eine vernünftige Alternative.
Modellbewertungsansätze
Wenn Ihr Modell vorhergesagte Wahrscheinlichkeiten oder andere Ergebnisse zurückgibt, wählen Sie einen Entscheidungsgrenzwert, der einen angemessenen Kompromiss zwischen Fehlern eingeht (unter Verwendung eines Datasets, das unabhängig von Training und Test ist). In R implementiert das Paket OptimalCutpoints eine Reihe von Algorithmen, einschließlich kostensensitiver, um einen Cutoff zu bestimmen.
Ich verstehe, dass dies ein aktives Forschungsgebiet in der maschinellen Lerngemeinschaft ist und es keine guten Antworten gibt, sondern eine große und wachsende Anzahl möglicher Lösungen. Sie werden wahrscheinlich bessere Antworten erhalten, wenn Sie die spezifischen Algorithmen angeben, die Sie in Betracht ziehen.
Wenn Sie ein parametrisches Modell (logistische Regression) verwenden, sollte dies weniger problematisch sein, und Sie können den Schwellenwert einfach basierend auf Ihrer Verlustfunktion (Kosten für falsch negative zu falsch positiven) variieren.
Wenn Sie Algorithmen für maschinelles Lernen verwenden, ist dies möglicherweise schwieriger. Max Kuhn unternimmt einen fairen Versuch, das Thema in Kapitel 16 von "Applied Predictive Modeling" zusammenzufassen. Aber herausforderndes Thema, um es zusammenzufassen. Wenn Sie das Buch nicht kaufen möchten, ist der R-Code im AppliedPredictiveModeling-Paket für dieses Kapitel verfügbar und kann ausreichen, abhängig von Ihrer Kenntnis von R und den verwendeten Algorithmen.
Normalerweise dreht sich die Diskussion um Unterabtastung / Überabtastung +/- kostensensitive Algorithmen. Mit Variationen wie Jous-Boost auch möglich.
Ein Beispiel für diese Art von Diskussion: Chen et al. "Verwenden von Random Forest zum Erlernen unausgeglichener Daten" http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf
quelle
Sie können einen Blick auf die Implementierung von scikit-learn werfen. Achten Sie auf das Argument class_ weight, das Werte eines Wörterbuchs mit Klassengewichten oder 'auto' enthalten kann:
klasse sklearn.svm.SVC (C = 1.0, kernel = 'rbf', grad = 3, gamma = 0.0, coef0 = 0.0, schrumpfen = True, wahrscheinlichkeit = False, tol = 0.001, cache_size = 200, class_weight = None, verbose = False, max_iter = -1, random_state = None)
Sie können mit dem Wert des class_weight-Arguments spielen, das ein Klassengewichtungswörterbuch oder 'auto' sein kann. Im 'Auto'-Modus weist der Lernalgorithmus jeder Klasse automatisch Gewichte zu, basierend auf der Anzahl der Proben in jeder Klasse.
scikit-learn verfügt über mehrere andere Klassifizierungsalgorithmen, von denen einige Klassengewichte akzeptieren.
quelle