La forêt aléatoire est sur-adaptée?

19

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

Uwat
la source
2
Je ne vois pas une douzaine de «cadrans» pour les forêts aléatoires ici. Validation croisée? Prieurs bayésiens? Nature du rééchantillonnage? Ensemble d'entraînement pour chaque arbre? Quel pourcentage du sous-ensemble de chaque arbre? ... il y a beaucoup plus qui pourraient être énumérés, mais mon point est que vous avez d'autres entrées à considérer.
EngrStudent
1
Pourriez-vous expliquer le problème pour ceux qui ne connaissent pas le poker .. y a-t-il un calcul facile pour le score de poker? alors c'est plus facile de comprendre s'il y a quelque chose de fondamentalement mal à utiliser RF ... Je ne connais pas le poker, mais je soupçonne que RF est probablement la mauvaise approche - à savoir la première étape IN RF est de n'utiliser qu'une fraction des entrées, alors qu'il me semble qu'il n'y a aucun moyen de construire un bon classificateur en utilisant seulement un sous-ensemble des entrées - toutes les entrées sont nécessaires.
seanv507

Réponses:

45

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=Truelors 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-learnimplé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.

Bogdanovist
la source
1
Merci! Cependant, j'ai toujours une inquiétude: avec 400 000 exemples de formation et 50 arbres, j'ai obtenu 89,6% de correct, alors qu'avec autant de données et deux fois plus d'arbres, j'ai obtenu 89,7% de correct ... Est-ce que cela suggère que la RF n'est pas une bonne méthode pour cela? J'ai utilisé un réseau neuronal MLP dans le passé et j'ai atteint une précision de ~ 98,5% sur l'ensemble de test ...
Uwat
5
C'est possible, même s'il semble que vous n'utilisez pas assez d'arbres. Vous avez généralement besoin de milliers. Notez que le nombre d'arbres n'est pas un paramètre à régler dans l'algorithme RF, plus c'est toujours mieux, mais une fois que vous avez `` assez '' (à déterminer empiriquement) l'erreur OOB ne s'améliore pas avec plus d'arbres. Même pour les petits ensembles de données simples, rien de moins de 500 arbres n'est pas suffisant.
Bogdanovist
1
Il y a quelques mises en garde mineures pour `` plus c'est toujours mieux '' pour le nombre d'arbres, mais je crois comprendre que vous avez besoin de plusieurs millions d'arbres avant de commencer à prendre un coup de performance. D'après mon expérience, autant d'arbres que vous avez les ressources CPU et la patience pour générer le meilleur, mais avec des rendements décroissants une fois que les plateaux de la courbe OBB (ntrees).
Bogdanovist
12

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)

seanv507
la source
1
C'était ça! Précision de 95% avec 50 arbres et 600 000 exemples d'entraînement.
Uwat
2
Notez qu'à ce stade, vous n'utilisez guère une forêt aléatoire, mais comme d'autres réponses l'ont indiqué, ce n'est pas le classificateur idéal pour ce problème exact.
Richard Rast