Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Gradient Boosting
  3. Du bon usage des fonctions objectifs
Extrait - Gradient Boosting Exploitez les arbres de décision pour le Machine Learning (XGBoost, CatBoost, LightGBM)
Extraits du livre
Gradient Boosting Exploitez les arbres de décision pour le Machine Learning (XGBoost, CatBoost, LightGBM) Revenir à la page d'achat du livre

Du bon usage des fonctions objectifs

Raison d’être des fonctions objectifs

Les fonctions objectifs sont centrales dans la construction des arbres de décision avec la méthode du Gradient Boosting.

En effet, comme l’a montré le chapitre Gradient Boosted Tree : fonctionnement, toute la méthode du Gradient Boosting est basée sur les fonctions objectifs. 

Le choix de la feature retenue lors de la construction d’un nœud se fait par le biais du gain, dont le calcul dérive de la fonction objectif à travers son gradient et sa hessienne. Sa valeur se calcule en faisant la différence entre l’objectif courant d’un node et les objectifs atteints par l’ajout de deux nouveaux nœuds. La formule utilisée est la suivante :

images/06EP01.png

Le rôle de la fonction objectif est donc primordial pour la constitution d’une collection d’arbres de décision.

Dans le même esprit, l’objectif est l‘acteur essentiel de la prédiction en elle-même, puisque c’est lui qui définit la valeur des poids associés à chaque feuille. Pour rappel, la formule qui permet de les calculer est la suivante :

images/06EP02.png

Là encore, la fonction objectif est impliquée à travers son gradient et sa hessienne. Maîtriser les fonctions objectifs est indispensable, et l’objet de ce chapitre est justement de se familiariser en profondeur...

Importance des fonctions objectifs

Utiliser telle ou telle fonction objectif n’est pas neutre sur les performances d’un modèle.

Bien sûr, quelle que soit la fonction objectif choisie, la méthode de Gradient Boosting sera capable de générer un modèle. Les performances de ce modèle seront bien optimales pour les hyperparamètres choisis et cet objectif.

Cependant, rien ne garantit que l’objectif choisi soit pertinent par rapport au besoin métier. Le modèle généré est donc optimal d’un point de vue de la théorie mathématique, mais peut fort bien ne pas être pertinent pour le problème considéré.

Jouer sur le choix de la fonction objectif est donc essentiel pour rapprocher au mieux le monde mathématique du monde réel.

Il est important de rappeler ici la distinction à faire entre la fonction objectif et les métriques d’évaluation. Les métriques d’évaluation, MAE, MAPE, MSE… proposent une vue métier sur les performances du modèle, mais peuvent rarement être utilisées comme fonction objectif. En effet, les fonctions objectifs doivent être deux fois dérivables.

Objectifs usuels

Les trois principales librairies de Gradient Boosting, XGBoost, CatBoost et LightGBM offrent toutes trois une petite dizaine de possibilités comme choix de fonction objectif.

Suivant les implémentations, la fonction objectif peut être nommée fonction de perte, ou loss function en anglais.

Les sections qui suivent vont présenter les plus employées, selon le cas d’usage : régression ou classification.

1. Classification

La classification nécessite des fonctions objectifs spécifiques, en raison de la nature discrète des prédictions. Contrairement à la régression, les valeurs possibles en sortie ne forment pas un continuum, mais un ensemble discret.

Cette particularité doit être prise en compte dans les fonctions objectifs, notamment en ce qui concerne la double dérivabilité qui est nécessaire pour le Gradient Boosting.

a. Fonction logistique

L’objectif basé sur la fonction logistique est utilisé pour les classifications binaires. La fonction logistique s’appuie en réalité sur deux fonctions : la sigmoid et la log loss.

La sigmoid est utilisée pour « binariser » la sortie de la prédiction. Appliquée à la prédiction brute, elle lui donne la forme suivante :

images/06EP03.png

Elle s’assure donc que, en dehors de la zone de transition, les valeurs en sortie sont bien 0 ou 1.

Elle est définie par cette formule : images/06EP04.png

La classification étant binaire et la sigmoïde...

Objectifs régularisés

Cette stratégie visant à rendre dérivable une fonction qui ne l’est pas s’appelle une régularisation. Le principe est de trouver une formule qui permet de calculer de manière quasi exacte le résultat d’une fonction non régulière.

Les deux fonctions suivantes sont un exemple de ce qui peut être fait pour la fonction erreur absolue, qui revient régulièrement comme objectif.

1. Logcosh

Dans un premier temps, il est intéressant de construire une approximation de l’erreur absolue. La Pseudo Huber Loss vue ci-dessus est une possibilité, mais comme le montre son tracé, elle s’écarte un peu du tracé de l’erreur absolue.

Pour obtenir une meilleure approximation, il est possible d’utiliser la formule suivante, basée sur la combinaison du logarithme et du cosinus hyperbolique : images/06EP17a.png

Son tracé est donné par la courbe suivante :

images/06EP11.png

Son implémentation en Python est triviale :

import math 
 
def logcosh(err): 
    loss = math.log(math.cosh(err)) 
    return loss 
Pour bien comprendre pourquoi cette formule donne une bonne approximation de l’erreur absolue, il est très éclairant de rentrer dans le détail de la formule du cosinus hyperbolique : images/06EP12.png
Lorsque x est suffisamment...

Objectifs personnalisés

Ces différentes fonctions n’étant pas fournies par défaut par les implémentations courantes du Gradient Boosting pour les arbres de décision, cette section va montrer comment elles peuvent être intégrées. En particulier, le cas de XGBoost va être approfondi.

Cette section montrera aussi un usage astucieux des fonctions quantiles pour prédire des intervalles de confiance.

1. XGBoost et régression par quantile

L’implémentation de XGBoost avec l’interface de type scikit-learn offre la possibilité de définir des objectifs custom. Pour cela, il suffit de passer au constructeur du modèle XGBoost une fonction prenant en entrée les valeurs réelles et celles prédites et produisant en retour le gradient et la hessienne de la fonction considérée.

Les lignes suivantes illustrent cela pour la fonction quantile vue ci-dessus :

import pandas as pd 
import numpy as np 
from xgboost.sklearn import XGBRegressor 
from sklearn.model_selection import ShuffleSplit 
import matplotlib.pyplot as plt 
 
 
# La fonction log cosh quantile est une version régularisée de la  
# fonction de régression quantile 
def log_cosh_quantile(alpha): 
    def _log_cosh_quantile(y_true, y_pred): 
        err = y_pred - y_true 
        err = np.where(err < 0, alpha * err, (1 - alpha) * err) 
        grad = np.tanh(err) 
        hess = 1 / np.cosh(err)**2 
        return grad, hess 
    return _log_cosh_quantile 

Ici, afin de ne pas avoir à écrire une fonction log_cosh pour chaque valeur possible de alpha, une fonction de plus haut niveau, log_cosh_quantile retourne une fermeture vers une fonction dans laquelle alpha est capturée.

Doté de cette fonction, il suffit de s’en servir pour alimenter XGBoost, qui l’utilisera pour...