Calculer des intervalles de confiance avec XGBoost

by Guillaume Saupin

#XGBoost #Tech

Guillaume Saupin, CTO chez Verteego nous propose de découvrir comment étendre les possibilités du célèbre algorithme XGBoost grâce à de nouvelles fonctions objectif. Ces dernières permettent le calcul d'intervalles de confiance, qui constituent un moyen pour les spécialistes de la data d'améliorer la prévision des ventes dans le retail.

  1. Pourquoi ai-je besoin d'un objectif personnalisé ?
  2. Pouvez-vous nous donner un exemple ?
  3. Comment calculer les intervalles de confiance ?
  4. L'objectif logcosh.
  5. Rotation et mise à l'échelle du logcosh
  6. Essayons-le sur un exemple réel
  7. Conclusion

Les méthodes de Gradient Boosting sont un outil très puissant permettant d’effectuer rapidement des prévisions précises, sur de grands ensembles de données, pour des variables complexes qui dépendent de façon non linéaire de nombreuses caractéristiques.

De plus, elles ont été mises en œuvre de différentes manières : XGBoost, CatBoost, GradientBoostingRegressor, chacun ayant ses propres avantages, discutés ici ou ici. Un point commun à toutes ces implémentations est la possibilité de choisir un objectif de formation donné à minimiser. Plus fort encore, XGBoost et CatBoost offrent la possibilité d’utiliser n’importe quelle fonction d'objectif personnalisé.

Pourquoi ai-je besoin d'un objectif personnalisé ?

La plupart des implémentations fournissent des fonctions d'objectifs standard, comme Least Square, Least Deviation, Huber, RMSE, ... mais parfois, le problème sur lequel vous travaillez nécessite une solution plus spécifique pour atteindre le niveau de précision attendu. L'utilisation d'un objectif personnalisé est généralement une option élégante pour adapter les modèles à une problématique métier.

Pouvez-vous nous donner un exemple ?

Bien sûr ! Nous avons cherché récemment, un moyen d'associer la prédiction d'un de nos modèles à des intervalles de confiance. Pour rappel, les intervalles de confiance sont caractérisés par deux éléments :

  1. Un intervalle [x_l, x_u]
  2. Le niveau de confiance, qui précise que x% du temps, les valeurs que l’on cherche à prédire se situent dans cet intervalle

Par exemple, nous pouvons dire que l'intervalle de confiance à 99% de la température moyenne sur terre est de [-80, 60]. L'association des intervalles de confiance aux prévisions nous permet de quantifier le niveau de confiance dans une prévision.

Comment calculer les intervalles de confiance ?

Vous devrez construire deux modèles :

  • Un pour la limite supérieure de votre intervalle
  • Un pour la limite inférieure de votre intervalle

Et devinez quoi ? Pour y parvenir, vous avez besoin de métriques spécifiques : les objectifs de régression par quantile. Les implémentations Scikit-learn GradientBoostingRegressor et CatBoost fournissent toutes deux un moyen de calculer ces objectifs, en utilisant les fonctions objectives de régression Quantile, mais toutes deux utilisent la définition standard non lisse de cette régression :

The standard formula for computing quantil regression

La formule standard de calcul de la régression par quantile où t_i est la ième valeur vraie et a_i la ième valeur prédite. w_i sont des poids optionnels utilisés pour pondérer l'erreur. alpha définit le quantile.

Par exemple, en utilisant cette fonction objective, si vous fixez l'alpha à 0,95, 95% des observations sont inférieures à la valeur prédite. Inversement, si vous fixez l'alpha à 0,05, seulement 5 % des observations sont inférieures à la prédiction. Et 90 % des valeurs réelles se situent entre ces deux prédictions.

Représentons la situation en utilisant le code suivant, pour la plage [-10, 10] et divers alphas :

Comme vous pouvez le voir dans le graphique ci-dessous, cette fonction objective est continue, mais sa dérivée ne l'est pas. Il y a une singularité en (0, 0), c'est-à-dire qu'il s'agit d'une fonction C_0, par rapport à l'erreur, mais pas d'une fonction C_1. C'est un problème, car les méthodes de gradient boosting requièrent une fonction objective de classe C_2, c'est-à-dire qui peut être différenciée deux fois pour calculer les matrices Jacobiennes et Hessiennes

.

Quantile regression objective function for various alpha.

Si vous connaissez l'objectif MAE (Mean Absolute Error) , vous devez avoir reconnu que ces fonctions de régression quantile sont simplement la MAE, mis à l'échelle et tourné. Si ce n'est pas le cas, la capture d'écran ci-dessous devrait vous convaincre :

Image for post

L'objectif logcosh.

Pour rappel, la formule de l'objectif de la MAE est simplement :

Image for post

Formule objective de la MAE.

La figure ci-dessus montre également une version régularisée de la MAE, l'objectif logcosh. Comme vous pouvez le voir, cet objectif est très proche de la MAE, mais il est lisse, c'est-à-dire que sa dérivée est continue et différentiable. Il peut donc être utilisé comme objectif dans toute méthode de gradient boosting, et fournit un taux de convergence raisonnable par rapport aux objectifs par défaut, non différentiables.

