web-dev-qa-db-fra.com

Comment résoudre le sur-ajustement dans une forêt aléatoire de Python sklearn?

J'utilise RandomForestClassifier implémenté dans python package sklearn pour construire un modèle de classification binaire. Ce qui suit est le résultat de validations croisées:

Fold 1 : Train: 164  Test: 40
Train Accuracy: 0.914634146341
Test Accuracy: 0.55

Fold 2 : Train: 163  Test: 41
Train Accuracy: 0.871165644172
Test Accuracy: 0.707317073171

Fold 3 : Train: 163  Test: 41
Train Accuracy: 0.889570552147
Test Accuracy: 0.585365853659

Fold 4 : Train: 163  Test: 41
Train Accuracy: 0.871165644172
Test Accuracy: 0.756097560976

Fold 5 : Train: 163  Test: 41
Train Accuracy: 0.883435582822
Test Accuracy: 0.512195121951

J'utilise la fonction "Prix" pour prédire la "qualité" qui est une valeur ordinale. Dans chaque validation croisée, il y a 163 exemples de formation et 41 exemples de test.

Apparemment, le sur-ajustement se produit ici. Existe-t-il des paramètres fournis par sklearn qui peuvent être utilisés pour résoudre ce problème? J'ai trouvé quelques paramètres ici , par exemple min_samples_split et min_sample_leaf, mais je ne comprends pas très bien comment les régler.

Merci d'avance!

27
Munichong

Je serais d'accord avec @Falcon w.r.t. la taille du jeu de données. Il est probable que le principal problème soit la petite taille de l'ensemble de données. Si possible, la meilleure chose que vous puissiez faire est d'obtenir plus de données, plus il y a de données (généralement), moins elles sont susceptibles de s'ajuster, car les modèles aléatoires qui semblent prédictifs commencent à se noyer à mesure que la taille de l'ensemble de données augmente.

Cela dit, je regarderais les paramètres suivants:

  1. n_estimators: @Falcon est faux, en général plus il y a d'arbres moins probable l'algorithme doit être surchargé. Essayez donc en augmentant. Plus ce nombre est bas, plus le modèle est proche d'un arbre de décision, avec un ensemble de fonctionnalités restreint.
  2. max_features: essayez de réduire ce nombre (essayez 30 à 50% du nombre de fonctionnalités). Cela détermine le nombre d'entités attribuées au hasard à chaque arbre. Le plus petit, le moins susceptible de sur-adapter, mais trop petit commencera à introduire un sous-ajustement.
  3. max_depth: Expérimentez avec cela. Cela réduira la complexité des modèles appris, réduisant ainsi le risque de surajustement. Essayez de commencer petit, disons 5-10, et en augmentant vous obtenez le meilleur résultat.
  4. min_samples_leaf: essayez de définir cette valeur sur des valeurs supérieures à un. Cela a un effet similaire au paramètre max_depth, cela signifie que la branche cessera de se séparer une fois que les feuilles auront ce nombre d'échantillons chacune.

Notez que lorsque vous faites ce travail, soyez scientifique. Utilisez 3 jeux de données, un jeu de formation, un jeu de données de "développement" distinct pour ajuster vos paramètres et un jeu de test qui teste le modèle final, avec les paramètres optimaux. Ne modifiez qu'un paramètre à la fois et évaluez le résultat. Ou expérimentez l'algorithme sklearn gridsearch pour rechercher à travers ces paramètres en une seule fois.

53
Simon