J'expérimente avec des forêts aléatoires avec scikit-learn et j'obtiens d'excellents résultats de mon ensemble d'entraînement, mais des résultats relativement médiocres sur mon ensemble de test ...
Voici le problème (inspiré du poker) que j'essaie de résoudre: étant donné les cartes fermées du joueur A, les cartes fermées du joueur B et un flop (3 cartes), quel joueur a la meilleure main? Mathématiquement, cela fait 14 entrées (7 cartes - un rang et une couleur pour chacune) et une sortie (0 ou 1).
Voici certains de mes résultats jusqu'à présent:
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%
Voici le code pertinent utilisé:
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:])
Il semble que quel que soit le nombre d'arbres utilisés, les performances sur l'ensemble d'entraînement sont bien meilleures que sur l'ensemble de test, malgré un ensemble d'entraînement relativement important et un nombre raisonnablement petit de fonctionnalités ...
Réponses:
Il s'agit d'une erreur de recrue courante lors de l'utilisation de modèles RF (je lèverai la main en tant qu'auteur précédent). Dans la plupart des cas, la forêt que vous construisez à l'aide de l'ensemble d'entraînement s'adaptera presque parfaitement aux données d'entraînement (comme vous le constatez) lorsqu'elle est considérée dans son ensemble. Cependant, lorsque l'algorithme crée la forêt, il se souvient de l'erreur de prédiction hors sac (OOB), qui est sa meilleure estimation de l'erreur de généralisation.
Si vous renvoyez les données d'entraînement dans la méthode de prédiction (comme vous le faites), vous obtenez cette prédiction presque parfaite (qui est extrêmement optimiste) au lieu de l'erreur OOB correcte. Ne fais pas ça. À la place, l'objet Forest formé doit avoir mémorisé en son sein l'erreur OOB. Je ne connais pas l'implémentation de scikit-learn mais en regardant la documentation ici, il semble que vous devez spécifier
oob_score=True
lors de l'appel de la méthode fit, puis l'erreur de généralisation sera stockée sous la formeoob_score_
dans l'objet retourné. Dans le package R "randomForest", l'appel de la méthode Predict sans argument sur l'objet retourné renverra la prédiction OOB sur l'ensemble d'apprentissage. Cela vous permet de définir l'erreur à l'aide d'une autre mesure. L'envoi de l'ensemble d'entraînement dans la méthode de prévision vous donnera un résultat différent, car cela utilisera tous les arbres. Je ne sais pas si l'scikit-learn
implémentation fera cela ou non.C'est une erreur de renvoyer les données d'entraînement dans la méthode de prédiction afin de tester la précision. C'est une erreur très courante, alors ne vous inquiétez pas.
la source
Je pense que la réponse est le paramètre max_features: int, string ou None, paramètre facultatif (par défaut = "auto"). Fondamentalement, pour ce problème, vous devez le définir sur Aucun, de sorte que chaque arbre soit construit avec toutes les entrées, car il est clair que vous ne pouvez pas créer un classificateur approprié en utilisant seulement une fraction des cartes (par défaut, "auto" sélectionne sqrt (nfeatures) entrées pour chaque arbre)
la source