Et comme il s'agit d'une approximation très proche de la MAE, si nous parvenons à changer cette dernière d’échelle et à la faire tourner, nous obtiendrons une approximation deux fois différentiables de la fonction objectif de type régression par quantile. Vous avez peut-être remarqué qu'il y a un léger décalage entre la courbe de la MAE et le log cosh. Nous allons expliquer cela en détails un peu plus loin.

La formule de la logcosh est simple :

Image for post

Formule de la logcosh objective

Rotation et mise à l'échelle du logcosh

Tout ce qu'il nous reste à faire maintenant est de trouver un moyen de faire tourner et de changer d’échelle cet objectif de manière à ce qu'il devienne une bonne approximation de l'objectif de régression par quantile. Rien de complexe ici. Comme la logcosh est similaire au MAE, nous appliquons le même type de changement que pour la régression par quantile, c'est-à-dire que nous le multiplions par alpha :

Image for post

Régression de Quantile lisse en utilisant le logcosh

Cela peut être fait avec ces douze lignes de code :

Et cela fonctionne, comme indiqué ci-dessous :

Image for post

Mais attendez un peu !

Vous êtes peut-être curieux de savoir pourquoi la combinaison de deux fonctions non linéaires comme le logarithme et le cosh donne une courbe aussi simple et presque linéaire.

La réponse se trouve dans la formule de cosh :

Image for post

Formule de cosh

Lorsque x est positif et suffisamment grand, le cosh peut être approché par

Image for post

Approximation de cosh lorsque x >> 0

Inversement, lorsque x est suffisamment négatif, le cosh peut être approché par

Image for post

Approximation de cosh lorsque x << 0

Nous commençons à comprendre comment la combinaison de ces deux formules conduit à des résultats aussi linéaires. En effet, en appliquant le logarithme à ces approximations de cosh, nous obtenons :

Image for post

simplification de la logcosh pour x >> 0

pour x >>0. Il en va de même pour x << 0 :

Image for post

Il est maintenant clair que ces deux fonctions se rapprochent beaucoup de la MAE. Nous obtenons également comme avantage secondaire l'explication du léger écart entre la MAE et le logcosh. C'est log(2) !

Essayons-le sur un exemple réel

Il est maintenant temps de s'assurer que tous les calculs théoriques que nous effectuons ci-dessus fonctionnent dans la vie réelle. Nous n’évaluerons pas notre méthode sur un simple sinus, comme le propose le scikit ici ;) . Nous allons plutôt utiliser des données du monde réel, extraites des données d'enregistrement des trajets du TLC, qui contient plus d'un milliard de trajets en taxi.

L'extrait de code ci-dessous met en œuvre l'idée présentée ci-dessus. Il définit l'objectif de régression logcosh quantile log_cosh_quantile, qui calcule les matrices Jacobienne et Hessienne. Celles-ci sont nécessaires pour minimiser l'objectif.

Comme indiqué au début de cet article, nous devons entraîner deux modèles, un pour la limite supérieure et un autre pour la limite inférieure.

La partie restante du code se contente de charger les données et d'effectuer un nettoyage minimal des données, en éliminant principalement les valeurs aberrantes.

Dans ce code, nous avons choisi de calculer l'intervalle de confiance à 90 %. Nous utilisons donc alpha=0,95 pour la limite supérieure, et alpha=0,05 pour la limite inférieure.

Le réglage des hyperparamètres a été effectué manuellement, en utilisant des valeurs assez standard. Il pourrait certainement être amélioré, mais les résultats sont suffisamment bons pour illustrer cet article.

Les dernières lignes du script sont consacrées au tracé des 150 premières prédictions de l'ensemble de tests construits de façon aléatoire avec leur intervalle de confiance :

Image for post

Notez que nous avons également inclus à la fin du scénario un compteur pour évaluer le nombre de valeurs réelles dont l'intervalle de confiance est juste. Sur notre jeu de test, 22 238 sur 24 889 (89,3 %) des valeurs réelles se trouvaient dans l'intervalle de confiance calculé.

Le modèle a été entraîné sur les 100 000 premières lignes de l'ensemble de données de janvier 2020 des données des enregistrements de trajets du TLC.

Conclusion

Avec des mathématiques simples, nous avons pu définir une fonction objectif de régression par quantile lisse, qui peut être connectée à n'importe quel algorithme d'apprentissage machine basé sur l'optimisation d’objectif.

Grâce à ces fonctions régularisées, nous avons pu prévoir des intervalles de confiance fiables pour notre prédiction.

Cette méthode a l'avantage, par rapport à celle présentée ici, d'être sans paramètres. La régularisation des hyperparamètres est déjà une étape exigeante dans l'optimisation des modèles ML, nous n'avons pas besoin d'augmenter la taille de l'espace de configuration avec un autre paramètre ;)

---

Article publié le 9 septembre 2020 dans la revue Towards Data Science

Merci à Elisabeth Guegan, Elliot Gunn et Nicolas David

Être informé(e) des dernières actualités

Recevez nos dernières news directement dans votre boîte mail