webentwicklung-frage-antwort-db.com.de

Unsymmetrische Klassifizierung mit RandomForestClassifier in sklearn

Ich habe einen Datensatz, bei dem die Klassen unausgewogen sind. Die Klassen sind entweder '1' oder '0', wobei das Verhältnis von Klasse '1': '0' 5: 1 ist. Wie berechnet man den Vorhersagefehler für jede Klasse und die Rebalance-Gewichte entsprechend in sklearn mit Random Forest, wie im folgenden Link: http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home. htm # balance

32
mlo

Sie können Beispielgewichtsargumente an Random Forest Fit-Methode übergeben.

sample_weight : array-like, shape = [n_samples] or None

Probegewichte. Wenn keine, werden die Proben gleich gewichtet. Splits Das würde untergeordnete Knoten mit einem Netto-Null- oder negativen Gewicht erzeugen wird bei der Suche nach einem Split in jedem Knoten ignoriert. Im Falle von Klassifizierungen werden Splits ebenfalls ignoriert, wenn sie zu einem .__ führen würden. einzelne Klasse mit negativem Gewicht in einem der untergeordneten Knoten.

In der älteren Version gab es eine preprocessing.balance_weights-Methode zum Generieren von Ausgleichsgewichten für bestimmte Stichproben, sodass die Klassen gleichmäßig verteilt werden. Es ist immer noch im internen, aber noch verwendbaren preprocessing._weights Modul vorhanden, aber veraltet und wird in zukünftigen Versionen entfernt. Keine genauen Gründe dafür.

Update

Einige Klarstellungen, da Sie verwirrt zu sein scheinen. Die Verwendung von sample_weight ist unkompliziert, wenn Sie sich daran erinnern, dass der Zweck darin besteht, Zielklassen im Trainingsdatensatz abzugleichen. Wenn Sie X als Beobachtungen und y als Klassen (Labels) verwenden, dann repräsentieren len(X) == len(y) == len(sample_wight) und jedes Element des sample witght1-d-Arrays die Gewichtung für ein entsprechendes (observation, label)-Paar. Wenn 1-Klasse 5-mal so dargestellt wird, wie 0-Klasse ist, und Sie Klassenverteilungen ausgleichen, können Sie für Ihren Fall simple verwenden 

sample_weight = np.array([5 if i == 0 else 1 for i in y])

gewichtung von 5 für alle 0-Instanzen und Gewichtung von 1 für alle 1-Instanzen. Siehe den Link oben für eine etwas ausgefeiltere balance_weights-Gewichtung.

44
alko

Dies ist wirklich eine Schande, dass die "Fit" -Methode von sklearn es nicht zulässt, eine Leistungskennzahl zu optimieren. Niemand in der Umgebung scheint zu verstehen, zu hinterfragen oder daran interessiert zu sein, was tatsächlich passiert, wenn man beim Lösen einer Klassifizierungsaufgabe eine geeignete Methode für das Datenmuster aufruft.

Wir (Benutzer des Scikit-Lernpakets) haben stillschweigend den Vorschlag, indirekt die kreuzvalidierte Rastersuche mit einer spezifischen Bewertungsmethode zu verwenden, die für unsymmetrische Datensätze geeignet ist, um auf einen Parametersatz/Metaparameter-Satz zu stoßen, der einen geeigneten AUC- oder F1-Score ergibt.

Aber denken Sie darüber nach: Sieht aus wie eine "Fit" -Methode, die unter der Motorhaube aufgerufen wird, optimiert immer die Genauigkeit. Wenn wir also versuchen, den F1-Score zu maximieren, gibt uns GridSearchCV ein "Modell mit dem besten F1 aus allen Modi mit der besten Genauigkeit". Ist das nicht dumm? Wäre es nicht besser, die Parameter des Modells direkt für die maximale F1-Bewertung zu optimieren? Erinnern Sie sich an das bewährte Matlab-ANNs-Paket, in dem Sie die gewünschte Leistungsmetrik auf RMSE, MAE einstellen können und was immer Sie möchten, wenn der Gradientenberechnungsalgorithmus definiert ist. Warum wird die Wahl der Leistungskennzahl in sklearn nicht berücksichtigt?

Warum gibt es zumindest keine einfache Möglichkeit, Klasseninstanzen automatisch zuzuweisen, um Probleme mit unausgeglichenen Datensätzen zu beheben? Warum müssen wir die Gewichte manuell berechnen? In vielen maschinellen Lernbüchern/Artikeln sah ich Autoren, die das Handbuch von sklearn als großartig, wenn nicht sogar als die besten Informationsquellen zum Thema priesen. Nicht wirklich? Warum ist das Problem unausgeglichener Datensätze (das für Datenwissenschaftler offensichtlich von großer Bedeutung ist) in den Dokumenten nicht einmal nirgends abgedeckt? Ich beantworte diese Fragen an Mitwirkende von sklearn, sollten sie dies lesen. Oder jemand, der die Gründe dafür kennt, kann dies gerne kommentieren und klären.

UPDATE

Seit scikit-learn 0.17 gibt es die Option class_weight = 'balance', die Sie mindestens an einige Klassifizierer übergeben können:

Der „symmetrische“ Modus verwendet die Werte von y, um die Einstellung automatisch vorzunehmen Gewichte sind umgekehrt proportional zu den Klassenfrequenzen in den Eingangsdaten als n_samples/(n_klassen * np.bincount (y)).

7

Wenn die Majoritätsklasse 1 ist und die Minoritätsklasse 0 ist und sie im Verhältnis 5: 1 sind, sollte das sample_weight-Array Folgendes sein:

sample_weight = np.array([5 if i == 1 else 1 for i in y])

Beachten Sie, dass Sie die Verhältnisse nicht invertieren. Dies gilt auch für class_weights. Die größere Anzahl ist der Majoritätsklasse zugeordnet.

2
Meena Mani

Verwenden Sie den Parameter class_weight='balanced' 

Aus der Sklearn-Dokumentation: Der Modus symmetrisch verwendet die Werte von y, um die Gewichte umgekehrt proportional zu den Klassenfrequenzen in den Eingangsdaten automatisch als n_samples / (n_classes * np.bincount(y)) anzupassen.

0
negas