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.
Antworten:
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=True
beim 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 diescikit-learn
Implementierung 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.
quelle
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)
quelle