diff --git a/.nojekyll b/.nojekyll index 1f9d560..fa63548 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -5b1288e5 \ No newline at end of file +aa6f1de2 \ No newline at end of file diff --git a/chapters/chapter3/2-guide_usage_RF.html b/chapters/chapter3/2-guide_usage_RF.html index 2c9e55d..3669776 100644 --- a/chapters/chapter3/2-guide_usage_RF.html +++ b/chapters/chapter3/2-guide_usage_RF.html @@ -378,8 +378,8 @@

Ajuster le nombre d’arbres: entraîner une forêt aléatoire avec les hyperparamètres par défaut en augmentant progressivement le nombre d’arbres, puis déterminer à partir de quel nombre d’arbres la performance se stabilise (en mesurant la performance avec l’erreur OOB avec pour métrique le score de Brier). Fixer le nombre d’arbres à cette valeur par la suite.
  • Ajuster le nombre de variables candidates et le taux d’échantillonnage: optimiser ces deux hyperparamètres grâce à une méthode de grid search évaluée par une approche de validation-croisée, ou par une approche reposant sur l’erreur OOB.
  • Ajuster le nombre minimal d’observations dans les noeuds terminaux: optimiser cet hyperparamètre grâce à une méthode de grid search évaluée par une approche de validation-croisée, ou par une approche reposant sur l’erreur OOB. Ce n’est pas l’hyperparamètre le plus important, mais s’il est possible de le fixer à une valeur plus élevée que la valeur par défaut sans perte de performance, cela permet d’accélérer le reste de la procédure.
  • -
  • Entraîner du modèle final: entraîner une forêt aléatoire avec les hyperparamètres optimisés déduits des étapes précédentes.
  • -
  • Évaluer du modèle final: mesurer la performance du modèle final soit avec l’approche out-of-bag (OOB), soit avec un ensemble de test. Il est souvent instructif de comparer les performances du modèle final et du modèle entraîné avec les valeurs des hyperparamètres par défaut (parfois pour se rendre compte que ce dernier était déjà suffisamment performant…).
  • +
  • Entraîner le modèle final: entraîner une forêt aléatoire avec les hyperparamètres optimisés déduits des étapes précédentes.
  • +
  • Évaluer le modèle final: mesurer la performance du modèle final soit avec l’approche out-of-bag (OOB), soit avec un ensemble de test. Il est souvent instructif de comparer les performances du modèle final et du modèle entraîné avec les valeurs des hyperparamètres par défaut (parfois pour se rendre compte que ce dernier était déjà suffisamment performant…).
  • diff --git a/chapters/chapter3/3-guide_usage_GB.html b/chapters/chapter3/3-guide_usage_GB.html index 5d37ff7..7219701 100644 --- a/chapters/chapter3/3-guide_usage_GB.html +++ b/chapters/chapter3/3-guide_usage_GB.html @@ -270,7 +270,11 @@

    On this page

    @@ -441,15 +445,15 @@

    le nombre d’arbres contrôle la complexité générale de l’algorithme. Le point essentiel est que, contrairement aux forêts aléatoires, la performance du gradient boosting sur les données d’entraînement croît continûment avec le nombre d’arbres sans jamais se stabiliser. Le choix du nombre d’arbres est essentiel, et doit viser un équilibre entre augmentation du pouvoir prédictif du modèle (si les arbres supplémentaires permettent au modèle de corriger les erreurs résiduelles), et lutte contre le surajustement (si les arbres supplémentaires captent uniquement les bruits statistiques et les fluctuations spécifiques des données d’entraînement). Par ailleurs, Le choix du nombre d’arbres est très lié à celui du taux d’apprentissage, et il est nécessaire de les optimiser conjointement.

  • le taux d’apprentissage (learning rate) contrôle l’influence de chaque arbre sur le modèle global; il s’agit de \(\eta\) dans l’équation REFERENCE PARTIE OVERFITTING. Un taux d’apprentissage faible réduit la contribution de chaque arbre, rendant l’apprentissage plus progressif; cela évite qu’un arbre donné ait une influence trop importante sur le modèle global et contribue donc à réduire le surajustement, mais cela nécessite un plus grand nombre d’arbres pour converger vers une solution optimale. Inversement, un taux d’apprentissage élevé accélère l’entraînement mais peut rendre le modèle instable (car trop sensible à un arbre donné), entraîner un surajustement et/ou aboutir à un modèle sous-optimal. La règle générale est de privilégier un taux d’apprentissage faible (entre 0.01 ou 0.3). Le choix du taux d’apprentissage est très lié à celui du nombre d’arbres: plus le taux d’apprentissage sera faible, plus le nombre d’arbres nécessaires pour converger vers une solution optimale sera élevé. Ces deux hyperparamètres doivent donc être optimisés conjointement.

  • -
  • La complexité des arbres: la profondeur maximale des arbres, le nombre de feuilles terminales et le nombre minimal d’observations par feuille terminale contrôlent la complexité des weak learners: une profondeur élevée, un grand nombre de feuilles et un faible nombre d’observations par feuille terminale aboutissent à des arbres complexes au pouvoir prédictif plus élevé, mais induisent un risque de surajustement. Par ailleurs, de tels arbres sont plus longs à entraîner que des arbres peu profonds avec un nombre limité de feuilles.

  • +
  • La complexité des arbres: la profondeur maximale des arbres, le nombre de feuilles terminales et le nombre minimal d’observations par feuille terminale contrôlent la complexité des weak learners: une profondeur élevée, un grand nombre de feuilles et un faible nombre d’observations par feuille terminale aboutissent à des arbres complexes au pouvoir prédictif plus élevé, mais induisent un risque de surajustement. Par ailleurs, de tels arbres sont plus longs à entraîner que des arbres peu profonds avec un nombre limité de feuilles. Il est à noter que le nombre de feuilles terminales a un effet linéaire sur la complexité des arbres, tandis que la profondeur maximale a un effet exponentiel: un arbre pleinement développé de profondeur \(k\) comprend \(2^k\) feuilles terminales et \(2^k - 1\) splits. Augmenter la profondeur d’une unité a donc pour effet de doubler le temps d’entraînement de chaque arbre.

  • La lutte contre le surajustement: ces hyperparamètres de régularisation jouent un rôle important dans le contrôle de la complexité des weak learners et contribuent à éviter le surajustement:

    • Les pénalisations tendent à réduire le poids \(w_j\) des feuilles terminales: la pénalisation quadratique réduit la valeur absolue des poids sans les annuler (il s’agit de \(\lambda\) dans l’équation donnant le poids optimal d’une feuille terminale), tandis que la pénalisation absolue élevée pousse certains poids à être nuls. La pénalisation quadratique est la plus utilisée, notamment parce qu’elle permet d’amoindrir l’influence des points aberrants.
    • -
    • Le gain minimal définit la quantité minimale de réduction de la perte requise pour qu’un nœud soit divisé (il s’agit du paramètre \(\gamma\) dans l’équation donnant le gain potentiel d’un split); il contribue à réduire la complexité des arbres et à limiter le surajustement en empêchant l’algorithme de créer des splits dont l’apport est très faible et potentiellement dû à des variations non significatives des données d’entraînement.
    • +
    • Le gain minimal définit la quantité minimale de réduction de la perte requise pour qu’un nœud soit divisé (il s’agit du paramètre \(\gamma\) dans l’équation donnant le gain potentiel d’un split); une valeur plus élevée contribue à réduire la complexité des arbres et à limiter le surajustement en empêchant l’algorithme de créer des splits dont l’apport est très faible et potentiellement dû à des variations non significatives des données d’entraînement.
  • Les hyperparamètres d’échantillonnage:

      -
    • le taux d’échantillonnage des données d’entraînement et le taux d’échantillonnage des colonnes par noeud jouent exactement le même rôle que sample.fraction ou max_samples, et mtry dans la forêt aléatoire: échantillonner les données d’entraînement accélère l’entraînement, et échantillonner les colonnes au niveau de chaque noeud aboutit à des arbres plus variés. Il est à noter que l’échantillonnage des données se fait systématiquement sans remise. Comme pour la forêt aléatoire, la valeur optimale du taux d’échantillonnage des colonnes par noeud dépend du nombre de variables réellement pertinentes dans les données, et une valeur plus élevée est préférable si les données comprennent un grand nombre de variables binaires issues du one-hot-encoding des variables catégorielles.
    • +
    • le taux d’échantillonnage des données d’entraînement et le taux d’échantillonnage des colonnes par noeud jouent exactement le même rôle que sample.fraction ou max_samples, et mtry dans la forêt aléatoire: échantillonner les données d’entraînement accélère l’entraînement, et échantillonner les colonnes au niveau de chaque noeud aboutit à des arbres plus variés. Il est à noter que l’échantillonnage des données se fait systématiquement sans remise dans les algorithmes de gradient boosting. Comme pour la forêt aléatoire, la valeur optimale du taux d’échantillonnage des colonnes par noeud dépend du nombre de variables réellement pertinentes dans les données, et une valeur plus élevée est préférable si les données comprennent un grand nombre de variables binaires issues du one-hot-encoding des variables catégorielles.
    • L’échantillonnage des colonnes par arbre sert essentiellement à accélérer l’entraînement. Si les colonnes sont échantillonnées par arbre et par noeud, alors le taux d’échantillonnage final est le produit des deux taux.
  • Les réglages relatifs au retraitement des colonnes:

    @@ -495,10 +499,52 @@

    1.3 Comment entraîner un algorithme de gradient boosting?

    -

    Proposer une procédure pour l’optimisation des hyperparamètres s’avère plus délicat pour le gradient boosting que pour les forêts aléatoires, pour deux raisons. D’une part, les algorithmes de gradient boosting comprennent un nombre beaucoup plus élevé d’hyperparamètres. D’autre part, la littérature méthodologique sur l’usage pratique de ces algorithmes reste assez limitée et peu conclusive (en-dehors des nombreux tutoriels introductifs disponibles sur internet). Un constat semble néanmoins bien établi: contrairement aux forêts aléatoires, les valeurs par défaut des hyperparamètres des implémentations ne constituent pas un point de départ raisonnable (Bentéjac, Csörgő, and Martínez-Muñoz (2021)), en particulier pour les hyperparamètres de régularisation dont la valeur par défaut est souvent nulle.

    +

    Proposer une procédure pour l’optimisation des hyperparamètres s’avère plus délicat pour les algorithmes de gradient boosting que pour les forêts aléatoires, car ces algorithmes comprennent un nombre beaucoup plus élevé d’hyperparamètres, et la littérature méthodologique sur leur usage pratique reste assez limitée et peu conclusive (en-dehors des nombreux tutoriels introductifs disponibles sur internet). Trois constats sont néanmoins bien établis. Premièrement, bien optimiser les hyperparamètres est essentiel pour la performance du modèle final. Deuxièmement, cette optimisation est complexe et longue, il faut donc la mener de façon rigoureuse et organisée pour ne pas perdre de temps. Troisièmement, contrairement aux forêts aléatoires, les valeurs par défaut des hyperparamètres des implémentations ne constituent pas un point de départ raisonnable (Bentéjac, Csörgő, and Martínez-Muñoz (2021)), en particulier pour les hyperparamètres de régularisation dont la valeur par défaut est souvent nulle.

    +
    +

    1.3.1 Préparer l’entraînement

    +
      +
    • Définir des valeurs de départ raisonnables pour les hyperpararamètres. Comme il est impossible d’optimiser conjointement tous les hyperparamètres, il est nécessaire de mener cette optimisation de façon itérative, en optimisant certains hyperparamètres conditionnellement aux valeurs des autres. Il est donc essentiel de retenir des valeurs de départ raisonnables pour les hyperpararamètres qui ne sont pas optimisés en premier. Ce choix prend du temps et doit reposer sur une bonne compréhension du fonctionnement de l’algorithme et sur une connaissance approfondie des données utilisées. Voici quelques suggestions de valeurs de départ (voir notamment Bentéjac, Csörgő, and Martínez-Muñoz (2021)); il est tout à fait possible de s’en écarter lorsqu’on pense que le problème modélisé le justifie:

      +
        +
      • max_depth: entre 4 et 10;
      • +
      • num_leaves: entre 30 et 255;
      • +
      • min_split_gain: valeur strictement positive, commencer entre 0.1 et 1;
      • +
      • lambda: valeur strictement positive; commencer avec une valeur entre 0.5 et 2; choisir une valeur plus élevée s’il y a des valeurs aberrantes sur \(y\) ou de clairs signes de surajustement;
      • +
      • bagging_fraction : valeur strictement inférieure à 1, commencer entre 0.6 et 0.8;
      • +
      • feature_fraction_bynode : valeur strictement inférieure à 1, commencer entre 0.5 et 0.7; choisir une valeur plus élevée si les données comprennent un grand nombre de variables binaires issues d’un one-hot-encoding;
      • +
      • max_bin : garder la valeur par défaut; choisir éventuellement une valeur plus élevée si la la valeur par défaut ne suffit pas à refléter la distribution des variables continues;
      • +
      • max_cat_to_onehot : garder la valeur par défaut;
      • +
      • max_cat_threshold : garder la valeur par défaut.
      • +
    • +
    • Choisir la méthode d’optimisation des hyperparamètres: validation croisée ou ensemble de validation.

    • +
    +
    +
    +

    1.3.2 Optimiser les hyperparamètres

    +

    Voici une procédure simple pour optimiser les hyperparamètres d’un algorithme de gradient boosting. Elle ne garantit pas l’obtention d’un modèle optimal, mais elle est lisible et permet d’obtenir rapidement un modèle raisonnablement performant.

    +
      +
    • Ajuster conjointement le nombre d’arbres et le taux d’apprentissage.
    • +
    • Ajuster la complexité des arbres.
    • +
    • Ajuster les hyperparamètres de lutte contre le surajustement.
    • +
    • Entraîner du modèle final: entraîner une forêt aléatoire avec les hyperparamètres optimisés déduits des étapes précédentes.
    • +
    • Évaluer du modèle final: mesurer la performance du modèle final sur un ensemble de test.
    • +
    +
    +
    +
    + +
    +
    +Parfois, une forêt aléatoire suffit… +
    +
    +
    +

    Avant de se lancer dans le gradient boosting, il peut être utile d’entraîner une forêt aléatoire selon la procédure décrite dans la section ?@sec-procedure-training-rf.__ Ce modèle servira de point de comparaison pour la suite, et permettra notamment de voir si le gradient boosting offre des gains de performances qui justifient le temps passé à l’optimisation des hyperparamètres.

    +
    +
    +

  • diff --git a/pdf/dt_methodes_ensemblistes.pdf b/pdf/dt_methodes_ensemblistes.pdf index 0568297..202d6d1 100644 Binary files a/pdf/dt_methodes_ensemblistes.pdf and b/pdf/dt_methodes_ensemblistes.pdf differ diff --git a/search.json b/search.json index a3cee63..1676cbe 100644 --- a/search.json +++ b/search.json @@ -4,7 +4,7 @@ "href": "chapters/chapter3/2-guide_usage_RF.html", "title": "1 Guide d’usage des forêts aléatoires", "section": "", - "text": "Ce guide d’entraînement des forêts aléatoires rassemble et synthétise des recommandations sur l’entraînement des forêts aléatoires disponibles dans la littérature, en particulier dans Probst, Wright, and Boulesteix (2019) et Biau and Scornet (2016). Ce guide comporte un certain nombre de choix méthodologiques forts, comme les implémentations recommandées ou la procédure proposée pour l’optimisation des hyperparamètres, et d’autres choix pertinents sont évidemment possibles. C’est pourquoi les recommandations de ce guide doivent être considérées comme un point de départ raisonnable, pas comme un ensemble de règles devant être respectées à tout prix.\n\n\nIl existe de multiples implémentations des forêts aléatoires. Le présent document présente et recommande l’usage de deux implémentations de référence: le package R ranger et le package Python scikit-learn pour leur rigueur, leur efficacité et leur simplicité d’utilisation. Il est à noter qu’il est possible d’entraîner des forêts aléatoires avec les algorithmes XGBoost et LightGBM, mais il s’agit d’un usage avancé qui n’est pas recommandé en première approche. Cette approche est présentée dans la partie REFERENCE A LA PARTIE USAGE AVANCE.\n\n\n\nCette section décrit en détail les principaux hyperparamètres des forêts aléatoires listés dans le tableau 1. Les noms des hyperparamètres utilisés sont ceux figurant dans le package R ranger, et dans le package Python scikit-learn. Il arrive qu’ils portent un nom différent dans d’autres implémentations des forêts aléatoires, mais il est généralement facile de s’y retrouver en lisant attentivement la documentation.\n\n\n\nTable 1: Les principaux hyperparamètres des forêts aléatoires\n\n\n\n\n\n\n\n\n\nHyperparamètre (ranger / scikit-learn)\nDescription\n\n\n\n\nnum.trees / n_estimators\nLe nombre d’arbres\n\n\nmtry / max_features\nLe nombre de variables candidates à chaque noeud\n\n\nsample.fraction / max_samples\nLe taux d’échantillonnage des données (ou la taille de l’échantillon)\n\n\nreplacement / absent\nL’échantillonnage des données se fait-il avec ou sans remise?\n\n\nmin.bucket / min_samples_leaf\nNombre minimal d’observations dans les noeuds terminaux\n\n\nmax.depth / max_depth\nProfondeur maximale des arbres\n\n\nmin.node.size / min_samples_split\nNombre minimal d’observations nécessaire pour qu’un noeud puisse être partagé\n\n\nsplitrule / criterion\nLe critère de choix de la règle de division des noeuds intermédiaires\n\n\noob.error / oob_score\nCalculer la performance de la forêt par l’erreur OOB (et choix de la métrique pour scikit)\n\n\n\n\n\n\nVoici une présentation des principaux hyperparamètres et de leurs effets sur les performances de la forêt aléatoire:\n\nLe nombre d’arbres par défaut varie selon les implémentations (500 dans ranger, 100 dans scikit-learn). Il s’agit d’un hyperparamètre particulier car il n’est associé à aucun arbitrage en matière de performance: la performance de la forêt aléatoire croît avec le nombre d’arbres, puis se stabilise. Le nombre optimal d’arbres est celui à partir duquel la performance de la forêt ne croît plus (ce point est détaillé plus bas) où à partir duquel l’ajout d’arbres supplémentaires génère des gains marginaux. Il est important de noter que ce nombre optimal dépend des autres hyperparamètres. Par exemple, un taux d’échantillonnage faible et un nombre faible de variables candidates à chaque noeud aboutissent à des arbres peu corrélés, mais peu performants, ce qui requiert probablement un plus grand nombre d’arbres. Dans le cas d’une classification, l’utilisation de mesures comme le score de Brier ou la fonction de perte logarithmique est recommandée pour évaluer la convergence plutôt que la précision (métrique par défaut de ranger et scikit-learn).\nLe nombre (ou la part) de variables candidates à chaque noeud (souvent appelé mtry) est un hyperparamètre essentiel qui détermine le nombre de variables prédictives sélectionnées aléatoirement à chaque nœud lors de la construction des arbres. Ce paramètre exerce la plus forte influence sur les performances du modèle, et un compromis doit être trouvé entre puissance prédictive des arbres et corrélation entre arbres. Une faible valeur de mtry conduit à des arbres moins performants mais plus diversifiés et donc moins corrélés entre eux. Inversement, une valeur plus élevée améliore la précision des arbres individuels mais accroît leur corrélation (les mêmes variables ayant tendance à être sélectionnées dans tous les arbres). La valeur optimale de mtry dépend du nombre de variables réellement pertinentes dans les données: elle est plus faible lorsque la plupart des variables sont pertinentes, et plus élevée lorsqu’il y a peu de variables pertinentes. Par ailleurs, une valeur élevée de mtry est préférable si les données comprennent un grand nombre de variables binaires issues du one-hot-encoding des variables catégorielles (LIEN AVEC LA PARTIE PREPROCESSING). Par défaut, cette valeur est fréquemment fixée à \\(\\sqrt{p}\\) pour les problèmes de classification et à \\(p/3\\) pour les problèmes de régression, où \\(p\\) représente le nombre total de variables prédictives disponibles.\nLe taux d’échantillonnage et le mode de tirage contrôlent le plan d’échantillonnage des données d’entraînement. Les valeurs par défaut varient d’une implémentation à l’autre; dans le cas de ranger, le taux d’échantillonnage est de 63,2% sans remise, et de 100% avec remise. L’implémentation scikit-learn ne propose pas le tirage sans remise. Ces hyperparamètres ont des effets sur la performance similaires à ceux du nombre de variables candidates, mais d’une moindre ampleur. Un taux d’échantillonnage plus faible aboutit à des arbres plus diversifiés et donc moins corrélés (car ils sont entraînés sur des échantillons très différents), mais ces arbres peuvent être peu performants car ils sont entraînés sur des échantillons de petite taille. Inversement, un taux d’échantillonnage élevé aboutit à des arbres plus performants mais plus corrélés. Les effets de l’échantillonnage avec ou sans remise sur la performance de la forêt aléatoire sont moins clairs et ne font pas consensus. Les travaux les plus récents semblent toutefois suggérer qu’il est préférable d’échantillonner sans remise (Probst, Wright, and Boulesteix (2019)).\nLe nombre minimal d’observations dans les noeuds terminaux contrôle la taille des noeuds terminaux. La valeur par défaut est faible dans la plupart des implémentations (entre 1 et 5). Il n’y a pas vraiment de consensus sur l’effet de cet hyperparamètre sur les performances, bien qu’une valeur plus faible augmente le risque de sur-apprentissage. En revanche, il est certain que le temps d’entraînement décroît fortement avec cet hyperparamètre: une valeur faible implique des arbres très profonds, avec un grand nombre de noeuds. Il peut donc être utile de fixer ce nombre à une valeur plus élevée pour accélérer l’entraînement, en particulier si les données sont volumineuses et si on utilise une méthode de validation croisée pour le choix des autres hyperparamètres. Cela se fait généralement sans perte significative de performance.\nLe critère de choix de la règle de division des noeuds intermédiaires: la plupart des implémentations des forêts aléatoires retiennent par défaut l’impureté de Gini pour la classification et la variance pour la régression, même si d’autres critères de choix ont été proposés dans la littérature (p-value dans les forêts d’inférence conditionnelle, arbres extrêmement randomisés, etc.). Chaque règle présente des avantages et des inconvénients, notamment en termes de biais de sélection des variables et de vitesse de calcul. A ce stade, aucun critère de choix ne paraît systématiquement supérieur aux autres en matière de performance. Modifier cet hyperparamètre relève d’un usage avancé des forêts aléatoires. Le lecteur intéressé pourra se référer à la discussion détaillée dans Probst, Wright, and Boulesteix (2019).\n\n\n\n\nLes forêts aléatoires nécessitent généralement moins d’optimisation que d’autres modèles de machine learning, car leurs performances varient relativement peu en fonction des hyperparamètres. Les valeurs par défaut fournissent souvent des résultats satisfaisants, ce qui réduit le besoin d’optimisation intensive. Cependant, un ajustement précis des hyperparamètres peut apporter des gains de performance, notamment sur des jeux de données complexes.\nComme indiqué dans la partie ?@sec-facteur-perf-rf, la performance prédictive d’une forêt aléatoire varie en fonction de deux critères essentiels: elle croît avec le pouvoir prédictif des arbres, et décroît avec la corrélation des arbres entre eux. L’optimisation des hyperparamètres d’une forêt aléatoire vise donc à trouver un équilibre optimal où les arbres sont suffisamment puissants pour être prédictifs, tout en étant suffisamment diversifiés pour que leurs erreurs ne soient pas trop corrélées.\nLa littérature propose de multiples approches pour optimiser simultanément plusieurs hyperparamètres: la recherche par grille (grid search), la recherche aléatoire (random search) et l’optimisation basée sur modèle séquentiel (SMBO), et il peut être difficile de savoir quelle approche adopter. Ce guide propose donc une première approche délibérément simple, avant de présenter les approches plus avancées.\n\n\nVoici une procédure simple pour entraîner une forêt aléatoire. Elle ne garantit pas l’obtention d’un modèle optimal, mais elle est lisible et permet d’obtenir rapidement un modèle raisonnablement performant.\n\nEntraîner une forêt aléatoire avec les valeurs des hyperparamètres par défaut. Ce premier modèle servira de point de comparaison pour la suite.\nAjuster le nombre d’arbres: entraîner une forêt aléatoire avec les hyperparamètres par défaut en augmentant progressivement le nombre d’arbres, puis déterminer à partir de quel nombre d’arbres la performance se stabilise (en mesurant la performance avec l’erreur OOB avec pour métrique le score de Brier). Fixer le nombre d’arbres à cette valeur par la suite.\nAjuster le nombre de variables candidates et le taux d’échantillonnage: optimiser ces deux hyperparamètres grâce à une méthode de grid search évaluée par une approche de validation-croisée, ou par une approche reposant sur l’erreur OOB.\nAjuster le nombre minimal d’observations dans les noeuds terminaux: optimiser cet hyperparamètre grâce à une méthode de grid search évaluée par une approche de validation-croisée, ou par une approche reposant sur l’erreur OOB. Ce n’est pas l’hyperparamètre le plus important, mais s’il est possible de le fixer à une valeur plus élevée que la valeur par défaut sans perte de performance, cela permet d’accélérer le reste de la procédure.\nEntraîner du modèle final: entraîner une forêt aléatoire avec les hyperparamètres optimisés déduits des étapes précédentes.\nÉvaluer du modèle final: mesurer la performance du modèle final soit avec l’approche out-of-bag (OOB), soit avec un ensemble de test. Il est souvent instructif de comparer les performances du modèle final et du modèle entraîné avec les valeurs des hyperparamètres par défaut (parfois pour se rendre compte que ce dernier était déjà suffisamment performant…).\n\n\n\n\nLorsque l’espace des hyperparamètres est large ou que les performances initiales sont insuffisantes, adopter des méthodes avancées comme l’ptimisation basée sur un modèle séquentiel (SMBO). En R, il existe plusieurs implémentations d’appuyant sur cette méthode: tuneRF (limité à l’optimisation de mtry), tuneRanger (optimise simultanément mtry, node size, et sample size). La méthode SMBO est généralement la plus performante, mais demande un temps de calcul plus important.\nIl est également possible de remplacer les critères classiques (le taux d’erreur pour une classification par exemple) par d’autres critères de performance, comme le score de Brier ou la fonction de perte logarithmique (Probst and Boulesteix (2018)).\nPour gérer la contrainte computationnelle, il est possible de commencer par utiliser des échantillons réduits pour les étapes exploratoires, puis d’augmenter la taille de l’échantillon pour les tests finaux.\n\n\n\n\n\nLes méthodes classiques d’évaluation de l’importance des variables, telles que l’indice de Gini (Mean Decrease in Impurity - MDI) et l’importance par permutation (Mean Decrease Accuracy - MDA), peuvent produire des résultats biaisés dans certaines situations (Strobl et al. (2007), Bénard, Da Veiga, and Scornet (2022), Bénard et al. (2022)). Notamment, lorsque les variables prédictives sont fortement corrélées, présentent des échelles de mesure différentes ou possèdent un nombre variable de catégories, ces méthodes peuvent surestimer l’importance de certaines variables. Par exemple, les variables avec un grand nombre de catégories ou des échelles continues étendues peuvent être artificiellement privilégiées, même si leur contribution réelle à la prédiction est limitée.\nEn pratique, il est recommandé d’utiliser des méthodes d’importance des variables moins sensibles aux biais, comme les CIF ou la Sobol-MDA. Les valeurs de Shapley, issues de la théorie des jeux, sont également une alternative intéressante. Elles attribuent à chaque variable une contribution proportionnelle à son impact sur la prédiction. Cependant, leur calcul est souvent complexe et coûteux en ressources computationnelles, surtout en présence de nombreuses variables. Des méthodes comme SHAFF (SHApley eFfects via random Forests) ont été développées pour estimer efficacement ces valeurs, même en présence de dépendances entre variables.\nOn conseille l’utilisation de trois implémentations pour comparer l’importances des variables d’une forêt aléatoire:\n\nPour la MDI: l’algorithme CIF proposé par Strobl et al. (2007) et implémenté en R\nPour la MDA: l’algorithme Sobol-MDA proposé par Bénard, Da Veiga, and Scornet (2022) et implémenté en R\nPour les valeurs de Shapley : l’alogrithme SHAFF proposé par Bénard et al. (2022) et implémenté en R\n\nEnfin, nous recommandons de combiner plusieurs méthodes pour une analyse plus robuste et de tenir compte des prétraitements des données afin de minimiser les biais potentiels.", + "text": "Ce guide d’entraînement des forêts aléatoires rassemble et synthétise des recommandations sur l’entraînement des forêts aléatoires disponibles dans la littérature, en particulier dans Probst, Wright, and Boulesteix (2019) et Biau and Scornet (2016). Ce guide comporte un certain nombre de choix méthodologiques forts, comme les implémentations recommandées ou la procédure proposée pour l’optimisation des hyperparamètres, et d’autres choix pertinents sont évidemment possibles. C’est pourquoi les recommandations de ce guide doivent être considérées comme un point de départ raisonnable, pas comme un ensemble de règles devant être respectées à tout prix.\n\n\nIl existe de multiples implémentations des forêts aléatoires. Le présent document présente et recommande l’usage de deux implémentations de référence: le package R ranger et le package Python scikit-learn pour leur rigueur, leur efficacité et leur simplicité d’utilisation. Il est à noter qu’il est possible d’entraîner des forêts aléatoires avec les algorithmes XGBoost et LightGBM, mais il s’agit d’un usage avancé qui n’est pas recommandé en première approche. Cette approche est présentée dans la partie REFERENCE A LA PARTIE USAGE AVANCE.\n\n\n\nCette section décrit en détail les principaux hyperparamètres des forêts aléatoires listés dans le tableau 1. Les noms des hyperparamètres utilisés sont ceux figurant dans le package R ranger, et dans le package Python scikit-learn. Il arrive qu’ils portent un nom différent dans d’autres implémentations des forêts aléatoires, mais il est généralement facile de s’y retrouver en lisant attentivement la documentation.\n\n\n\nTable 1: Les principaux hyperparamètres des forêts aléatoires\n\n\n\n\n\n\n\n\n\nHyperparamètre (ranger / scikit-learn)\nDescription\n\n\n\n\nnum.trees / n_estimators\nLe nombre d’arbres\n\n\nmtry / max_features\nLe nombre de variables candidates à chaque noeud\n\n\nsample.fraction / max_samples\nLe taux d’échantillonnage des données (ou la taille de l’échantillon)\n\n\nreplacement / absent\nL’échantillonnage des données se fait-il avec ou sans remise?\n\n\nmin.bucket / min_samples_leaf\nNombre minimal d’observations dans les noeuds terminaux\n\n\nmax.depth / max_depth\nProfondeur maximale des arbres\n\n\nmin.node.size / min_samples_split\nNombre minimal d’observations nécessaire pour qu’un noeud puisse être partagé\n\n\nsplitrule / criterion\nLe critère de choix de la règle de division des noeuds intermédiaires\n\n\noob.error / oob_score\nCalculer la performance de la forêt par l’erreur OOB (et choix de la métrique pour scikit)\n\n\n\n\n\n\nVoici une présentation des principaux hyperparamètres et de leurs effets sur les performances de la forêt aléatoire:\n\nLe nombre d’arbres par défaut varie selon les implémentations (500 dans ranger, 100 dans scikit-learn). Il s’agit d’un hyperparamètre particulier car il n’est associé à aucun arbitrage en matière de performance: la performance de la forêt aléatoire croît avec le nombre d’arbres, puis se stabilise. Le nombre optimal d’arbres est celui à partir duquel la performance de la forêt ne croît plus (ce point est détaillé plus bas) où à partir duquel l’ajout d’arbres supplémentaires génère des gains marginaux. Il est important de noter que ce nombre optimal dépend des autres hyperparamètres. Par exemple, un taux d’échantillonnage faible et un nombre faible de variables candidates à chaque noeud aboutissent à des arbres peu corrélés, mais peu performants, ce qui requiert probablement un plus grand nombre d’arbres. Dans le cas d’une classification, l’utilisation de mesures comme le score de Brier ou la fonction de perte logarithmique est recommandée pour évaluer la convergence plutôt que la précision (métrique par défaut de ranger et scikit-learn).\nLe nombre (ou la part) de variables candidates à chaque noeud (souvent appelé mtry) est un hyperparamètre essentiel qui détermine le nombre de variables prédictives sélectionnées aléatoirement à chaque nœud lors de la construction des arbres. Ce paramètre exerce la plus forte influence sur les performances du modèle, et un compromis doit être trouvé entre puissance prédictive des arbres et corrélation entre arbres. Une faible valeur de mtry conduit à des arbres moins performants mais plus diversifiés et donc moins corrélés entre eux. Inversement, une valeur plus élevée améliore la précision des arbres individuels mais accroît leur corrélation (les mêmes variables ayant tendance à être sélectionnées dans tous les arbres). La valeur optimale de mtry dépend du nombre de variables réellement pertinentes dans les données: elle est plus faible lorsque la plupart des variables sont pertinentes, et plus élevée lorsqu’il y a peu de variables pertinentes. Par ailleurs, une valeur élevée de mtry est préférable si les données comprennent un grand nombre de variables binaires issues du one-hot-encoding des variables catégorielles (LIEN AVEC LA PARTIE PREPROCESSING). Par défaut, cette valeur est fréquemment fixée à \\(\\sqrt{p}\\) pour les problèmes de classification et à \\(p/3\\) pour les problèmes de régression, où \\(p\\) représente le nombre total de variables prédictives disponibles.\nLe taux d’échantillonnage et le mode de tirage contrôlent le plan d’échantillonnage des données d’entraînement. Les valeurs par défaut varient d’une implémentation à l’autre; dans le cas de ranger, le taux d’échantillonnage est de 63,2% sans remise, et de 100% avec remise. L’implémentation scikit-learn ne propose pas le tirage sans remise. Ces hyperparamètres ont des effets sur la performance similaires à ceux du nombre de variables candidates, mais d’une moindre ampleur. Un taux d’échantillonnage plus faible aboutit à des arbres plus diversifiés et donc moins corrélés (car ils sont entraînés sur des échantillons très différents), mais ces arbres peuvent être peu performants car ils sont entraînés sur des échantillons de petite taille. Inversement, un taux d’échantillonnage élevé aboutit à des arbres plus performants mais plus corrélés. Les effets de l’échantillonnage avec ou sans remise sur la performance de la forêt aléatoire sont moins clairs et ne font pas consensus. Les travaux les plus récents semblent toutefois suggérer qu’il est préférable d’échantillonner sans remise (Probst, Wright, and Boulesteix (2019)).\nLe nombre minimal d’observations dans les noeuds terminaux contrôle la taille des noeuds terminaux. La valeur par défaut est faible dans la plupart des implémentations (entre 1 et 5). Il n’y a pas vraiment de consensus sur l’effet de cet hyperparamètre sur les performances, bien qu’une valeur plus faible augmente le risque de sur-apprentissage. En revanche, il est certain que le temps d’entraînement décroît fortement avec cet hyperparamètre: une valeur faible implique des arbres très profonds, avec un grand nombre de noeuds. Il peut donc être utile de fixer ce nombre à une valeur plus élevée pour accélérer l’entraînement, en particulier si les données sont volumineuses et si on utilise une méthode de validation croisée pour le choix des autres hyperparamètres. Cela se fait généralement sans perte significative de performance.\nLe critère de choix de la règle de division des noeuds intermédiaires: la plupart des implémentations des forêts aléatoires retiennent par défaut l’impureté de Gini pour la classification et la variance pour la régression, même si d’autres critères de choix ont été proposés dans la littérature (p-value dans les forêts d’inférence conditionnelle, arbres extrêmement randomisés, etc.). Chaque règle présente des avantages et des inconvénients, notamment en termes de biais de sélection des variables et de vitesse de calcul. A ce stade, aucun critère de choix ne paraît systématiquement supérieur aux autres en matière de performance. Modifier cet hyperparamètre relève d’un usage avancé des forêts aléatoires. Le lecteur intéressé pourra se référer à la discussion détaillée dans Probst, Wright, and Boulesteix (2019).\n\n\n\n\nLes forêts aléatoires nécessitent généralement moins d’optimisation que d’autres modèles de machine learning, car leurs performances varient relativement peu en fonction des hyperparamètres. Les valeurs par défaut fournissent souvent des résultats satisfaisants, ce qui réduit le besoin d’optimisation intensive. Cependant, un ajustement précis des hyperparamètres peut apporter des gains de performance, notamment sur des jeux de données complexes.\nComme indiqué dans la partie ?@sec-facteur-perf-rf, la performance prédictive d’une forêt aléatoire varie en fonction de deux critères essentiels: elle croît avec le pouvoir prédictif des arbres, et décroît avec la corrélation des arbres entre eux. L’optimisation des hyperparamètres d’une forêt aléatoire vise donc à trouver un équilibre optimal où les arbres sont suffisamment puissants pour être prédictifs, tout en étant suffisamment diversifiés pour que leurs erreurs ne soient pas trop corrélées.\nLa littérature propose de multiples approches pour optimiser simultanément plusieurs hyperparamètres: la recherche par grille (grid search), la recherche aléatoire (random search) et l’optimisation basée sur modèle séquentiel (SMBO), et il peut être difficile de savoir quelle approche adopter. Ce guide propose donc une première approche délibérément simple, avant de présenter les approches plus avancées.\n\n\nVoici une procédure simple pour entraîner une forêt aléatoire. Elle ne garantit pas l’obtention d’un modèle optimal, mais elle est lisible et permet d’obtenir rapidement un modèle raisonnablement performant.\n\nEntraîner une forêt aléatoire avec les valeurs des hyperparamètres par défaut. Ce premier modèle servira de point de comparaison pour la suite.\nAjuster le nombre d’arbres: entraîner une forêt aléatoire avec les hyperparamètres par défaut en augmentant progressivement le nombre d’arbres, puis déterminer à partir de quel nombre d’arbres la performance se stabilise (en mesurant la performance avec l’erreur OOB avec pour métrique le score de Brier). Fixer le nombre d’arbres à cette valeur par la suite.\nAjuster le nombre de variables candidates et le taux d’échantillonnage: optimiser ces deux hyperparamètres grâce à une méthode de grid search évaluée par une approche de validation-croisée, ou par une approche reposant sur l’erreur OOB.\nAjuster le nombre minimal d’observations dans les noeuds terminaux: optimiser cet hyperparamètre grâce à une méthode de grid search évaluée par une approche de validation-croisée, ou par une approche reposant sur l’erreur OOB. Ce n’est pas l’hyperparamètre le plus important, mais s’il est possible de le fixer à une valeur plus élevée que la valeur par défaut sans perte de performance, cela permet d’accélérer le reste de la procédure.\nEntraîner le modèle final: entraîner une forêt aléatoire avec les hyperparamètres optimisés déduits des étapes précédentes.\nÉvaluer le modèle final: mesurer la performance du modèle final soit avec l’approche out-of-bag (OOB), soit avec un ensemble de test. Il est souvent instructif de comparer les performances du modèle final et du modèle entraîné avec les valeurs des hyperparamètres par défaut (parfois pour se rendre compte que ce dernier était déjà suffisamment performant…).\n\n\n\n\nLorsque l’espace des hyperparamètres est large ou que les performances initiales sont insuffisantes, adopter des méthodes avancées comme l’ptimisation basée sur un modèle séquentiel (SMBO). En R, il existe plusieurs implémentations d’appuyant sur cette méthode: tuneRF (limité à l’optimisation de mtry), tuneRanger (optimise simultanément mtry, node size, et sample size). La méthode SMBO est généralement la plus performante, mais demande un temps de calcul plus important.\nIl est également possible de remplacer les critères classiques (le taux d’erreur pour une classification par exemple) par d’autres critères de performance, comme le score de Brier ou la fonction de perte logarithmique (Probst and Boulesteix (2018)).\nPour gérer la contrainte computationnelle, il est possible de commencer par utiliser des échantillons réduits pour les étapes exploratoires, puis d’augmenter la taille de l’échantillon pour les tests finaux.\n\n\n\n\n\nLes méthodes classiques d’évaluation de l’importance des variables, telles que l’indice de Gini (Mean Decrease in Impurity - MDI) et l’importance par permutation (Mean Decrease Accuracy - MDA), peuvent produire des résultats biaisés dans certaines situations (Strobl et al. (2007), Bénard, Da Veiga, and Scornet (2022), Bénard et al. (2022)). Notamment, lorsque les variables prédictives sont fortement corrélées, présentent des échelles de mesure différentes ou possèdent un nombre variable de catégories, ces méthodes peuvent surestimer l’importance de certaines variables. Par exemple, les variables avec un grand nombre de catégories ou des échelles continues étendues peuvent être artificiellement privilégiées, même si leur contribution réelle à la prédiction est limitée.\nEn pratique, il est recommandé d’utiliser des méthodes d’importance des variables moins sensibles aux biais, comme les CIF ou la Sobol-MDA. Les valeurs de Shapley, issues de la théorie des jeux, sont également une alternative intéressante. Elles attribuent à chaque variable une contribution proportionnelle à son impact sur la prédiction. Cependant, leur calcul est souvent complexe et coûteux en ressources computationnelles, surtout en présence de nombreuses variables. Des méthodes comme SHAFF (SHApley eFfects via random Forests) ont été développées pour estimer efficacement ces valeurs, même en présence de dépendances entre variables.\nOn conseille l’utilisation de trois implémentations pour comparer l’importances des variables d’une forêt aléatoire:\n\nPour la MDI: l’algorithme CIF proposé par Strobl et al. (2007) et implémenté en R\nPour la MDA: l’algorithme Sobol-MDA proposé par Bénard, Da Veiga, and Scornet (2022) et implémenté en R\nPour les valeurs de Shapley : l’alogrithme SHAFF proposé par Bénard et al. (2022) et implémenté en R\n\nEnfin, nous recommandons de combiner plusieurs méthodes pour une analyse plus robuste et de tenir compte des prétraitements des données afin de minimiser les biais potentiels.", "crumbs": [ "Comment bien utiliser les algorithmes?", "Guide d'usage des forêts aléatoires" @@ -37,7 +37,7 @@ "href": "chapters/chapter3/2-guide_usage_RF.html#sec-procedure-training-rf", "title": "1 Guide d’usage des forêts aléatoires", "section": "", - "text": "Les forêts aléatoires nécessitent généralement moins d’optimisation que d’autres modèles de machine learning, car leurs performances varient relativement peu en fonction des hyperparamètres. Les valeurs par défaut fournissent souvent des résultats satisfaisants, ce qui réduit le besoin d’optimisation intensive. Cependant, un ajustement précis des hyperparamètres peut apporter des gains de performance, notamment sur des jeux de données complexes.\nComme indiqué dans la partie ?@sec-facteur-perf-rf, la performance prédictive d’une forêt aléatoire varie en fonction de deux critères essentiels: elle croît avec le pouvoir prédictif des arbres, et décroît avec la corrélation des arbres entre eux. L’optimisation des hyperparamètres d’une forêt aléatoire vise donc à trouver un équilibre optimal où les arbres sont suffisamment puissants pour être prédictifs, tout en étant suffisamment diversifiés pour que leurs erreurs ne soient pas trop corrélées.\nLa littérature propose de multiples approches pour optimiser simultanément plusieurs hyperparamètres: la recherche par grille (grid search), la recherche aléatoire (random search) et l’optimisation basée sur modèle séquentiel (SMBO), et il peut être difficile de savoir quelle approche adopter. Ce guide propose donc une première approche délibérément simple, avant de présenter les approches plus avancées.\n\n\nVoici une procédure simple pour entraîner une forêt aléatoire. Elle ne garantit pas l’obtention d’un modèle optimal, mais elle est lisible et permet d’obtenir rapidement un modèle raisonnablement performant.\n\nEntraîner une forêt aléatoire avec les valeurs des hyperparamètres par défaut. Ce premier modèle servira de point de comparaison pour la suite.\nAjuster le nombre d’arbres: entraîner une forêt aléatoire avec les hyperparamètres par défaut en augmentant progressivement le nombre d’arbres, puis déterminer à partir de quel nombre d’arbres la performance se stabilise (en mesurant la performance avec l’erreur OOB avec pour métrique le score de Brier). Fixer le nombre d’arbres à cette valeur par la suite.\nAjuster le nombre de variables candidates et le taux d’échantillonnage: optimiser ces deux hyperparamètres grâce à une méthode de grid search évaluée par une approche de validation-croisée, ou par une approche reposant sur l’erreur OOB.\nAjuster le nombre minimal d’observations dans les noeuds terminaux: optimiser cet hyperparamètre grâce à une méthode de grid search évaluée par une approche de validation-croisée, ou par une approche reposant sur l’erreur OOB. Ce n’est pas l’hyperparamètre le plus important, mais s’il est possible de le fixer à une valeur plus élevée que la valeur par défaut sans perte de performance, cela permet d’accélérer le reste de la procédure.\nEntraîner du modèle final: entraîner une forêt aléatoire avec les hyperparamètres optimisés déduits des étapes précédentes.\nÉvaluer du modèle final: mesurer la performance du modèle final soit avec l’approche out-of-bag (OOB), soit avec un ensemble de test. Il est souvent instructif de comparer les performances du modèle final et du modèle entraîné avec les valeurs des hyperparamètres par défaut (parfois pour se rendre compte que ce dernier était déjà suffisamment performant…).\n\n\n\n\nLorsque l’espace des hyperparamètres est large ou que les performances initiales sont insuffisantes, adopter des méthodes avancées comme l’ptimisation basée sur un modèle séquentiel (SMBO). En R, il existe plusieurs implémentations d’appuyant sur cette méthode: tuneRF (limité à l’optimisation de mtry), tuneRanger (optimise simultanément mtry, node size, et sample size). La méthode SMBO est généralement la plus performante, mais demande un temps de calcul plus important.\nIl est également possible de remplacer les critères classiques (le taux d’erreur pour une classification par exemple) par d’autres critères de performance, comme le score de Brier ou la fonction de perte logarithmique (Probst and Boulesteix (2018)).\nPour gérer la contrainte computationnelle, il est possible de commencer par utiliser des échantillons réduits pour les étapes exploratoires, puis d’augmenter la taille de l’échantillon pour les tests finaux.", + "text": "Les forêts aléatoires nécessitent généralement moins d’optimisation que d’autres modèles de machine learning, car leurs performances varient relativement peu en fonction des hyperparamètres. Les valeurs par défaut fournissent souvent des résultats satisfaisants, ce qui réduit le besoin d’optimisation intensive. Cependant, un ajustement précis des hyperparamètres peut apporter des gains de performance, notamment sur des jeux de données complexes.\nComme indiqué dans la partie ?@sec-facteur-perf-rf, la performance prédictive d’une forêt aléatoire varie en fonction de deux critères essentiels: elle croît avec le pouvoir prédictif des arbres, et décroît avec la corrélation des arbres entre eux. L’optimisation des hyperparamètres d’une forêt aléatoire vise donc à trouver un équilibre optimal où les arbres sont suffisamment puissants pour être prédictifs, tout en étant suffisamment diversifiés pour que leurs erreurs ne soient pas trop corrélées.\nLa littérature propose de multiples approches pour optimiser simultanément plusieurs hyperparamètres: la recherche par grille (grid search), la recherche aléatoire (random search) et l’optimisation basée sur modèle séquentiel (SMBO), et il peut être difficile de savoir quelle approche adopter. Ce guide propose donc une première approche délibérément simple, avant de présenter les approches plus avancées.\n\n\nVoici une procédure simple pour entraîner une forêt aléatoire. Elle ne garantit pas l’obtention d’un modèle optimal, mais elle est lisible et permet d’obtenir rapidement un modèle raisonnablement performant.\n\nEntraîner une forêt aléatoire avec les valeurs des hyperparamètres par défaut. Ce premier modèle servira de point de comparaison pour la suite.\nAjuster le nombre d’arbres: entraîner une forêt aléatoire avec les hyperparamètres par défaut en augmentant progressivement le nombre d’arbres, puis déterminer à partir de quel nombre d’arbres la performance se stabilise (en mesurant la performance avec l’erreur OOB avec pour métrique le score de Brier). Fixer le nombre d’arbres à cette valeur par la suite.\nAjuster le nombre de variables candidates et le taux d’échantillonnage: optimiser ces deux hyperparamètres grâce à une méthode de grid search évaluée par une approche de validation-croisée, ou par une approche reposant sur l’erreur OOB.\nAjuster le nombre minimal d’observations dans les noeuds terminaux: optimiser cet hyperparamètre grâce à une méthode de grid search évaluée par une approche de validation-croisée, ou par une approche reposant sur l’erreur OOB. Ce n’est pas l’hyperparamètre le plus important, mais s’il est possible de le fixer à une valeur plus élevée que la valeur par défaut sans perte de performance, cela permet d’accélérer le reste de la procédure.\nEntraîner le modèle final: entraîner une forêt aléatoire avec les hyperparamètres optimisés déduits des étapes précédentes.\nÉvaluer le modèle final: mesurer la performance du modèle final soit avec l’approche out-of-bag (OOB), soit avec un ensemble de test. Il est souvent instructif de comparer les performances du modèle final et du modèle entraîné avec les valeurs des hyperparamètres par défaut (parfois pour se rendre compte que ce dernier était déjà suffisamment performant…).\n\n\n\n\nLorsque l’espace des hyperparamètres est large ou que les performances initiales sont insuffisantes, adopter des méthodes avancées comme l’ptimisation basée sur un modèle séquentiel (SMBO). En R, il existe plusieurs implémentations d’appuyant sur cette méthode: tuneRF (limité à l’optimisation de mtry), tuneRanger (optimise simultanément mtry, node size, et sample size). La méthode SMBO est généralement la plus performante, mais demande un temps de calcul plus important.\nIl est également possible de remplacer les critères classiques (le taux d’erreur pour une classification par exemple) par d’autres critères de performance, comme le score de Brier ou la fonction de perte logarithmique (Probst and Boulesteix (2018)).\nPour gérer la contrainte computationnelle, il est possible de commencer par utiliser des échantillons réduits pour les étapes exploratoires, puis d’augmenter la taille de l’échantillon pour les tests finaux.", "crumbs": [ "Comment bien utiliser les algorithmes?", "Guide d'usage des forêts aléatoires" @@ -441,7 +441,7 @@ "href": "chapters/chapter3/3-guide_usage_GB.html", "title": "1 Guide d’usage du gradient boosting", "section": "", - "text": "Ce guide propose des recommandations sur l’usage des algorithmes de gradient boosting disponibles dans la littérature, notamment Bentéjac, Csörgő, and Martínez-Muñoz (2021).\nContrairement aux forêts aléatoires, la littérature méthodologique sur l’usages des algorithmes de gradient boosting est assez limitée et relativement peu conclusive.\n. Ce guide comporte un certain nombre de choix méthodologiques forts, comme les implémentations recommandées ou la procédure d’entraînement proposée, et d’autres choix pertinents sont évidemment possibles. C’est pourquoi les recommandations de ce guide doivent être considérées comme un point de départ raisonnable, pas comme un ensemble de règles devant être respectées à tout prix.\n\n\nIl existe quatre implémentations du gradient boosting: XGBoost, LightGBM, CatBoost et scikit-learn. Elles sont toutes des variantes optimisées de l’algorithme de Friedman (2001) et ne diffèrent que sur des points mineurs. De multiples publications les ont comparées, à la fois en matière de pouvoir prédictif et de rapidité d’entraînement (voir notamment Bentéjac, Csörgő, and Martínez-Muñoz (2021) et Alshari, Saleh, and Odabaş (2021)). Cette littérature a abouti à trois conclusions. Premièrement, les différentes implémentations présentent des performances très proches (le classement exact variant d’une publication à l’autre). Deuxièmement, bien optimiser les hyperparamètres est nettement plus important que le choix de l’implémentation. Troisièmement, le temps d’entraînement varie beaucoup d’une implémentation à l’autre, et LightGBM est sensiblement plus rapide que les autres. Dans la mesure où l’optimisation des hyperparamètres est une étape à la fois essentielle et intense en calcul, l’efficacité computationnelle apparaît comme un critère majeur de choix de l’implémentation. C’est pourquoi le présent document décrit et recommande l’usage de LightGBM. Ceci étant, les trois autres implémentations peuvent également être utilisées, notamment si les données sont de taille limitée.\nPar ailleurs, chacune de ces implémentations propose une interface de haut niveau compatible avec scikit-learn. Il est vivement recommandé d’utiliser cette interface car elle minimise les risques d’erreur, facilite la construction de modèles reproductibles et permet d’utiliser l’ensemble des outils proposés par scikit-learn.\n\n\n\nCette section décrit en détail les principaux hyperparamètres des algorithmes de gradient boosting listés dans le tableau 1. Les noms des hyperparamètres sont ceux utilisés dans LightGBM. Les hyperparamètres portent généralement le même nom dans les autres implémentations; si ce n’est pas le cas, il est facile de s’y retrouver en lisant attentivement la documentation.\n\n\n\nTable 1: Les principaux hyperparamètres de LightGBM\n\n\n\n\n\n\n\n\n\n\nHyperparamètre\nDescription\nValeur par défaut\n\n\n\n\nobjective\nFonction de perte utilisée\nVariable\n\n\nn_estimators ou num_trees\nNombre d’arbres\n100\n\n\nlearning_rate ou eta\nTaux d’apprentissage\n0.1\n\n\nmax_depth\nProfondeur maximale des arbres\n-1 (pas de limite)\n\n\nnum_leaves\nNombre de feuilles terminales des arbres\n31\n\n\nmin_child_samples\nNombre minimal d’observations qu’une feuille terminale doit contenir\n20\n\n\nmin_child_weight\nPoids minimal qu’une feuille terminale doit contenir\n0.001\n\n\nlambda ou lambda_l2\nPénalisation quadratique sur la valeur des feuilles terminales\n0\n\n\nreg_alpha ou lambda_l1\nPénalisation absolue (L1) sur la valeur des feuilles terminales\n0\n\n\nmin_split_gain\nGain minimal nécessaire pour diviser un noeud\n0\n\n\nbagging_fraction\nTaux d’échantillonnage des données d’entraînement\n1\n\n\nfeature_fraction\nTaux d’échantillonnage des colonnes par arbre\n1\n\n\nfeature_fraction_bynode\nTaux d’échantillonnage des colonnes par noeud\n1\n\n\nmax_bin\nNombre de bins utilisés pour discrétiser les variables continues\n255\n\n\nmax_cat_to_onehot\nNombre de modalités en-deça duquel LightGBM utilise le one-hot-encoding\n4\n\n\nmax_cat_threshold\nNombre maximal de splits considérés dans le traitement des variables catégorielles\n32\n\n\nsample_weight\nPondération des observations dans les données d’entraînement\n1\n\n\nscale_pos_weight\nPoids des observations de la classe positive (classification binaire uniquement)\nAucun\n\n\nclass_weight\nPoids des observations de chaque classe (classification multiclasse uniquement)\nAucun\n\n\n\n\n\n\n\n\n\n\n\n\nAttention aux alias!\n\n\n\nIl arrive fréquemment que les hyperparamètres des algorithmes de gradient boosting portent plusieurs noms. Par exemple dans LightGBM, le nombre d’arbres porte les noms suivants: num_iterations, num_iteration, n_iter, num_tree, num_trees, num_round, num_rounds, nrounds, num_boost_round, n_estimators et max_iter (ouf!). C’est une source récurrente de confusion, mais il est facile de s’y retrouver en consultant la page de la documentation sur les hyperparamètres, qui liste les alias:\n\nhyperparamètres de LightGBM;\nhyperparamètres de XGBoost;\nhyperparamètres de CatBoost;\nhyperparamètres de scikit-learn.\n\n\n\nVoici une présentation des principaux hyperparamètres et de leurs effets sur les performances sur le modèle de gradient boosting:\n\nLa mécanique du gradient boosting est contrôlée par seulement trois hyperparamètres (tous les autres hyperparamètres portant sur la construction des arbres pris isolément):\n\nL’hyperparamètre objective définit à la fois la nature du problème modélisé (régression, classification…) et la fonction de perte utilisée lors de l’entraînement du modèle. Valeur par défaut différente selon les cas, regression_l2 en cas de régression, binary_log_loss pour la classification binaire, LIEN PARTIE AVANCE. A COMPLETER.\nle nombre d’arbres contrôle la complexité générale de l’algorithme. Le point essentiel est que, contrairement aux forêts aléatoires, la performance du gradient boosting sur les données d’entraînement croît continûment avec le nombre d’arbres sans jamais se stabiliser. Le choix du nombre d’arbres est essentiel, et doit viser un équilibre entre augmentation du pouvoir prédictif du modèle (si les arbres supplémentaires permettent au modèle de corriger les erreurs résiduelles), et lutte contre le surajustement (si les arbres supplémentaires captent uniquement les bruits statistiques et les fluctuations spécifiques des données d’entraînement). Par ailleurs, Le choix du nombre d’arbres est très lié à celui du taux d’apprentissage, et il est nécessaire de les optimiser conjointement.\nle taux d’apprentissage (learning rate) contrôle l’influence de chaque arbre sur le modèle global; il s’agit de \\(\\eta\\) dans l’équation REFERENCE PARTIE OVERFITTING. Un taux d’apprentissage faible réduit la contribution de chaque arbre, rendant l’apprentissage plus progressif; cela évite qu’un arbre donné ait une influence trop importante sur le modèle global et contribue donc à réduire le surajustement, mais cela nécessite un plus grand nombre d’arbres pour converger vers une solution optimale. Inversement, un taux d’apprentissage élevé accélère l’entraînement mais peut rendre le modèle instable (car trop sensible à un arbre donné), entraîner un surajustement et/ou aboutir à un modèle sous-optimal. La règle générale est de privilégier un taux d’apprentissage faible (entre 0.01 ou 0.3). Le choix du taux d’apprentissage est très lié à celui du nombre d’arbres: plus le taux d’apprentissage sera faible, plus le nombre d’arbres nécessaires pour converger vers une solution optimale sera élevé. Ces deux hyperparamètres doivent donc être optimisés conjointement.\n\nLa complexité des arbres: la profondeur maximale des arbres, le nombre de feuilles terminales et le nombre minimal d’observations par feuille terminale contrôlent la complexité des weak learners: une profondeur élevée, un grand nombre de feuilles et un faible nombre d’observations par feuille terminale aboutissent à des arbres complexes au pouvoir prédictif plus élevé, mais induisent un risque de surajustement. Par ailleurs, de tels arbres sont plus longs à entraîner que des arbres peu profonds avec un nombre limité de feuilles.\nLa lutte contre le surajustement: ces hyperparamètres de régularisation jouent un rôle important dans le contrôle de la complexité des weak learners et contribuent à éviter le surajustement:\n\nLes pénalisations tendent à réduire le poids \\(w_j\\) des feuilles terminales: la pénalisation quadratique réduit la valeur absolue des poids sans les annuler (il s’agit de \\(\\lambda\\) dans l’équation donnant le poids optimal d’une feuille terminale), tandis que la pénalisation absolue élevée pousse certains poids à être nuls. La pénalisation quadratique est la plus utilisée, notamment parce qu’elle permet d’amoindrir l’influence des points aberrants.\nLe gain minimal définit la quantité minimale de réduction de la perte requise pour qu’un nœud soit divisé (il s’agit du paramètre \\(\\gamma\\) dans l’équation donnant le gain potentiel d’un split); il contribue à réduire la complexité des arbres et à limiter le surajustement en empêchant l’algorithme de créer des splits dont l’apport est très faible et potentiellement dû à des variations non significatives des données d’entraînement.\n\nLes hyperparamètres d’échantillonnage:\n\nle taux d’échantillonnage des données d’entraînement et le taux d’échantillonnage des colonnes par noeud jouent exactement le même rôle que sample.fraction ou max_samples, et mtry dans la forêt aléatoire: échantillonner les données d’entraînement accélère l’entraînement, et échantillonner les colonnes au niveau de chaque noeud aboutit à des arbres plus variés. Il est à noter que l’échantillonnage des données se fait systématiquement sans remise. Comme pour la forêt aléatoire, la valeur optimale du taux d’échantillonnage des colonnes par noeud dépend du nombre de variables réellement pertinentes dans les données, et une valeur plus élevée est préférable si les données comprennent un grand nombre de variables binaires issues du one-hot-encoding des variables catégorielles.\nL’échantillonnage des colonnes par arbre sert essentiellement à accélérer l’entraînement. Si les colonnes sont échantillonnées par arbre et par noeud, alors le taux d’échantillonnage final est le produit des deux taux.\n\nLes réglages relatifs au retraitement des colonnes:\n\nle nombre de bins utilisés pour discrétiser les variables continues (voir partie PREPROCESSING pour le détail): un faible de bins contribue à accélérer l’entraînement (car le nombre de splits potentiels est faible), mais peut dégrader le pouvoir prédictif si de faibles variations de la variable continue ont un impact notable sur la variable-cible. Inversement, une valeur élevée permet de conserver davantage d’information sur la distribution de la variable continue, mais peut ralentir l’entraînement.\nle nombre de modalités en-deça duquel les variables catégorielles font l’objet d’un one-hot-encoding et le nombre maximal de splits considérés dans le traitement des variables catégorielles définissent la méthode utilisée pour traiter les variables catégorielles (voir partie PREPROCESSING pour le détail).\n\nLes pondérations:\n\nla pondération des observations sert à pondérer les données d’entraînement (voir PARTIE USAGE AVANCE).\nle poids des observations de la classe positive sert à rééquilibrer les données d’entraînement lorsque la classe positive est sous-représentée. Cet hyperparamètre ne sert que pour la classification binaire. Par défaut les deux classes ont le même poids.\nle poids des observations de chaque classe sert à rééquilibrer les données d’entraînement lorsque la part des différentes classes est hétérogène. Cet hyperparamètre ne sert que pour la classification binaire multiclasse. Par défaut toutes les classes ont le même poids.\n\n\n\n\n\n\n\n\nUne différence entre LightGBM et XGBoost\n\n\n\nUne différence notable entre les versions initiales de LightGBM et XGBoost tient à la méthode de construction des arbres:\n\nLightGBM construit les arbres selon une approche par feuille (dite leaf-wise): l’arbre est construit feuille par feuille, et c’est le split avec le gain le plus élevé qui est retenu à chaque étape, et ce quelle que soit sa position dans l’arbre. L’approche leaf-wise est très efficace pour minimiser la fonction de perte, car elle privilégie les splits les plus porteurs de gain, mais elle peut aboutir à un surajustement et à des arbres complexes, déséquilibrés et très profonds. L’hyperparamètre-clé de cette approche est le nombre maximal de feuilles terminales (num_leaves).\nXGBoost construit les arbres selon une approche par niveau (dite depth-wise): l’arbre est construit niveau par niveau, en divisant tous les nœuds du même niveau avant de passer au niveau suivant. L’approche depth-wise n’est pas optimale pour minimiser la fonction de perte, car elle ne recherche pas systématiquement le split le plus performant, mais elle permet d’obtenir des arbres équilibrés et de profondeur limitée. L’hyperparamètre-clé de cette approche est la profondeur maximale des arbres (max_depth).\n\nIl se trouve que l’approche leaf-wise a été ajoutée par la suite à XGBoost, via l’hyperparamètre grow_policy qui peut prendre les valeurs depthwise (valeur par défaut) et lossguide (approche leaf-wise).\n\n\n\n\n\n\nFigure 1\n\n\n\n\n\n\n\n\nProposer une procédure pour l’optimisation des hyperparamètres s’avère plus délicat pour le gradient boosting que pour les forêts aléatoires, pour deux raisons. D’une part, les algorithmes de gradient boosting comprennent un nombre beaucoup plus élevé d’hyperparamètres. D’autre part, la littérature méthodologique sur l’usage pratique de ces algorithmes reste assez limitée et peu conclusive (en-dehors des nombreux tutoriels introductifs disponibles sur internet). Un constat semble néanmoins bien établi: contrairement aux forêts aléatoires, les valeurs par défaut des hyperparamètres des implémentations ne constituent pas un point de départ raisonnable (Bentéjac, Csörgő, and Martínez-Muñoz (2021)), en particulier pour les hyperparamètres de régularisation dont la valeur par défaut est souvent nulle.", + "text": "Ce guide propose des recommandations sur l’usage des algorithmes de gradient boosting disponibles dans la littérature, notamment Bentéjac, Csörgő, and Martínez-Muñoz (2021).\nContrairement aux forêts aléatoires, la littérature méthodologique sur l’usages des algorithmes de gradient boosting est assez limitée et relativement peu conclusive.\n. Ce guide comporte un certain nombre de choix méthodologiques forts, comme les implémentations recommandées ou la procédure d’entraînement proposée, et d’autres choix pertinents sont évidemment possibles. C’est pourquoi les recommandations de ce guide doivent être considérées comme un point de départ raisonnable, pas comme un ensemble de règles devant être respectées à tout prix.\n\n\nIl existe quatre implémentations du gradient boosting: XGBoost, LightGBM, CatBoost et scikit-learn. Elles sont toutes des variantes optimisées de l’algorithme de Friedman (2001) et ne diffèrent que sur des points mineurs. De multiples publications les ont comparées, à la fois en matière de pouvoir prédictif et de rapidité d’entraînement (voir notamment Bentéjac, Csörgő, and Martínez-Muñoz (2021) et Alshari, Saleh, and Odabaş (2021)). Cette littérature a abouti à trois conclusions. Premièrement, les différentes implémentations présentent des performances très proches (le classement exact variant d’une publication à l’autre). Deuxièmement, bien optimiser les hyperparamètres est nettement plus important que le choix de l’implémentation. Troisièmement, le temps d’entraînement varie beaucoup d’une implémentation à l’autre, et LightGBM est sensiblement plus rapide que les autres. Dans la mesure où l’optimisation des hyperparamètres est une étape à la fois essentielle et intense en calcul, l’efficacité computationnelle apparaît comme un critère majeur de choix de l’implémentation. C’est pourquoi le présent document décrit et recommande l’usage de LightGBM. Ceci étant, les trois autres implémentations peuvent également être utilisées, notamment si les données sont de taille limitée.\nPar ailleurs, chacune de ces implémentations propose une interface de haut niveau compatible avec scikit-learn. Il est vivement recommandé d’utiliser cette interface car elle minimise les risques d’erreur, facilite la construction de modèles reproductibles et permet d’utiliser l’ensemble des outils proposés par scikit-learn.\n\n\n\nCette section décrit en détail les principaux hyperparamètres des algorithmes de gradient boosting listés dans le tableau 1. Les noms des hyperparamètres sont ceux utilisés dans LightGBM. Les hyperparamètres portent généralement le même nom dans les autres implémentations; si ce n’est pas le cas, il est facile de s’y retrouver en lisant attentivement la documentation.\n\n\n\nTable 1: Les principaux hyperparamètres de LightGBM\n\n\n\n\n\n\n\n\n\n\nHyperparamètre\nDescription\nValeur par défaut\n\n\n\n\nobjective\nFonction de perte utilisée\nVariable\n\n\nn_estimators ou num_trees\nNombre d’arbres\n100\n\n\nlearning_rate ou eta\nTaux d’apprentissage\n0.1\n\n\nmax_depth\nProfondeur maximale des arbres\n-1 (pas de limite)\n\n\nnum_leaves\nNombre de feuilles terminales des arbres\n31\n\n\nmin_child_samples\nNombre minimal d’observations qu’une feuille terminale doit contenir\n20\n\n\nmin_child_weight\nPoids minimal qu’une feuille terminale doit contenir\n0.001\n\n\nlambda ou lambda_l2\nPénalisation quadratique sur la valeur des feuilles terminales\n0\n\n\nreg_alpha ou lambda_l1\nPénalisation absolue (L1) sur la valeur des feuilles terminales\n0\n\n\nmin_split_gain\nGain minimal nécessaire pour diviser un noeud\n0\n\n\nbagging_fraction\nTaux d’échantillonnage des données d’entraînement\n1\n\n\nfeature_fraction\nTaux d’échantillonnage des colonnes par arbre\n1\n\n\nfeature_fraction_bynode\nTaux d’échantillonnage des colonnes par noeud\n1\n\n\nmax_bin\nNombre de bins utilisés pour discrétiser les variables continues\n255\n\n\nmax_cat_to_onehot\nNombre de modalités en-deça duquel LightGBM utilise le one-hot-encoding\n4\n\n\nmax_cat_threshold\nNombre maximal de splits considérés dans le traitement des variables catégorielles\n32\n\n\nsample_weight\nPondération des observations dans les données d’entraînement\n1\n\n\nscale_pos_weight\nPoids des observations de la classe positive (classification binaire uniquement)\nAucun\n\n\nclass_weight\nPoids des observations de chaque classe (classification multiclasse uniquement)\nAucun\n\n\n\n\n\n\n\n\n\n\n\n\nAttention aux alias!\n\n\n\nIl arrive fréquemment que les hyperparamètres des algorithmes de gradient boosting portent plusieurs noms. Par exemple dans LightGBM, le nombre d’arbres porte les noms suivants: num_iterations, num_iteration, n_iter, num_tree, num_trees, num_round, num_rounds, nrounds, num_boost_round, n_estimators et max_iter (ouf!). C’est une source récurrente de confusion, mais il est facile de s’y retrouver en consultant la page de la documentation sur les hyperparamètres, qui liste les alias:\n\nhyperparamètres de LightGBM;\nhyperparamètres de XGBoost;\nhyperparamètres de CatBoost;\nhyperparamètres de scikit-learn.\n\n\n\nVoici une présentation des principaux hyperparamètres et de leurs effets sur les performances sur le modèle de gradient boosting:\n\nLa mécanique du gradient boosting est contrôlée par seulement trois hyperparamètres (tous les autres hyperparamètres portant sur la construction des arbres pris isolément):\n\nL’hyperparamètre objective définit à la fois la nature du problème modélisé (régression, classification…) et la fonction de perte utilisée lors de l’entraînement du modèle. Valeur par défaut différente selon les cas, regression_l2 en cas de régression, binary_log_loss pour la classification binaire, LIEN PARTIE AVANCE. A COMPLETER.\nle nombre d’arbres contrôle la complexité générale de l’algorithme. Le point essentiel est que, contrairement aux forêts aléatoires, la performance du gradient boosting sur les données d’entraînement croît continûment avec le nombre d’arbres sans jamais se stabiliser. Le choix du nombre d’arbres est essentiel, et doit viser un équilibre entre augmentation du pouvoir prédictif du modèle (si les arbres supplémentaires permettent au modèle de corriger les erreurs résiduelles), et lutte contre le surajustement (si les arbres supplémentaires captent uniquement les bruits statistiques et les fluctuations spécifiques des données d’entraînement). Par ailleurs, Le choix du nombre d’arbres est très lié à celui du taux d’apprentissage, et il est nécessaire de les optimiser conjointement.\nle taux d’apprentissage (learning rate) contrôle l’influence de chaque arbre sur le modèle global; il s’agit de \\(\\eta\\) dans l’équation REFERENCE PARTIE OVERFITTING. Un taux d’apprentissage faible réduit la contribution de chaque arbre, rendant l’apprentissage plus progressif; cela évite qu’un arbre donné ait une influence trop importante sur le modèle global et contribue donc à réduire le surajustement, mais cela nécessite un plus grand nombre d’arbres pour converger vers une solution optimale. Inversement, un taux d’apprentissage élevé accélère l’entraînement mais peut rendre le modèle instable (car trop sensible à un arbre donné), entraîner un surajustement et/ou aboutir à un modèle sous-optimal. La règle générale est de privilégier un taux d’apprentissage faible (entre 0.01 ou 0.3). Le choix du taux d’apprentissage est très lié à celui du nombre d’arbres: plus le taux d’apprentissage sera faible, plus le nombre d’arbres nécessaires pour converger vers une solution optimale sera élevé. Ces deux hyperparamètres doivent donc être optimisés conjointement.\n\nLa complexité des arbres: la profondeur maximale des arbres, le nombre de feuilles terminales et le nombre minimal d’observations par feuille terminale contrôlent la complexité des weak learners: une profondeur élevée, un grand nombre de feuilles et un faible nombre d’observations par feuille terminale aboutissent à des arbres complexes au pouvoir prédictif plus élevé, mais induisent un risque de surajustement. Par ailleurs, de tels arbres sont plus longs à entraîner que des arbres peu profonds avec un nombre limité de feuilles. Il est à noter que le nombre de feuilles terminales a un effet linéaire sur la complexité des arbres, tandis que la profondeur maximale a un effet exponentiel: un arbre pleinement développé de profondeur \\(k\\) comprend \\(2^k\\) feuilles terminales et \\(2^k - 1\\) splits. Augmenter la profondeur d’une unité a donc pour effet de doubler le temps d’entraînement de chaque arbre.\nLa lutte contre le surajustement: ces hyperparamètres de régularisation jouent un rôle important dans le contrôle de la complexité des weak learners et contribuent à éviter le surajustement:\n\nLes pénalisations tendent à réduire le poids \\(w_j\\) des feuilles terminales: la pénalisation quadratique réduit la valeur absolue des poids sans les annuler (il s’agit de \\(\\lambda\\) dans l’équation donnant le poids optimal d’une feuille terminale), tandis que la pénalisation absolue élevée pousse certains poids à être nuls. La pénalisation quadratique est la plus utilisée, notamment parce qu’elle permet d’amoindrir l’influence des points aberrants.\nLe gain minimal définit la quantité minimale de réduction de la perte requise pour qu’un nœud soit divisé (il s’agit du paramètre \\(\\gamma\\) dans l’équation donnant le gain potentiel d’un split); une valeur plus élevée contribue à réduire la complexité des arbres et à limiter le surajustement en empêchant l’algorithme de créer des splits dont l’apport est très faible et potentiellement dû à des variations non significatives des données d’entraînement.\n\nLes hyperparamètres d’échantillonnage:\n\nle taux d’échantillonnage des données d’entraînement et le taux d’échantillonnage des colonnes par noeud jouent exactement le même rôle que sample.fraction ou max_samples, et mtry dans la forêt aléatoire: échantillonner les données d’entraînement accélère l’entraînement, et échantillonner les colonnes au niveau de chaque noeud aboutit à des arbres plus variés. Il est à noter que l’échantillonnage des données se fait systématiquement sans remise dans les algorithmes de gradient boosting. Comme pour la forêt aléatoire, la valeur optimale du taux d’échantillonnage des colonnes par noeud dépend du nombre de variables réellement pertinentes dans les données, et une valeur plus élevée est préférable si les données comprennent un grand nombre de variables binaires issues du one-hot-encoding des variables catégorielles.\nL’échantillonnage des colonnes par arbre sert essentiellement à accélérer l’entraînement. Si les colonnes sont échantillonnées par arbre et par noeud, alors le taux d’échantillonnage final est le produit des deux taux.\n\nLes réglages relatifs au retraitement des colonnes:\n\nle nombre de bins utilisés pour discrétiser les variables continues (voir partie PREPROCESSING pour le détail): un faible de bins contribue à accélérer l’entraînement (car le nombre de splits potentiels est faible), mais peut dégrader le pouvoir prédictif si de faibles variations de la variable continue ont un impact notable sur la variable-cible. Inversement, une valeur élevée permet de conserver davantage d’information sur la distribution de la variable continue, mais peut ralentir l’entraînement.\nle nombre de modalités en-deça duquel les variables catégorielles font l’objet d’un one-hot-encoding et le nombre maximal de splits considérés dans le traitement des variables catégorielles définissent la méthode utilisée pour traiter les variables catégorielles (voir partie PREPROCESSING pour le détail).\n\nLes pondérations:\n\nla pondération des observations sert à pondérer les données d’entraînement (voir PARTIE USAGE AVANCE).\nle poids des observations de la classe positive sert à rééquilibrer les données d’entraînement lorsque la classe positive est sous-représentée. Cet hyperparamètre ne sert que pour la classification binaire. Par défaut les deux classes ont le même poids.\nle poids des observations de chaque classe sert à rééquilibrer les données d’entraînement lorsque la part des différentes classes est hétérogène. Cet hyperparamètre ne sert que pour la classification binaire multiclasse. Par défaut toutes les classes ont le même poids.\n\n\n\n\n\n\n\n\nUne différence entre LightGBM et XGBoost\n\n\n\nUne différence notable entre les versions initiales de LightGBM et XGBoost tient à la méthode de construction des arbres:\n\nLightGBM construit les arbres selon une approche par feuille (dite leaf-wise): l’arbre est construit feuille par feuille, et c’est le split avec le gain le plus élevé qui est retenu à chaque étape, et ce quelle que soit sa position dans l’arbre. L’approche leaf-wise est très efficace pour minimiser la fonction de perte, car elle privilégie les splits les plus porteurs de gain, mais elle peut aboutir à un surajustement et à des arbres complexes, déséquilibrés et très profonds. L’hyperparamètre-clé de cette approche est le nombre maximal de feuilles terminales (num_leaves).\nXGBoost construit les arbres selon une approche par niveau (dite depth-wise): l’arbre est construit niveau par niveau, en divisant tous les nœuds du même niveau avant de passer au niveau suivant. L’approche depth-wise n’est pas optimale pour minimiser la fonction de perte, car elle ne recherche pas systématiquement le split le plus performant, mais elle permet d’obtenir des arbres équilibrés et de profondeur limitée. L’hyperparamètre-clé de cette approche est la profondeur maximale des arbres (max_depth).\n\nIl se trouve que l’approche leaf-wise a été ajoutée par la suite à XGBoost, via l’hyperparamètre grow_policy qui peut prendre les valeurs depthwise (valeur par défaut) et lossguide (approche leaf-wise).\n\n\n\n\n\n\nFigure 1\n\n\n\n\n\n\n\n\nProposer une procédure pour l’optimisation des hyperparamètres s’avère plus délicat pour les algorithmes de gradient boosting que pour les forêts aléatoires, car ces algorithmes comprennent un nombre beaucoup plus élevé d’hyperparamètres, et la littérature méthodologique sur leur usage pratique reste assez limitée et peu conclusive (en-dehors des nombreux tutoriels introductifs disponibles sur internet). Trois constats sont néanmoins bien établis. Premièrement, bien optimiser les hyperparamètres est essentiel pour la performance du modèle final. Deuxièmement, cette optimisation est complexe et longue, il faut donc la mener de façon rigoureuse et organisée pour ne pas perdre de temps. Troisièmement, contrairement aux forêts aléatoires, les valeurs par défaut des hyperparamètres des implémentations ne constituent pas un point de départ raisonnable (Bentéjac, Csörgő, and Martínez-Muñoz (2021)), en particulier pour les hyperparamètres de régularisation dont la valeur par défaut est souvent nulle.\n\n\n\nDéfinir des valeurs de départ raisonnables pour les hyperpararamètres. Comme il est impossible d’optimiser conjointement tous les hyperparamètres, il est nécessaire de mener cette optimisation de façon itérative, en optimisant certains hyperparamètres conditionnellement aux valeurs des autres. Il est donc essentiel de retenir des valeurs de départ raisonnables pour les hyperpararamètres qui ne sont pas optimisés en premier. Ce choix prend du temps et doit reposer sur une bonne compréhension du fonctionnement de l’algorithme et sur une connaissance approfondie des données utilisées. Voici quelques suggestions de valeurs de départ (voir notamment Bentéjac, Csörgő, and Martínez-Muñoz (2021)); il est tout à fait possible de s’en écarter lorsqu’on pense que le problème modélisé le justifie:\n\nmax_depth: entre 4 et 10;\nnum_leaves: entre 30 et 255;\nmin_split_gain: valeur strictement positive, commencer entre 0.1 et 1;\nlambda: valeur strictement positive; commencer avec une valeur entre 0.5 et 2; choisir une valeur plus élevée s’il y a des valeurs aberrantes sur \\(y\\) ou de clairs signes de surajustement;\nbagging_fraction : valeur strictement inférieure à 1, commencer entre 0.6 et 0.8;\nfeature_fraction_bynode : valeur strictement inférieure à 1, commencer entre 0.5 et 0.7; choisir une valeur plus élevée si les données comprennent un grand nombre de variables binaires issues d’un one-hot-encoding;\nmax_bin : garder la valeur par défaut; choisir éventuellement une valeur plus élevée si la la valeur par défaut ne suffit pas à refléter la distribution des variables continues;\nmax_cat_to_onehot : garder la valeur par défaut;\nmax_cat_threshold : garder la valeur par défaut.\n\nChoisir la méthode d’optimisation des hyperparamètres: validation croisée ou ensemble de validation.\n\n\n\n\nVoici une procédure simple pour optimiser les hyperparamètres d’un algorithme de gradient boosting. Elle ne garantit pas l’obtention d’un modèle optimal, mais elle est lisible et permet d’obtenir rapidement un modèle raisonnablement performant.\n\nAjuster conjointement le nombre d’arbres et le taux d’apprentissage.\nAjuster la complexité des arbres.\nAjuster les hyperparamètres de lutte contre le surajustement.\nEntraîner du modèle final: entraîner une forêt aléatoire avec les hyperparamètres optimisés déduits des étapes précédentes.\nÉvaluer du modèle final: mesurer la performance du modèle final sur un ensemble de test.\n\n\n\n\n\n\n\nParfois, une forêt aléatoire suffit…\n\n\n\nAvant de se lancer dans le gradient boosting, il peut être utile d’entraîner une forêt aléatoire selon la procédure décrite dans la section ?@sec-procedure-training-rf.__ Ce modèle servira de point de comparaison pour la suite, et permettra notamment de voir si le gradient boosting offre des gains de performances qui justifient le temps passé à l’optimisation des hyperparamètres.", "crumbs": [ "Comment bien utiliser les algorithmes?", "Guide d'usage du _gradient boosting_" @@ -463,7 +463,7 @@ "href": "chapters/chapter3/3-guide_usage_GB.html#sec-hyperparam-gb", "title": "1 Guide d’usage du gradient boosting", "section": "", - "text": "Cette section décrit en détail les principaux hyperparamètres des algorithmes de gradient boosting listés dans le tableau 1. Les noms des hyperparamètres sont ceux utilisés dans LightGBM. Les hyperparamètres portent généralement le même nom dans les autres implémentations; si ce n’est pas le cas, il est facile de s’y retrouver en lisant attentivement la documentation.\n\n\n\nTable 1: Les principaux hyperparamètres de LightGBM\n\n\n\n\n\n\n\n\n\n\nHyperparamètre\nDescription\nValeur par défaut\n\n\n\n\nobjective\nFonction de perte utilisée\nVariable\n\n\nn_estimators ou num_trees\nNombre d’arbres\n100\n\n\nlearning_rate ou eta\nTaux d’apprentissage\n0.1\n\n\nmax_depth\nProfondeur maximale des arbres\n-1 (pas de limite)\n\n\nnum_leaves\nNombre de feuilles terminales des arbres\n31\n\n\nmin_child_samples\nNombre minimal d’observations qu’une feuille terminale doit contenir\n20\n\n\nmin_child_weight\nPoids minimal qu’une feuille terminale doit contenir\n0.001\n\n\nlambda ou lambda_l2\nPénalisation quadratique sur la valeur des feuilles terminales\n0\n\n\nreg_alpha ou lambda_l1\nPénalisation absolue (L1) sur la valeur des feuilles terminales\n0\n\n\nmin_split_gain\nGain minimal nécessaire pour diviser un noeud\n0\n\n\nbagging_fraction\nTaux d’échantillonnage des données d’entraînement\n1\n\n\nfeature_fraction\nTaux d’échantillonnage des colonnes par arbre\n1\n\n\nfeature_fraction_bynode\nTaux d’échantillonnage des colonnes par noeud\n1\n\n\nmax_bin\nNombre de bins utilisés pour discrétiser les variables continues\n255\n\n\nmax_cat_to_onehot\nNombre de modalités en-deça duquel LightGBM utilise le one-hot-encoding\n4\n\n\nmax_cat_threshold\nNombre maximal de splits considérés dans le traitement des variables catégorielles\n32\n\n\nsample_weight\nPondération des observations dans les données d’entraînement\n1\n\n\nscale_pos_weight\nPoids des observations de la classe positive (classification binaire uniquement)\nAucun\n\n\nclass_weight\nPoids des observations de chaque classe (classification multiclasse uniquement)\nAucun\n\n\n\n\n\n\n\n\n\n\n\n\nAttention aux alias!\n\n\n\nIl arrive fréquemment que les hyperparamètres des algorithmes de gradient boosting portent plusieurs noms. Par exemple dans LightGBM, le nombre d’arbres porte les noms suivants: num_iterations, num_iteration, n_iter, num_tree, num_trees, num_round, num_rounds, nrounds, num_boost_round, n_estimators et max_iter (ouf!). C’est une source récurrente de confusion, mais il est facile de s’y retrouver en consultant la page de la documentation sur les hyperparamètres, qui liste les alias:\n\nhyperparamètres de LightGBM;\nhyperparamètres de XGBoost;\nhyperparamètres de CatBoost;\nhyperparamètres de scikit-learn.\n\n\n\nVoici une présentation des principaux hyperparamètres et de leurs effets sur les performances sur le modèle de gradient boosting:\n\nLa mécanique du gradient boosting est contrôlée par seulement trois hyperparamètres (tous les autres hyperparamètres portant sur la construction des arbres pris isolément):\n\nL’hyperparamètre objective définit à la fois la nature du problème modélisé (régression, classification…) et la fonction de perte utilisée lors de l’entraînement du modèle. Valeur par défaut différente selon les cas, regression_l2 en cas de régression, binary_log_loss pour la classification binaire, LIEN PARTIE AVANCE. A COMPLETER.\nle nombre d’arbres contrôle la complexité générale de l’algorithme. Le point essentiel est que, contrairement aux forêts aléatoires, la performance du gradient boosting sur les données d’entraînement croît continûment avec le nombre d’arbres sans jamais se stabiliser. Le choix du nombre d’arbres est essentiel, et doit viser un équilibre entre augmentation du pouvoir prédictif du modèle (si les arbres supplémentaires permettent au modèle de corriger les erreurs résiduelles), et lutte contre le surajustement (si les arbres supplémentaires captent uniquement les bruits statistiques et les fluctuations spécifiques des données d’entraînement). Par ailleurs, Le choix du nombre d’arbres est très lié à celui du taux d’apprentissage, et il est nécessaire de les optimiser conjointement.\nle taux d’apprentissage (learning rate) contrôle l’influence de chaque arbre sur le modèle global; il s’agit de \\(\\eta\\) dans l’équation REFERENCE PARTIE OVERFITTING. Un taux d’apprentissage faible réduit la contribution de chaque arbre, rendant l’apprentissage plus progressif; cela évite qu’un arbre donné ait une influence trop importante sur le modèle global et contribue donc à réduire le surajustement, mais cela nécessite un plus grand nombre d’arbres pour converger vers une solution optimale. Inversement, un taux d’apprentissage élevé accélère l’entraînement mais peut rendre le modèle instable (car trop sensible à un arbre donné), entraîner un surajustement et/ou aboutir à un modèle sous-optimal. La règle générale est de privilégier un taux d’apprentissage faible (entre 0.01 ou 0.3). Le choix du taux d’apprentissage est très lié à celui du nombre d’arbres: plus le taux d’apprentissage sera faible, plus le nombre d’arbres nécessaires pour converger vers une solution optimale sera élevé. Ces deux hyperparamètres doivent donc être optimisés conjointement.\n\nLa complexité des arbres: la profondeur maximale des arbres, le nombre de feuilles terminales et le nombre minimal d’observations par feuille terminale contrôlent la complexité des weak learners: une profondeur élevée, un grand nombre de feuilles et un faible nombre d’observations par feuille terminale aboutissent à des arbres complexes au pouvoir prédictif plus élevé, mais induisent un risque de surajustement. Par ailleurs, de tels arbres sont plus longs à entraîner que des arbres peu profonds avec un nombre limité de feuilles.\nLa lutte contre le surajustement: ces hyperparamètres de régularisation jouent un rôle important dans le contrôle de la complexité des weak learners et contribuent à éviter le surajustement:\n\nLes pénalisations tendent à réduire le poids \\(w_j\\) des feuilles terminales: la pénalisation quadratique réduit la valeur absolue des poids sans les annuler (il s’agit de \\(\\lambda\\) dans l’équation donnant le poids optimal d’une feuille terminale), tandis que la pénalisation absolue élevée pousse certains poids à être nuls. La pénalisation quadratique est la plus utilisée, notamment parce qu’elle permet d’amoindrir l’influence des points aberrants.\nLe gain minimal définit la quantité minimale de réduction de la perte requise pour qu’un nœud soit divisé (il s’agit du paramètre \\(\\gamma\\) dans l’équation donnant le gain potentiel d’un split); il contribue à réduire la complexité des arbres et à limiter le surajustement en empêchant l’algorithme de créer des splits dont l’apport est très faible et potentiellement dû à des variations non significatives des données d’entraînement.\n\nLes hyperparamètres d’échantillonnage:\n\nle taux d’échantillonnage des données d’entraînement et le taux d’échantillonnage des colonnes par noeud jouent exactement le même rôle que sample.fraction ou max_samples, et mtry dans la forêt aléatoire: échantillonner les données d’entraînement accélère l’entraînement, et échantillonner les colonnes au niveau de chaque noeud aboutit à des arbres plus variés. Il est à noter que l’échantillonnage des données se fait systématiquement sans remise. Comme pour la forêt aléatoire, la valeur optimale du taux d’échantillonnage des colonnes par noeud dépend du nombre de variables réellement pertinentes dans les données, et une valeur plus élevée est préférable si les données comprennent un grand nombre de variables binaires issues du one-hot-encoding des variables catégorielles.\nL’échantillonnage des colonnes par arbre sert essentiellement à accélérer l’entraînement. Si les colonnes sont échantillonnées par arbre et par noeud, alors le taux d’échantillonnage final est le produit des deux taux.\n\nLes réglages relatifs au retraitement des colonnes:\n\nle nombre de bins utilisés pour discrétiser les variables continues (voir partie PREPROCESSING pour le détail): un faible de bins contribue à accélérer l’entraînement (car le nombre de splits potentiels est faible), mais peut dégrader le pouvoir prédictif si de faibles variations de la variable continue ont un impact notable sur la variable-cible. Inversement, une valeur élevée permet de conserver davantage d’information sur la distribution de la variable continue, mais peut ralentir l’entraînement.\nle nombre de modalités en-deça duquel les variables catégorielles font l’objet d’un one-hot-encoding et le nombre maximal de splits considérés dans le traitement des variables catégorielles définissent la méthode utilisée pour traiter les variables catégorielles (voir partie PREPROCESSING pour le détail).\n\nLes pondérations:\n\nla pondération des observations sert à pondérer les données d’entraînement (voir PARTIE USAGE AVANCE).\nle poids des observations de la classe positive sert à rééquilibrer les données d’entraînement lorsque la classe positive est sous-représentée. Cet hyperparamètre ne sert que pour la classification binaire. Par défaut les deux classes ont le même poids.\nle poids des observations de chaque classe sert à rééquilibrer les données d’entraînement lorsque la part des différentes classes est hétérogène. Cet hyperparamètre ne sert que pour la classification binaire multiclasse. Par défaut toutes les classes ont le même poids.\n\n\n\n\n\n\n\n\nUne différence entre LightGBM et XGBoost\n\n\n\nUne différence notable entre les versions initiales de LightGBM et XGBoost tient à la méthode de construction des arbres:\n\nLightGBM construit les arbres selon une approche par feuille (dite leaf-wise): l’arbre est construit feuille par feuille, et c’est le split avec le gain le plus élevé qui est retenu à chaque étape, et ce quelle que soit sa position dans l’arbre. L’approche leaf-wise est très efficace pour minimiser la fonction de perte, car elle privilégie les splits les plus porteurs de gain, mais elle peut aboutir à un surajustement et à des arbres complexes, déséquilibrés et très profonds. L’hyperparamètre-clé de cette approche est le nombre maximal de feuilles terminales (num_leaves).\nXGBoost construit les arbres selon une approche par niveau (dite depth-wise): l’arbre est construit niveau par niveau, en divisant tous les nœuds du même niveau avant de passer au niveau suivant. L’approche depth-wise n’est pas optimale pour minimiser la fonction de perte, car elle ne recherche pas systématiquement le split le plus performant, mais elle permet d’obtenir des arbres équilibrés et de profondeur limitée. L’hyperparamètre-clé de cette approche est la profondeur maximale des arbres (max_depth).\n\nIl se trouve que l’approche leaf-wise a été ajoutée par la suite à XGBoost, via l’hyperparamètre grow_policy qui peut prendre les valeurs depthwise (valeur par défaut) et lossguide (approche leaf-wise).\n\n\n\n\n\n\nFigure 1", + "text": "Cette section décrit en détail les principaux hyperparamètres des algorithmes de gradient boosting listés dans le tableau 1. Les noms des hyperparamètres sont ceux utilisés dans LightGBM. Les hyperparamètres portent généralement le même nom dans les autres implémentations; si ce n’est pas le cas, il est facile de s’y retrouver en lisant attentivement la documentation.\n\n\n\nTable 1: Les principaux hyperparamètres de LightGBM\n\n\n\n\n\n\n\n\n\n\nHyperparamètre\nDescription\nValeur par défaut\n\n\n\n\nobjective\nFonction de perte utilisée\nVariable\n\n\nn_estimators ou num_trees\nNombre d’arbres\n100\n\n\nlearning_rate ou eta\nTaux d’apprentissage\n0.1\n\n\nmax_depth\nProfondeur maximale des arbres\n-1 (pas de limite)\n\n\nnum_leaves\nNombre de feuilles terminales des arbres\n31\n\n\nmin_child_samples\nNombre minimal d’observations qu’une feuille terminale doit contenir\n20\n\n\nmin_child_weight\nPoids minimal qu’une feuille terminale doit contenir\n0.001\n\n\nlambda ou lambda_l2\nPénalisation quadratique sur la valeur des feuilles terminales\n0\n\n\nreg_alpha ou lambda_l1\nPénalisation absolue (L1) sur la valeur des feuilles terminales\n0\n\n\nmin_split_gain\nGain minimal nécessaire pour diviser un noeud\n0\n\n\nbagging_fraction\nTaux d’échantillonnage des données d’entraînement\n1\n\n\nfeature_fraction\nTaux d’échantillonnage des colonnes par arbre\n1\n\n\nfeature_fraction_bynode\nTaux d’échantillonnage des colonnes par noeud\n1\n\n\nmax_bin\nNombre de bins utilisés pour discrétiser les variables continues\n255\n\n\nmax_cat_to_onehot\nNombre de modalités en-deça duquel LightGBM utilise le one-hot-encoding\n4\n\n\nmax_cat_threshold\nNombre maximal de splits considérés dans le traitement des variables catégorielles\n32\n\n\nsample_weight\nPondération des observations dans les données d’entraînement\n1\n\n\nscale_pos_weight\nPoids des observations de la classe positive (classification binaire uniquement)\nAucun\n\n\nclass_weight\nPoids des observations de chaque classe (classification multiclasse uniquement)\nAucun\n\n\n\n\n\n\n\n\n\n\n\n\nAttention aux alias!\n\n\n\nIl arrive fréquemment que les hyperparamètres des algorithmes de gradient boosting portent plusieurs noms. Par exemple dans LightGBM, le nombre d’arbres porte les noms suivants: num_iterations, num_iteration, n_iter, num_tree, num_trees, num_round, num_rounds, nrounds, num_boost_round, n_estimators et max_iter (ouf!). C’est une source récurrente de confusion, mais il est facile de s’y retrouver en consultant la page de la documentation sur les hyperparamètres, qui liste les alias:\n\nhyperparamètres de LightGBM;\nhyperparamètres de XGBoost;\nhyperparamètres de CatBoost;\nhyperparamètres de scikit-learn.\n\n\n\nVoici une présentation des principaux hyperparamètres et de leurs effets sur les performances sur le modèle de gradient boosting:\n\nLa mécanique du gradient boosting est contrôlée par seulement trois hyperparamètres (tous les autres hyperparamètres portant sur la construction des arbres pris isolément):\n\nL’hyperparamètre objective définit à la fois la nature du problème modélisé (régression, classification…) et la fonction de perte utilisée lors de l’entraînement du modèle. Valeur par défaut différente selon les cas, regression_l2 en cas de régression, binary_log_loss pour la classification binaire, LIEN PARTIE AVANCE. A COMPLETER.\nle nombre d’arbres contrôle la complexité générale de l’algorithme. Le point essentiel est que, contrairement aux forêts aléatoires, la performance du gradient boosting sur les données d’entraînement croît continûment avec le nombre d’arbres sans jamais se stabiliser. Le choix du nombre d’arbres est essentiel, et doit viser un équilibre entre augmentation du pouvoir prédictif du modèle (si les arbres supplémentaires permettent au modèle de corriger les erreurs résiduelles), et lutte contre le surajustement (si les arbres supplémentaires captent uniquement les bruits statistiques et les fluctuations spécifiques des données d’entraînement). Par ailleurs, Le choix du nombre d’arbres est très lié à celui du taux d’apprentissage, et il est nécessaire de les optimiser conjointement.\nle taux d’apprentissage (learning rate) contrôle l’influence de chaque arbre sur le modèle global; il s’agit de \\(\\eta\\) dans l’équation REFERENCE PARTIE OVERFITTING. Un taux d’apprentissage faible réduit la contribution de chaque arbre, rendant l’apprentissage plus progressif; cela évite qu’un arbre donné ait une influence trop importante sur le modèle global et contribue donc à réduire le surajustement, mais cela nécessite un plus grand nombre d’arbres pour converger vers une solution optimale. Inversement, un taux d’apprentissage élevé accélère l’entraînement mais peut rendre le modèle instable (car trop sensible à un arbre donné), entraîner un surajustement et/ou aboutir à un modèle sous-optimal. La règle générale est de privilégier un taux d’apprentissage faible (entre 0.01 ou 0.3). Le choix du taux d’apprentissage est très lié à celui du nombre d’arbres: plus le taux d’apprentissage sera faible, plus le nombre d’arbres nécessaires pour converger vers une solution optimale sera élevé. Ces deux hyperparamètres doivent donc être optimisés conjointement.\n\nLa complexité des arbres: la profondeur maximale des arbres, le nombre de feuilles terminales et le nombre minimal d’observations par feuille terminale contrôlent la complexité des weak learners: une profondeur élevée, un grand nombre de feuilles et un faible nombre d’observations par feuille terminale aboutissent à des arbres complexes au pouvoir prédictif plus élevé, mais induisent un risque de surajustement. Par ailleurs, de tels arbres sont plus longs à entraîner que des arbres peu profonds avec un nombre limité de feuilles. Il est à noter que le nombre de feuilles terminales a un effet linéaire sur la complexité des arbres, tandis que la profondeur maximale a un effet exponentiel: un arbre pleinement développé de profondeur \\(k\\) comprend \\(2^k\\) feuilles terminales et \\(2^k - 1\\) splits. Augmenter la profondeur d’une unité a donc pour effet de doubler le temps d’entraînement de chaque arbre.\nLa lutte contre le surajustement: ces hyperparamètres de régularisation jouent un rôle important dans le contrôle de la complexité des weak learners et contribuent à éviter le surajustement:\n\nLes pénalisations tendent à réduire le poids \\(w_j\\) des feuilles terminales: la pénalisation quadratique réduit la valeur absolue des poids sans les annuler (il s’agit de \\(\\lambda\\) dans l’équation donnant le poids optimal d’une feuille terminale), tandis que la pénalisation absolue élevée pousse certains poids à être nuls. La pénalisation quadratique est la plus utilisée, notamment parce qu’elle permet d’amoindrir l’influence des points aberrants.\nLe gain minimal définit la quantité minimale de réduction de la perte requise pour qu’un nœud soit divisé (il s’agit du paramètre \\(\\gamma\\) dans l’équation donnant le gain potentiel d’un split); une valeur plus élevée contribue à réduire la complexité des arbres et à limiter le surajustement en empêchant l’algorithme de créer des splits dont l’apport est très faible et potentiellement dû à des variations non significatives des données d’entraînement.\n\nLes hyperparamètres d’échantillonnage:\n\nle taux d’échantillonnage des données d’entraînement et le taux d’échantillonnage des colonnes par noeud jouent exactement le même rôle que sample.fraction ou max_samples, et mtry dans la forêt aléatoire: échantillonner les données d’entraînement accélère l’entraînement, et échantillonner les colonnes au niveau de chaque noeud aboutit à des arbres plus variés. Il est à noter que l’échantillonnage des données se fait systématiquement sans remise dans les algorithmes de gradient boosting. Comme pour la forêt aléatoire, la valeur optimale du taux d’échantillonnage des colonnes par noeud dépend du nombre de variables réellement pertinentes dans les données, et une valeur plus élevée est préférable si les données comprennent un grand nombre de variables binaires issues du one-hot-encoding des variables catégorielles.\nL’échantillonnage des colonnes par arbre sert essentiellement à accélérer l’entraînement. Si les colonnes sont échantillonnées par arbre et par noeud, alors le taux d’échantillonnage final est le produit des deux taux.\n\nLes réglages relatifs au retraitement des colonnes:\n\nle nombre de bins utilisés pour discrétiser les variables continues (voir partie PREPROCESSING pour le détail): un faible de bins contribue à accélérer l’entraînement (car le nombre de splits potentiels est faible), mais peut dégrader le pouvoir prédictif si de faibles variations de la variable continue ont un impact notable sur la variable-cible. Inversement, une valeur élevée permet de conserver davantage d’information sur la distribution de la variable continue, mais peut ralentir l’entraînement.\nle nombre de modalités en-deça duquel les variables catégorielles font l’objet d’un one-hot-encoding et le nombre maximal de splits considérés dans le traitement des variables catégorielles définissent la méthode utilisée pour traiter les variables catégorielles (voir partie PREPROCESSING pour le détail).\n\nLes pondérations:\n\nla pondération des observations sert à pondérer les données d’entraînement (voir PARTIE USAGE AVANCE).\nle poids des observations de la classe positive sert à rééquilibrer les données d’entraînement lorsque la classe positive est sous-représentée. Cet hyperparamètre ne sert que pour la classification binaire. Par défaut les deux classes ont le même poids.\nle poids des observations de chaque classe sert à rééquilibrer les données d’entraînement lorsque la part des différentes classes est hétérogène. Cet hyperparamètre ne sert que pour la classification binaire multiclasse. Par défaut toutes les classes ont le même poids.\n\n\n\n\n\n\n\n\nUne différence entre LightGBM et XGBoost\n\n\n\nUne différence notable entre les versions initiales de LightGBM et XGBoost tient à la méthode de construction des arbres:\n\nLightGBM construit les arbres selon une approche par feuille (dite leaf-wise): l’arbre est construit feuille par feuille, et c’est le split avec le gain le plus élevé qui est retenu à chaque étape, et ce quelle que soit sa position dans l’arbre. L’approche leaf-wise est très efficace pour minimiser la fonction de perte, car elle privilégie les splits les plus porteurs de gain, mais elle peut aboutir à un surajustement et à des arbres complexes, déséquilibrés et très profonds. L’hyperparamètre-clé de cette approche est le nombre maximal de feuilles terminales (num_leaves).\nXGBoost construit les arbres selon une approche par niveau (dite depth-wise): l’arbre est construit niveau par niveau, en divisant tous les nœuds du même niveau avant de passer au niveau suivant. L’approche depth-wise n’est pas optimale pour minimiser la fonction de perte, car elle ne recherche pas systématiquement le split le plus performant, mais elle permet d’obtenir des arbres équilibrés et de profondeur limitée. L’hyperparamètre-clé de cette approche est la profondeur maximale des arbres (max_depth).\n\nIl se trouve que l’approche leaf-wise a été ajoutée par la suite à XGBoost, via l’hyperparamètre grow_policy qui peut prendre les valeurs depthwise (valeur par défaut) et lossguide (approche leaf-wise).\n\n\n\n\n\n\nFigure 1", "crumbs": [ "Comment bien utiliser les algorithmes?", "Guide d'usage du _gradient boosting_" @@ -474,7 +474,7 @@ "href": "chapters/chapter3/3-guide_usage_GB.html#sec-procedure-training-gb", "title": "1 Guide d’usage du gradient boosting", "section": "", - "text": "Proposer une procédure pour l’optimisation des hyperparamètres s’avère plus délicat pour le gradient boosting que pour les forêts aléatoires, pour deux raisons. D’une part, les algorithmes de gradient boosting comprennent un nombre beaucoup plus élevé d’hyperparamètres. D’autre part, la littérature méthodologique sur l’usage pratique de ces algorithmes reste assez limitée et peu conclusive (en-dehors des nombreux tutoriels introductifs disponibles sur internet). Un constat semble néanmoins bien établi: contrairement aux forêts aléatoires, les valeurs par défaut des hyperparamètres des implémentations ne constituent pas un point de départ raisonnable (Bentéjac, Csörgő, and Martínez-Muñoz (2021)), en particulier pour les hyperparamètres de régularisation dont la valeur par défaut est souvent nulle.", + "text": "Proposer une procédure pour l’optimisation des hyperparamètres s’avère plus délicat pour les algorithmes de gradient boosting que pour les forêts aléatoires, car ces algorithmes comprennent un nombre beaucoup plus élevé d’hyperparamètres, et la littérature méthodologique sur leur usage pratique reste assez limitée et peu conclusive (en-dehors des nombreux tutoriels introductifs disponibles sur internet). Trois constats sont néanmoins bien établis. Premièrement, bien optimiser les hyperparamètres est essentiel pour la performance du modèle final. Deuxièmement, cette optimisation est complexe et longue, il faut donc la mener de façon rigoureuse et organisée pour ne pas perdre de temps. Troisièmement, contrairement aux forêts aléatoires, les valeurs par défaut des hyperparamètres des implémentations ne constituent pas un point de départ raisonnable (Bentéjac, Csörgő, and Martínez-Muñoz (2021)), en particulier pour les hyperparamètres de régularisation dont la valeur par défaut est souvent nulle.\n\n\n\nDéfinir des valeurs de départ raisonnables pour les hyperpararamètres. Comme il est impossible d’optimiser conjointement tous les hyperparamètres, il est nécessaire de mener cette optimisation de façon itérative, en optimisant certains hyperparamètres conditionnellement aux valeurs des autres. Il est donc essentiel de retenir des valeurs de départ raisonnables pour les hyperpararamètres qui ne sont pas optimisés en premier. Ce choix prend du temps et doit reposer sur une bonne compréhension du fonctionnement de l’algorithme et sur une connaissance approfondie des données utilisées. Voici quelques suggestions de valeurs de départ (voir notamment Bentéjac, Csörgő, and Martínez-Muñoz (2021)); il est tout à fait possible de s’en écarter lorsqu’on pense que le problème modélisé le justifie:\n\nmax_depth: entre 4 et 10;\nnum_leaves: entre 30 et 255;\nmin_split_gain: valeur strictement positive, commencer entre 0.1 et 1;\nlambda: valeur strictement positive; commencer avec une valeur entre 0.5 et 2; choisir une valeur plus élevée s’il y a des valeurs aberrantes sur \\(y\\) ou de clairs signes de surajustement;\nbagging_fraction : valeur strictement inférieure à 1, commencer entre 0.6 et 0.8;\nfeature_fraction_bynode : valeur strictement inférieure à 1, commencer entre 0.5 et 0.7; choisir une valeur plus élevée si les données comprennent un grand nombre de variables binaires issues d’un one-hot-encoding;\nmax_bin : garder la valeur par défaut; choisir éventuellement une valeur plus élevée si la la valeur par défaut ne suffit pas à refléter la distribution des variables continues;\nmax_cat_to_onehot : garder la valeur par défaut;\nmax_cat_threshold : garder la valeur par défaut.\n\nChoisir la méthode d’optimisation des hyperparamètres: validation croisée ou ensemble de validation.\n\n\n\n\nVoici une procédure simple pour optimiser les hyperparamètres d’un algorithme de gradient boosting. Elle ne garantit pas l’obtention d’un modèle optimal, mais elle est lisible et permet d’obtenir rapidement un modèle raisonnablement performant.\n\nAjuster conjointement le nombre d’arbres et le taux d’apprentissage.\nAjuster la complexité des arbres.\nAjuster les hyperparamètres de lutte contre le surajustement.\nEntraîner du modèle final: entraîner une forêt aléatoire avec les hyperparamètres optimisés déduits des étapes précédentes.\nÉvaluer du modèle final: mesurer la performance du modèle final sur un ensemble de test.\n\n\n\n\n\n\n\nParfois, une forêt aléatoire suffit…\n\n\n\nAvant de se lancer dans le gradient boosting, il peut être utile d’entraîner une forêt aléatoire selon la procédure décrite dans la section ?@sec-procedure-training-rf.__ Ce modèle servira de point de comparaison pour la suite, et permettra notamment de voir si le gradient boosting offre des gains de performances qui justifient le temps passé à l’optimisation des hyperparamètres.", "crumbs": [ "Comment bien utiliser les algorithmes?", "Guide d'usage du _gradient boosting_" diff --git a/sitemap.xml b/sitemap.xml index 12cf9b4..8c39981 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,54 +2,54 @@ https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter3/2-guide_usage_RF.html - 2025-01-15T18:40:46.062Z + 2025-01-20T16:17:54.338Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter3/0-intro.html - 2025-01-15T18:40:46.061Z + 2025-01-20T16:17:54.338Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter2/4-boosting.html - 2025-01-15T18:40:46.061Z + 2025-01-20T16:17:54.338Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter2/2-bagging.html - 2025-01-15T18:40:46.061Z + 2025-01-20T16:17:54.337Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter2/0-intro.html - 2025-01-15T18:40:46.061Z + 2025-01-20T16:17:54.337Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter1/1-survol.html - 2025-01-15T18:40:46.061Z + 2025-01-20T16:17:54.337Z https://github.com/inseefrlab/DT_methodes_ensemblistes/index.html - 2025-01-15T18:40:46.064Z + 2025-01-20T16:17:54.341Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter1/2-comparaison_GB_RF.html - 2025-01-15T18:40:46.061Z + 2025-01-20T16:17:54.337Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter2/1-CART.html - 2025-01-15T18:40:46.061Z + 2025-01-20T16:17:54.337Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter2/3-random_forest.html - 2025-01-15T18:40:46.061Z + 2025-01-20T16:17:54.337Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter2/ajouts_boosting.html - 2025-01-15T18:40:46.061Z + 2025-01-20T16:17:54.338Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter3/1-preparation_donnees.html - 2025-01-15T18:40:46.061Z + 2025-01-20T16:17:54.338Z https://github.com/inseefrlab/DT_methodes_ensemblistes/chapters/chapter3/3-guide_usage_GB.html - 2025-01-15T18:40:46.062Z + 2025-01-20T16:17:54.338Z