2013-02-25 6 views
20

Ich benutze Scikit-lernen in meinem Python-Programm, um einige maschinelle Lernvorgänge durchzuführen. Das Problem ist, dass mein Datensatz schwerwiegende Ungleichgewichtsprobleme hat.Ungleichgewicht in scikit-learn

Kennt jemand eine Lösung für Unausgewogenheit in Scikit-lernen oder in Python im Allgemeinen? In Java gibt es die SMOTE Mechanizm. Gibt es in Python etwas Paralleles?

+1

Sie können Oversampling/Undersampling versuchen, um den Datensatz auszugleichen. Natürlich ist dies eine allgemeine maschinelle Lernmethode und nicht spezifisch für Python und scikit-learn. Tatsächlich könnte diese Frage hier nicht behandelt werden. Vielleicht passt es besser zu den Statistiken. Sie haben sogar ein [unbalanced-classes-Tag] (http://stats.stackexchange.com/questions/tagged/unbalanced-classes). – Junuxx

+0

Ich weiß, das Thema ist alt, aber ich füge nur einen Ratschlag hinzu. Bei unausgeglichenen Datensätzen können Sie außer dem Oversampling/Undersampling und dem Parameter class_weight auch den Schwellenwert für die Klassifizierung Ihrer Fälle senken. Sagen Sie Wahrscheinlichkeiten voraus (anstelle von Klassen) und versuchen Sie, Schwellenwerte kleiner als 0,5 zu verwenden. Natürlich wird dies nicht die Leistung des Klassifikators erhöhen, es ist nur ein Kompromiss zwischen Präzision und Rückruf. – Stergios

+0

Stergios, wie genau können Sie die Schwelle einstellen? Irgendwelche Hinweise auf den Python-Code, der das tut? – KubiK888

Antwort

4

SMOTE ist nicht in scikit-learn integriert, aber es gibt trotzdem Implementierungen online.
, zum Beispiel.

+1

Nur aus dem Blick auf den Code enthält es 'TODO's. Ist diese Implementierung korrekt? – inspectorG4dget

+1

Der Code ist korrekt, ich habe gerade getestet. Das 'TODO' ist ein Spezialfall und vermisst etwas in etwa so:' T = T [np.random.choice (range (len (T)), N)] '. Aber behalte die Linie 'N = 100'! –

24

In Scikit lernen gibt es einige Ungleichgewichtskorrekturtechniken, die je nach verwendetem Lernalgorithmus variieren.

Einige von ihnen, wie Svm oder logistic regression, haben den Parameter class_weight. Wenn Sie einen SVC mit diesem auf 'auto' gesetzten Parameter instanziieren, wird jedes Klassenbeispiel proportional zur Umkehrung seiner Häufigkeit gewichtet.

Leider gibt es zu diesem Zweck kein Präprozessor-Tool.

+0

Ich habe versucht, Klasse Gewicht = "Auto" in meinen extrem unausgeglichenen Daten, aber ich habe nicht viel Unterschied in der Leistung sehen, ist es normal? – KubiK888

+0

@ KubiK888 testen und validieren Sie mit dem gleichen X? Welche Messung verwendest du? –

+0

Nein, Test- und Trainingssätze sind vollständig getrennt. – KubiK888

51

Es gibt ein neues Passwort zuschicken lassen

https://github.com/scikit-learn-contrib/imbalanced-learn

Es enthält viele Algorithmen in den folgenden Kategorien, einschließlich SMOTE

  • Under-Sampling der Mehrheitsklasse (n).
  • Überbemusterung der Minderheitenklasse.
  • Kombinieren von Über- und Unterabtastung.
  • Erstellen Sie Ensemble-Sets.
+3

Dies sollte jetzt die richtige Antwort IMO sein – ChucK