Zufälliger Wald ist überpassend?

19

Ich experimentiere mit Scikit-Learn in zufälligen Wäldern und erhalte großartige Ergebnisse mit meinem Trainingssatz, aber relativ schlechte Ergebnisse mit meinem Testsatz ...

Hier ist das Problem (inspiriert vom Poker), das ich zu lösen versuche: Mit den Hole Cards von Spieler A, den Hole Cards von Spieler B und einem Flop (3 Karten), welcher Spieler hat das beste Blatt? Mathematisch sind dies 14 Eingänge (7 Karten - jeweils ein Rang und eine Farbe) und ein Ausgang (0 oder 1).

Hier sind einige meiner bisherigen Ergebnisse:

Training set size: 600k, test set size: 120k, number of trees: 25
Success rate in training set: 99.975%
Success rate in testing set: 90.05%

Training set size: 400k, test set size: 80k, number of trees: 100
Success rate in training set: 100%
Success rate in testing set: 89.7%

Training set size: 600k, test set size: 120k, number of trees: 5
Success rate in training set: 98.685%
Success rate in testing set: 85.69%

Hier wird der relevante Code verwendet:

from sklearn.ensemble import RandomForestClassifier
Forest = RandomForestClassifier(n_estimators = 25) #n_estimator varies
Forest = Forest.fit(inputs[:trainingSetSize],outputs[:trainingSetSize])
trainingOutputs = Forest.predict(inputs[:trainingSetSize])
testOutputs = Forest.predict(inputs[trainingSetSize:])

Unabhängig von der Anzahl der verwendeten Bäume scheint die Leistung des Trainingssatzes trotz eines relativ großen Trainingssatzes und einer relativ geringen Anzahl von Merkmalen viel besser zu sein als bei einem Testsatz.

Uwat
quelle
2
Ich sehe hier nicht etwa ein Dutzend der 'Wählscheiben' für zufällige Wälder. Gegenvalidierung? Bayesianische Priors? Art des Resamplings? Trainingsset für jeden Baum? Wie viel Prozent der Teilmenge an jedem Baum? ... es gibt viel mehr, das aufgezählt werden könnte, aber ich möchte betonen, dass Sie andere Eingaben berücksichtigen müssen.
EngrStudent
1
Könnten Sie das Problem für diejenigen erklären, die sich mit Poker nicht auskennen? Gibt es eine einfache Berechnung für das Pokerergebnis? dann ist es einfacher zu verstehen, ob etwas grundlegend falsch mit der Verwendung von RF ist ... Ich kenne Poker nicht, aber ich vermute, RF ist wahrscheinlich der falsche Ansatz - der erste Schritt bei IN RF besteht darin, nur einen Bruchteil der Eingaben zu verwenden. Mir scheint, dass es nicht möglich ist, einen guten Klassifikator mit nur einer Teilmenge der Eingaben zu erstellen - alle Eingaben sind erforderlich.
Seanv507

Antworten:

45

Dies ist ein häufiger Anfängerfehler bei der Verwendung von RF-Modellen (ich werde meine Hand als früherer Täter erheben). Die Gesamtstruktur, die Sie mit dem Trainingsset erstellen, passt in vielen Fällen (wie Sie feststellen) nahezu perfekt zu den Trainingsdaten, wenn sie in ihrer Gesamtheit betrachtet werden. Während der Algorithmus die Gesamtstruktur erstellt, merkt er sich jedoch den OOB-Vorhersagefehler (Out-of-Bag), der die beste Schätzung des Generalisierungsfehlers darstellt.

Wenn Sie die Trainingsdaten in die Vorhersagemethode zurücksenden (wie Sie es tun), erhalten Sie diese fast perfekte Vorhersage (die äußerst optimistisch ist) anstelle des korrekten OOB-Fehlers. Mach das nicht. Stattdessen sollte sich das trainierte Forest-Objekt den OOB-Fehler merken. Ich bin mit der Implementierung von Scikit-Learn nicht vertraut, aber wenn Sie sich die Dokumentation hier ansehen, müssen Sie sie oob_score=Truebeim Aufrufen der Fit-Methode angeben. Dann wird der Generalisierungsfehler als gespeichertoob_score_im zurückgegebenen Objekt. Wenn Sie im R-Paket "randomForest" die Vorhersagemethode ohne Argumente für das zurückgegebene Objekt aufrufen, wird die OOB-Vorhersage für den Trainingssatz zurückgegeben. Auf diese Weise können Sie den Fehler mit einer anderen Kennzahl definieren. Wenn Sie das Trainingsset zurück in die Vorhersagemethode senden, erhalten Sie ein anderes Ergebnis, da alle Bäume verwendet werden. Ich weiß nicht, ob die scikit-learnImplementierung dies tun wird oder nicht.

Es ist ein Fehler, die Trainingsdaten zurück in die Vorhersagemethode zu senden, um die Genauigkeit zu testen. Es ist jedoch ein sehr häufiger Fehler, also mach dir keine Sorgen.

Bogdanovist
quelle
1
Vielen Dank! Ich habe jedoch immer noch Bedenken: Mit 400.000 Trainingsbeispielen und 50 Bäumen habe ich 89,6% richtig erhalten, während ich mit so vielen Daten und doppelt so vielen Bäumen 89,7% richtig erhalten habe Methode dafür? Ich habe in der Vergangenheit ein neuronales MLP-Netzwerk verwendet und eine Genauigkeit von ~ 98,5% auf dem Testset erreicht ...
Uwat
5
Das ist möglich, obwohl es so aussieht, als würden Sie nicht genug Bäume verwenden. Normalerweise benötigen Sie Tausende. Beachten Sie, dass die Anzahl der Bäume kein Parameter ist, der im RF-Algorithmus eingestellt werden muss. Mehr ist immer besser, aber wenn Sie genug (empirisch zu bestimmen) haben, verbessert sich der OOB-Fehler nicht mit mehr Bäumen. Selbst für kleine einfache Datensätze reichen weniger als 500 Bäume bei weitem nicht aus.
Bogdanovist
1
Bei der Anzahl der Bäume gibt es einige kleinere Einschränkungen: "Mehr ist immer besser". Ich bin jedoch der Ansicht, dass Sie eine Unmenge von Bäumen benötigen, bevor Sie einen Leistungstreffer erzielen können. Nach meiner Erfahrung haben so viele Bäume wie Sie die CPU-Ressourcen und die Geduld, um die besseren zu generieren, wenn auch mit abnehmenden Renditen, sobald die OBB (ntrees) -Kurvenplateaus.
Bogdanovist
12

Ich denke, die Antwort ist der Parameter max_features: int, string oder None, optionaler Parameter (Standard = "auto"). Grundsätzlich sollten Sie für dieses Problem den Wert None festlegen, damit jeder Baum mit allen Eingaben erstellt wird, da Sie eindeutig keinen richtigen Klassifikator mit nur einem Bruchteil der Karten erstellen können (standardmäßig wählt "auto" sqrt (nfeatures) aus. Eingaben für jeden Baum)

seanv507
quelle
1
Das war's! 95% Genauigkeit mit 50 Bäumen und 600.000 Trainingsbeispielen.
Uwat
2
Beachten Sie, dass Sie zu diesem Zeitpunkt kaum eine zufällige Gesamtstruktur verwenden. Wie in anderen Antworten angegeben, ist dies jedoch nicht der ideale Klassifikator für genau dieses Problem.
Richard Rast