Discussion sur l'overfit dans xgboost

20

Ma configuration est la suivante:

Je suis les directives dans "Modélisation prédictive appliquée". J'ai donc filtré les fonctionnalités corrélées et je me retrouve avec ce qui suit:

  • 4900 points de données dans l'ensemble d'apprentissage et 1600 points de données dans l'ensemble de test.
  • J'ai 26 fonctionnalités et la cible est une variable continue.

J'applique une validation croisée 5 fois aux modèles de train utilisant le caretpackage. Lorsque j'applique un modèle MARS, j'obtiens une erreur absolue moyenne (MAE) d'environ 4 sur l'ensemble d'entraînement ainsi que sur l'ensemble de test.

Cependant, en appliquant xgboost (soit l'algorithme d'arbre, soit l'algorithme linéaire), j'obtiens quelque chose comme 0,32 (!) Sur l'ensemble d'entraînement et 2,4 sur l'ensemble de test.

Ainsi, si l'erreur de test est 8 fois l'erreur d'entraînement, je dirais: j'ai surajusté les données d'entraînement. Je reçois quand même une petite erreur de test.

J'utilise les paramètres suivants sur xgboost:

  • nrounds = 1000et eta = 0.01(l'augmentation du nombre et la diminution de l'éta pourraient aider, mais je manque de mémoire et le temps d'exécution est trop long)
  • max_depth = 16: si je compare d'autres publications et la valeur par défaut de 6, cela semble important, mais le problème est assez complexe - peut-être que 16 n'est pas trop grand dans ce cas.
  • colsample_bytree = 0.7, subsample = 0.8et min_child_weight = 5: en faisant cela, j'essaie de réduire la surcharge.

Si je réduit max_depth, le train et l'erreur de test se rapprochent, mais il y a toujours un grand écart et l'erreur de test est plus grande (un peu au-dessus de 3).

En utilisant le booster linéaire, j'obtiens à peu près le même train et l'erreur de test sur les paramètres optimaux:

  • lambda = 90 et `alpha = 0: trouvé par validation croisée, lambda devrait empêcher la surcharge.
  • colsample_bytree = 0.8, subsample = 0.8et min_child_weight = 5: en faisant cela, j'essaie de réduire la surcharge.

Mon sentiment est que xgboost est toujours sur-adapté - mais l'erreur de formation et pour autant que je puisse voir dans le test en temps réel (j'ai utilisé les modèles xgboost et un ensemble d'entre eux en réalité pendant 4 jours) semble ok-ish (l'erreur est plus grande que l'erreur de test, mais il y a plus d'incertitude dans la vie réelle concernant la prévision des caractéristiques et d'autres variables).

Que pensez-vous: puis-je accepter la sur-tenue si (si cela est possible) les performances réelles sont supérieures? Est-ce que xgboost dans mon environnement a tendance à sur-équiper?

Ric
la source

Réponses:

34

Le sur-ajustement est-il si mauvais que vous ne devriez pas choisir un modèle qui s'adapte, même si son erreur de test est plus petite? Non. Mais vous devriez avoir une justification pour le choisir.

Ce comportement n'est pas limité à XGBoost. C'est un fil conducteur parmi toutes les techniques d'apprentissage automatique; trouver le bon compromis entre le sous-ajustement et le sur-ajustement. La définition formelle est le compromis de la variance de biais (Wikipedia) .

Le compromis biais-variance

Ce qui suit est une simplification du compromis Biais-variance, pour aider à justifier le choix de votre modèle.

  • Nous disons qu'un modèle a un biais élevé s'il n'est pas en mesure d'utiliser pleinement les informations contenues dans les données. Il dépend trop d'informations générales, telles que le cas le plus fréquent, la moyenne de la réponse ou quelques fonctionnalités puissantes. Le biais peut provenir de fausses hypothèses, par exemple en supposant que les variables sont normalement distribuées ou que le modèle est linéaire.

  • Nous disons qu'un modèle présente une variance élevée s'il utilise trop d'informations provenant des données. Il s'appuie sur des informations qui ne se révèlent que dans l'ensemble de formation qui lui a été présenté, qui ne se généralise pas assez bien. En règle générale, le modèle changera beaucoup si vous modifiez l'ensemble de formation, d'où le nom "variance élevée".

Ces définitions sont très similaires aux définitions de sous-ajustement et de sur-ajustement. Cependant, ces définitions sont souvent trop simplifiées pour être opposées, comme dans

  • Le modèle ne convient pas si les erreurs de formation et de test sont élevées. Cela signifie que le modèle est trop simple.
  • Le modèle est trop adapté si l'erreur de test est supérieure à l'erreur d'apprentissage. Cela signifie que le modèle est trop complexe.

Ces simplifications sont bien sûr utiles, car elles aident à choisir la bonne complexité du modèle. Mais ils négligent un point important, le fait que (presque) chaque modèle comporte à la fois un biais et une composante de variance. La description du sous-ajustement / sur-ajustement vous indique que vous avez trop de biais / trop de variance, mais vous avez (presque) toujours les deux .

Si vous voulez plus d'informations sur le compromis biais-variance, ils sont beaucoup de visualisation utile et une bonne ressource disponible via google. Chaque manuel d'apprentissage automatique aura une section sur le compromis biais-variance, en voici quelques-uns

  • Une introduction à l'apprentissage statistique et éléments d'apprentissage statistique (disponible ici) .
  • Reconnaissance des formes et apprentissage automatique, par Christopher Bishop.
  • Apprentissage automatique: une perspective probabiliste, par Kevin Murphy.

De plus, un joli billet de blog qui m'a aidé à comprendre Comprendre le compromis de la variation des biais de Scott Fortmann-Roe .

Application à votre problème

Vous avez donc deux modèles,

Train MAETest MAEMARS4,04,0Variance faible, biais plus élevé,XGBoost0,32.4Variance plus élevée, biais plus faible,

et vous devez en choisir un. Pour ce faire, vous devez définir ce qu'est un meilleur modèle. Les paramètres qui doivent être inclus dans vos décisions sont la complexité et les performances du modèle.

  • Combien d '"unités" de complexité êtes-vous prêt à échanger contre une "unité" de performance?
    • Une plus grande complexité est associée à une variance plus élevée. Si vous souhaitez que votre modèle se généralise bien sur un ensemble de données légèrement différent de celui sur lequel vous vous êtes entraîné, vous devez viser une complexité moindre.
    • Si vous voulez un modèle que vous pouvez comprendre facilement, vous pouvez le faire au détriment des performances en réduisant la complexité du modèle.
    • Si vous visez les meilleures performances sur un ensemble de données que vous savez provenir du même processus génératif que votre ensemble d'entraînement, vous pouvez manipuler la complexité afin d'optimiser votre erreur de test et l'utiliser comme métrique. Cela se produit lorsque votre ensemble d'entraînement est échantillonné au hasard à partir d'un ensemble plus grand, et votre modèle sera appliqué sur cet ensemble. C'est le cas par exemple dans la plupart des compétitions Kaggle.

Le but ici n'est pas de trouver un modèle qui "ne s'emballe pas". Il s'agit de trouver le modèle qui présente le meilleur compromis biais-variance. Dans ce cas, je dirais que la réduction du biais obtenue par le modèle XGBoost est suffisamment bonne pour justifier l'augmentation de la variance.

Que pouvez-vous faire

Cependant, vous pouvez probablement faire mieux en réglant les hyperparamètres.

  • Augmenter le nombre de tours et réduire le taux d'apprentissage est une possibilité. Quelque chose de "bizarre" à propos du renforcement du gradient est que le faire passer bien au-delà du point où l'erreur de formation a atteint zéro semble encore améliorer l'erreur de test (comme expliqué ici: Deeper Better Only When Shallow Is Good? ). Vous pouvez essayer de former votre modèle un peu plus longtemps sur votre jeu de données une fois que vous avez défini les autres paramètres,

  • La profondeur des arbres que vous cultivez est un très bon point de départ. Vous devez noter que pour chaque unité de profondeur, vous doublez le nombre de feuilles à construire. Si vous deviez faire pousser des arbres de taille deux au lieu de taille 16, il faudrait1/214du temps! Vous devriez essayer de faire pousser des arbres plus petits. La raison en est que la profondeur de l'arbre doit représenter le degré d'interaction des entités . Cela peut être du jargon, mais si vos fonctionnalités ont un degré d'interaction de 3 (en gros: une combinaison de 4 fonctionnalités n'est pas plus puissante qu'une combinaison de 3 de ces fonctionnalités + la quatrième), alors la croissance d'arbres de taille supérieure à 3 est préjudiciable. Deux arbres de profondeur trois auront plus de pouvoir de généralisation qu'un arbre de profondeur quatre. C'est un concept assez compliqué et je n'entrerai pas dans les détails pour le moment, mais vous pouvez vérifier cette collection d'articles pour commencer. Notez également que les arbres profonds entraînent une variance élevée!

  • Le sous-échantillonnage, appelé ensachage , est idéal pour réduire la variance. Si vos arbres individuels ont une variance élevée, l'ensachage fera la moyenne des arbres et la moyenne a moins de variance que les arbres individuels. Si, après avoir réglé la profondeur de vos arbres, vous rencontrez toujours une variance élevée, essayez d'augmenter le sous-échantillonnage (c'est-à-dire de réduire la fraction des données utilisées). Le sous-échantillonnage de l'espace des fonctionnalités atteint également cet objectif.

Clins d'oeil
la source
1
Il ne faut pas dire "merci" mais pour cette réponse longue et intéressante, je voudrais dire "merci". J'avais déjà quelques connaissances sur certaines des choses que vous écrivez, mais c'était vraiment bien assemblé. Je vais parcourir certaines de vos références et faire pousser de nouveaux arbres et peut-être revenir avec un commentaire. Pour l'instant: merci! Génial!
Ric
Le lien vers la page des interactions stat.columbia.edu/~jakulin/Int est vraiment génial!
Ric
J'ai suivi vos conseils et limité la profondeur des arbres à 3 mais j'ai pris nround 1200 et les résuls me font du bien: calculs très rapides, différence entre train et test réduite et toujours à un bon niveau. Le reste de l'histoire est ici: stats.stackexchange.com/questions/205858/…
Ric