Was ist eine gute OOB-Punktzahl für zufällige Wälder mit einer Drei-Klassen-Klassifizierung von sklearn? [Duplikat]

8

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 ginials 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).

Bach
quelle
2
Zu klären. Sie verwenden Scikit lernen ? Und es wird ein oob Score <0,001 gemeldet? Verwenden Sie dann die .score-Funktion für die neuen Daten, die Sie erhalten .63? Im Allgemeinen habe ich festgestellt, dass die oob-Werte die Kreuzvalidierungswerte widerspiegeln oder leicht unterschätzen. Ich denke, die Ergebnisse in der Scikit-Lernklassifizierung sind mittlere Genauigkeit über die Klassen hinweg (wenn ich die Dokumente richtig lese?), Daher sollten sie nicht direkt mit der allgemeinen / nicht mittleren Genauigkeit verglichen werden, aber dies ist implementierungsabhängig und sollte dies nicht verursachen große Diskrepanz.
Ryan Bressler
Ja, ich verwende Scikit Learn, der OOB-Score lag etwas unter 0,01 und der Score für Testdaten lag bei 0,63.
Bach
Sind Ihre Zeilen unabhängig oder haben Sie wiederholte Messungen desselben Falls (oder anderweitig hierarchische / gruppierte Daten)? Außerdem: Bitte klären Sie: Ist Ihre oob "Punktzahl" ein Fehlermaß oder ein Maß für die Übereinstimmung?
cbeleites unglücklich mit SX
Meine Zeilen wiederholen sich nicht, aber sie können abhängig sein. Ich glaube scikit, es oob_scoreist eine Punktzahl, das heißt ein Maß für die Übereinstimmung. Ich konnte es jedoch nicht dokumentiert finden.
Bach
Eine schnelle Suche brachte mich zur zufälligen Forest-Manpage, auf der "oob_score: bool Gibt an, ob Out-of-Bag-Samples zum Schätzen des Generalisierungsfehlers verwendet werden sollen", sodass dies für mich wie ein Fehlermaß aussieht. Wenn dies zutrifft, ist Ihre oob-Schätzung stark überoptimistisch - was ein erwartetes "Symptom" für abhängige Zeilen wäre.
cbeleites unglücklich mit SX

Antworten:

4

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:

  1. 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 zB max_features=0.33(wie mtryRs) und führen Sie es erneut aus. Sagen Sie uns die neuen Ergebnisse.

  2. "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?

  3. 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?

smci
quelle
6
Nur zu Ihrer Information , in scikit 0.16.1 ist der Standard für max_features "auto" und nicht 1, wobei "auto" in sqrt (number_features) übersetzt wird.
firefly2442
1

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 .

Ankur Singh
quelle
0

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.

Höhlenmensch
quelle
0

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?)

Anurag Priyadarshi
quelle