Ich habe Lerndaten, die aus ~ 45.000 Stichproben bestehen, jede hat 21 Funktionen. Ich versuche, einen zufälligen Gesamtstrukturklassifizierer für diese Daten zu trainieren, der mit 3 Klassen (-1, 0 und 1) gekennzeichnet ist. Die Klassen sind in ihrer Größe mehr oder weniger gleich.
Mein zufälliges Waldklassifikatormodell verwendet gini
als Split-Qualitätskriterium, die Anzahl der Bäume beträgt 10, und ich habe die Tiefe eines Baums nicht begrenzt.
Die meisten Merkmale haben eine vernachlässigbare Bedeutung gezeigt - der Mittelwert liegt bei etwa 5%, ein Drittel von ihnen ist von Bedeutung 0, ein Drittel von ihnen ist von Bedeutung über dem Mittelwert.
Die vielleicht auffälligste Tatsache ist jedoch die oob-Punktzahl (out-of-bag): etwas weniger als 1%. Ich dachte, das Modell versagt, und als ich das Modell an einem neuen unabhängigen Satz mit einer Größe von ~ 40k testete, erhielt ich eine Punktzahl von 63% (klingt bisher gut), aber eine genauere Betrachtung der Verwirrungsmatrix hat mir gezeigt, dass die Das Modell ist nur für die Klasse 0 erfolgreich und schlägt in etwa 50% der Fälle fehl, wenn zwischen 1 und -1 entschieden wird.
Pythons Ausgabe im Anhang:
array([[ 7732, 185, 6259],
[ 390, 11506, 256],
[ 7442, 161, 6378]])
Dies liegt natürlich daran, dass die 0-Klasse spezielle Eigenschaften hat, die die Vorhersage erheblich erleichtern. Stimmt es jedoch, dass die von mir gefundene oob-Punktzahl bereits ein Zeichen dafür ist, dass das Modell nicht gut ist? Was ist ein guter oob Score für zufällige Wälder ? Gibt es ein Faustgesetz, mit dessen Hilfe festgestellt werden kann, ob ein Modell "gut" ist, allein anhand des OOB-Scores oder in Kombination mit anderen Ergebnissen des Modells?
Bearbeiten: Nach dem Entfernen fehlerhafter Daten (etwa ein Drittel der Daten) betrugen die Beschriftungen mehr oder weniger 2% für 0 und 49% für jeweils -1 / + 1. Der oob-Wert betrug 0,011 und der Wert für die Testdaten betrug 0,49, wobei die Verwirrungsmatrix kaum auf Klasse 1 ausgerichtet war (etwa 3/4 der Vorhersagen).
scikit
, esoob_score
ist eine Punktzahl, das heißt ein Maß für die Übereinstimmung. Ich konnte es jedoch nicht dokumentiert finden.Antworten:
sklearns RF
oob_score_
(beachten Sie den nachfolgenden Unterstrich) ist im Vergleich zu Rs nach dem Lesen des sklearn-Dokuments und des Quellcodes nicht sehr verständlich. Mein Rat zur Verbesserung Ihres Modells lautet wie folgt:Die RF von sklearn verwendete die schreckliche Standardeinstellung von
max_features=1
(wie in " Probieren Sie jede Funktion auf jedem Knoten aus"). Dann wird keine zufällige Spaltenauswahl (/ feature) mehr wie bei einer zufälligen Gesamtstruktur durchgeführt. Ändern Sie dies in zBmax_features=0.33
(wiemtry
Rs) und führen Sie es erneut aus. Sagen Sie uns die neuen Ergebnisse."Die meisten Funktionen haben eine vernachlässigbare Bedeutung gezeigt" . Anschließend müssen Sie die Feature-Auswahl gemäß Dokument durchführen - zur Klassifizierung. Lesen Sie das Dokument und andere Artikel hier auf CrossValidated.SE. Führen Sie den FS auf einem anderen (z. B. 20-30%) Holdout-Set als im Rest des Trainings durch, z. B.
sklearn.cross_validation.train_test_split()
(ja, der Name ist etwas irreführend). Sagen Sie uns jetzt die Ergebnisse, die Sie nach FS erhalten?Sie gesagt „schlechte Daten nach Entfernen (ungefähr Drittel der Daten), die Etiketten waren mehr oder weniger 2% für 0 und 49% für jedes von -1 / + 1“ ; dann hast du ein schweres Klassenungleichgewicht . Außerdem: "Verwirrungsmatrix zeigt, dass das Modell nur für Klasse 0 erfolgreich ist und in etwa 50% der Fälle zwischen +1 und -1 fehlschlägt" . Dies ist ein Symptom für das Klassenungleichgewicht. Entweder verwenden Sie eine geschichtete Stichprobe oder Sie trainieren einen Klassifikator mit Beispielen für die Klassen +1 und -1. Sie können entweder einen OAA-Klassifikator (One-Against-All) oder einen OAO-Klassifikator (One-Against-One) ausführen. Probieren Sie drei OAA-Klassifikatoren aus, einen für jede Klasse. Sagen Sie uns endlich diese Ergebnisse?
quelle
Es gibt keinen guten oob_score, es ist der Unterschied zwischen valid_score und oob_score, der zählt.
Stellen Sie sich oob_score als Punktzahl für eine Teilmenge (z. B. oob_set) der Trainingsmenge vor. Um zu erfahren, wie es erstellt wurde, lesen Sie dies .
oob_set wird aus Ihrem Trainingsset entnommen. Und Sie haben bereits Ihr Validierungsset (z. B. valid_set).
Nehmen wir ein Szenario an, in dem Ihr Validierungswert 0,7365 und Ihr Bestätigungswert 0,8329 beträgt
In diesem Szenario schneidet Ihr Modell mit oob_set besser ab, das direkt aus Ihrem Trainingsdatensatz entnommen wird. Validation_set gilt für einen anderen Zeitraum. (Angenommen, training_set enthält Datensätze für den Monat "Januar" und validation_set enthält Datensätze für den Monat "Juli"). Oob_score ist also mehr als ein Test für die Leistung des Modells. Es ist ein Test dafür, "wie repräsentativ Ihr Validation_set ist".
Sie sollten immer sicherstellen, dass Sie über ein gutes repräsentatives Validierungsset verfügen, da dessen Punktzahl als Indikator für die Leistung unseres Modells verwendet wird. Ihr Ziel sollte es also sein, so wenig Unterschied wie möglich zwischen oob_score und valid_score zu haben.
Im Allgemeinen verwende ich oob_score mit validation_score, um zu sehen, wie gut mein validation_set ist. Ich habe diese Technik von Jeremy Howard gelernt .
quelle
F: Was ist ein guter OOB-Score für zufällige Wälder mit einer Drei-Klassen-Klassifizierung von sklearn?
A: Kommt darauf an. Wenn aus meiner Sicht Lern- und Testproben aus derselben Verteilung gezogen werden, entspricht OOB meiner Ansicht nach einer ungefähr dreifachen Kreuzvalidierung. Wenn wir also dieselbe Frage wiederholen, aber mit "3-facher Kreuzvalidierung", wäre die Antwort dieselbe, dh "im Allgemeinen ist die Genauigkeit umso höher, je besser, es sei denn, Sie befürchten, Ihren Lernsatz zu übertreffen, weil Ihnen dies jemand gesagt hat." Die wahren Testproben haben eine andere Verteilung. "
Können Sie mir Ihren Datensatz geben? Ich kann wenig Spaß damit haben und dir kostenlos sagen, was ich damit mache.
quelle
Eine andere Sichtweise auf die Frage: Zunächst müssen Sie jeder Fehlklassifizierung, die Sie vornehmen, einen Verlust zuordnen. Dieser Preis / Verlust / Strafe für Fehlklassifizierung würde (wahrscheinlich) für False Positive (FP) und False Negatives (FN) unterschiedlich sein. Einige Klassifikationen, beispielsweise die Krebserkennung, hätten lieber mehr FPs als FNs. Einige andere, beispielsweise Spamfilter, erlauben lieber bestimmte Spam-Mails (FN) als Block-Mails (FP) von Ihrem Freund. Aufbauend auf dieser Logik können Sie F1-Score oder Genauigkeit verwenden, je nachdem, was Ihrem Zweck entspricht. (Zum Beispiel könnte ich mich freuen, wenn mein Spamfilter keine FPs und einen Score von 0,1 hat, da ich 10% weniger Spam habe, um den ich mich sorgen muss Auf der anderen Seite könnte jemand anderes mit sogar 0,9 unzufrieden sein (90% gefilterter Spam). Was wäre dann eine gute Punktzahl?)
quelle