Maintenant qu’on a vu comment booster nos arbres afin de les rendre plus performants, nous allons étudier l’algorithme le plus utilisé quand il s’agit d’utiliser des arbres de décision : le gradient boosting. C’est en fait une généralisation du boosting dans lequel on va utiliser la fonction de perte de manière similaire à une descente de gradient. A la manière du boosting classique, il n’est pas forcément utilisé avec des arbres de décision même si ils restent notre classe préférée d’apprenants faibles.
Intuition du gradient boosting
Le gradient boosting a vu naissance lorsque des chercheurs ont replacé l’algorithme de l’Adaboost dans un cadre statistique plus formel dans lequel il n’était qu’une “simple” optimisation numérique visant à minimiser une fonction de perte de manière successive à l’instar d’une descente de gradient.
On va utiliser ici une variation de la descente de gradient appelée descente de gradient fonctionnelle, puisqu’on travaille dans un espace fonctionnel lorsqu'on parle des classifieurs de l'algorithme du boosting 😉
En terme statistique, on a appelé cette famille de modèle “stage-wise additive models” a contrario des “stepwise additive models”, parce qu’on fige les apprenants précédents contrairement aux stepwise models dans lesquels on va modifier les apprenants précédents.
Cette généralisation de l’Adaboost à l’aide de ce framework statistique a permis d’utiliser différentes fonctions de pertes différentiables, ce qui a permis plus d’applications que la simple classification binaire mais aussi pouvoir faire des régression ou encore des classification multi-classes.
Formulation
Pour résumer, l’algorithme du gradient boosting a besoin de 3 éléments principaux :
Une fonction de perte à optimiser, qui doit être différentiable, qui permet de résoudre votre problème.
Un apprenant faible pour effectuer des prédictions. On peut ne plus utiliser uniquement des stumps mais des arbres un peu plus grands, de 4 à 8 niveaux (soyons fous).
Un modèle additif pour combiner nos apprenants faibles afin de minimiser notre fonction de perte. C’est à dire avancer dans notre fonction de perte en suivant le gradient, ce qui pourra être effectué en ajoutant un arbre de décision supplémentaire. On effectue cette procédure en paramétrant l’arbre, et ensuite en modifiant ces paramètres en allant dans la direction du gradient en diminuant la perte résiduelle que l’on a vue plus haut.
Contrôle du gradient boosting par les hyperparamètres
Le gradient boosting est un algorithme qui overfit relativement rapidement. On a donc besoin de méthodes de régularisation, qui pénalisent différentes parties de l’algorithme en permettant ainsi de réduire l’overfitting global.
Les différents paramètres qui permettent de limiter l’overfitting sont : le nombre d’arbres, la profondeur des arbres, le nombre d’observations utilisées par séparation d’un arbre, et le minimum d’amélioration apporté par chaque nouvelle séparation dans un arbre.
Fonctions de pertes
Maintenant qu’on peut utiliser n’importe quelle fonction de perte, un monde de possibilités s’offre à nous ! Reste à choisir celle qui correspond à notre problème. On présentera ici les plus courantes.
Utilisation du gradient boosting en classification
En classification, la première fonction de perte que l’on peut utiliser est celle originelle c’est à dire la perte exponentielle, qui permet en fait d'obtenir l'algorithme de l'AdaBoost. Cependant, dans un environnement instable/bruyant, on peut préférer utiliser la fonction appelée déviance binomiale , beaucoup moins sujet au variation du dataset. Ce sont les deux fonctions de pertes à utiliser pour une classification binaire.
Utilisation du gradient boosting en régression
En regression on peut utiliser la perte des moindres carrés classique ou bien la perte de norme 1 aussi classique
En pratique
En pratique, on utilisera la fonction de sklearn sklearn.ensemble.GradientBoostingClassifier
qui fonctionne de manière très similaire au forêts aléatoires pour la classification et sklearn.ensemble.GradientBoostingRegressor
pour la régression.
Les hyperparamètres à optimiser quand on travaille avec le gradient boosting sont learning_rate qui permet le shrinkage pour la régularisation et le nombre de classifieurs n_estimators qui détermine le nombre d'arbres à utiliser. Pour plus de détails sur l'utilisation de ce classifieur, rendez-vous sur ce petit guide de scikit-learn.
Conclusion
Le gradient boosting est généralement plus complexe à utiliser que les forêts aléatoires en raison du plus grand nombre d'hyperparamètres à gérer. Un second frein est le fait qu'en général il faut effectuer plus de feature engineering ce qui rend l'utilisation moins brute que les forêts aléatoires, qui, elles, fonctionnent mieux en plus grande dimension (> 4000 dimensions d'après cette étude empirique).