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. Entraîner efficacement un modèle
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

Entraîner efficacement un modèle

Entraîner efficacement

La théorie, les fondements mathématiques et une implémentation des méthodes de Gradient Boosting ayant été présentés dans le précédent chapitre, il est temps de passer à la pratique. Pour cela, nous allons décrire dans ce chapitre les conditions à respecter pour assurer un entraînement efficace, permettant de produire des modèles précis et généralisant correctement. 

Après un aperçu des grandes étapes de l’entraînement d’un modèle, une seconde section traitera en détail de la préparation des données, de leur nettoyage et enrichissement, puis de la construction des datasets d’entraînement puis d’évaluation.

La troisième section présentera rapidement les principes de l’entraînement en lui-même, tandis que la quatrième plongera dans le détail des différentes métriques utilisées pour évaluer la qualité d’un modèle de régression ou de classification.

La cinquième section traitera du problème du sur-apprentissage, de sa détection et des leviers qu’offrent les méthodes de Gradient Boosting pour l’éviter.

Enfin, quelques cas pratiques issus de données...

Préparation des données

La pièce maîtresse, lors de l’entraînement d’un modèle, représente les données. Peu importe la complexité ou la sophistication d’un modèle, si les données à disposition ne sont pas représentatives du problème, pas assez riches ou assez nombreuses, alors la qualité de la prédiction ne sera pas satisfaisante.

Comme l’a mis en évidence le schéma ci-dessus, cette phase doit se faire de manière préalable à la construction des datasets d’entraînement et d’évaluation, en veillant toutefois à ne pas contaminer le dataset d’évaluation en faisant fuiter des données de l’un à l’autre.

1. Enrichissement des données

La richesse d’un corpus de données tient en la présence de nombreuses caractéristiques, ou features en anglais, qui offrent une vision selon plusieurs angles du problème.

Dans le contexte d’analyses socio-économiques, plus la population étudiée est qualifiée, et ce à travers de nombreux indicateurs, plus les modèles construits seront précis. Revenus, mode de vie, alimentation, niveau d’éducation, loisirs, temps de sommeil, taille de la famille, liens avec les ascendants et descendants, patrimoine... toute information mérite d’être collectée.

Dans cet exemple, les données enrichissant le corpus sont externes. Il s’agit donc de données exogènes.

Une autre voie est à envisager pour enrichir un ensemble de données : l’augmentation à partir de données endogènes.

Ce sont des caractéristiques additionnelles construites non pas en se tournant vers l’extérieur, mais au contraire en restant dans les données existantes et en les retravaillant.

L’exemple des séries temporelles est parlant. Le signal brut qui les constitue est généralement issu de l’échantillonnage à une fréquence donnée des mesures d’un capteur. Ce type de signal contient intrinsèquement beaucoup d’informations, mais qu’il faut extraire. De nombreux traitements peuvent être appliqués comme une transformée...

Entraînement

À l’issue des phases de prétraitement des données et de la constitution du dataset d’entraînement s’ajoute la phase d’entraînement en elle-même.

1. Choix des hyperparamètres

La difficulté majeure à cette étape est d’identifier les hyperparamètres optimaux pour le problème considéré. Le chapitre Hyperparameters Tuning reviendra en détail sur cette étape cruciale.

2. Choix de l’objectif

Le chapitre Gradient Boosted Tree : fonctionnement l’a montré : toute la méthode de Gradient Boosting s’appuie sur une fonction objectif. De l’identification des critères de décision pour chaque nœud à la valeur des poids des feuilles, tout découle de cette fonction à travers son gradient et sa hessienne.

Choisir la bonne fonction objectif est donc absolument crucial, à commencer par en choisir une adaptée au cas d’usage : régression ou classification.

Dans le cas de la régression, le choix de la fonction objectif, ou loss function suivant l’implémentation, se réduit souvent à l’erreur au carré, soit la squared_error

Les fonctions objectifs s’appuyant sur l’erreur au carré ont des propriétés intéressantes, comme...

Métriques à considérer

Une fois le modèle entraîné, il va falloir juger de la qualité du modèle généré. Pour cela, il faut calculer des métriques qui vont quantifier la qualité de la prédiction réalisée en regard des valeurs réelles.

Attention, il est important de bien distinguer métriques, utilisées pour l’évaluation, et fonctions objectifs, utilisées lors de l’entraînement. Elles n’ont pas le même rôle ni les mêmes propriétés mathématiques.

Ces métriques sont calculées à deux moments : lors de l’entraînement, idéalement en utilisant la méthode de cross-validation sur laquelle nous reviendrons plus loin, et lors de l’évaluation.

1. Rôle des métriques

Cette section présente les métriques les plus couramment employées pour estimer la valeur d’un modèle. Il ne faut pas perdre de vue qu’il est indispensable de ne pas se cantonner à une seule métrique mais au contraire d’en considérer plusieurs pour avoir une vue objective de la qualité du modèle.

Les métriques, tout comme les fonctions objectifs, s’appuient sur l’erreur pour leurs calculs ; effectivement, c’est bien l’erreur, c’est-à-dire la différence entre la réalité et les valeurs prédites, qui permet de jauger la qualité d’un modèle, et ce aussi bien pour la régression que pour la classification.

Les métriques sont un moyen d’agréger ces erreurs, de manière à se faire une opinion globale sur les performances, sans avoir à les considérer ligne par ligne.

2. Périmètre de calcul des métriques

Il est important de comprendre que ces métriques peuvent être calculées aussi bien sur le dataset d’entraînement que sur celui d’évaluation. Ces métriques évaluées sur ces deux périmètres doivent être analysées conjointement. En particulier, la qualité d’un modèle ne peut pas être jugée au seul regard des métriques sur le dataset...

Le piège du sur-apprentissage

1. Description

Les modèles basés sur les arbres de décision sont très puissants. Pour peu qu’ils aient toute latitude pour se développer, c’est-à-dire qu’ils ne soient pas contraints sur leur nombre et leur profondeur, alors ils peuvent se conformer précisément au dataset de données sur lequel ils sont entraînés.

Dans ce cas, ils peuvent générer des prédictions exactes pour chaque ligne du dataset d’entraînement. Toutes les métriques qui ont été balayées plus haut, essentiellement basées sur l’erreur, seront donc très bonnes, voire idéales. Le modèle aura sur-appris.

Un Data Scientist non aguerri se réjouirait de ces résultats et de l’excellence de son modèle. C’est malheureusement la conclusion inverse qui s’impose : le modèle est sur-appris et ne délivrera pas de bons résultats lorsque lui seront présentées des données n’appartenant pas au dataset d’entraînement.

Sa capacité à généraliser sur des données inconnues sera limitée et l’intérêt du modèle aussi.

2. Détection

Si la démarche globale présentée en introduction de ce chapitre a été suivie, identifier un cas de sur-apprentissage est aisé. Les métriques obtenues lors de l’entraînement, même en utilisant la cross-validation, seront très bonnes. À l’opposé, ces dernières seront mauvaises sur le dataset d’évaluation.

Le code ci-dessous montre un cas de sur-apprentissage sur un ensemble de données artificiel, créé par la méthode make_classification :

# ch3_overfit.py 
import numpy as np 
from sklearn.datasets import make_classification 
from sklearn.model_selection import train_test_split 
 
 
from xgboost import XGBClassifier 
import matplotlib.pyplot as plt 
 
X, y = make_classification(n_samples=100, 
                           n_informative=5, 
                           n_classes=3, ...

Application (digits dataset)

Pour illustrer la versatilité des méthodes de Gradient Boosting, la classification réalisée dans cette section va être faite sur des images. Le dataset digits, aisément récupérable depuis la librairie sklearn, contient 1797 chiffres manuscrits, de 0 à 9.

Pour changer des exemples précédents, LightGBM, la troisième grande implémentation du Gradient Boosting, va être utilisée. Elle a été réalisée par Microsoft.

1. Configuration par défaut

Les images sont dans un premier temps redimensionnées pour en faire des vecteurs ingérables par LightGBM. À cette fin, la méthode reshape est utilisée. 

La méthode train_test_split est invoquée afin de construire automatiquement un dataset d’entraînement et un dataset de test. Le random_state a été fixé à 42, afin d’assurer la reproductibilité des résultats.

De manière générale, lors de la mise au point d’algorithmes de Machine Learning utilisés en production, il ne faut pas fixer les états aléatoires. Garder la variabilité introduite par ce recours au hasard est garantie de robustesse.

L’apprentissage est ensuite lancé avec la configuration par défaut du LGBMClassifier :

# ch3_classification.py 
from sklearn import datasets 
import matplotlib.pyplot as plt 
from lightgbm import LGBMClassifier 
from sklearn.model_selection import train_test_split 
from sklearn.metrics import accuracy_score, confusion_matrix 
 
digits = datasets.load_digits() 
images = digits.images 
targets = digits.target 
 
images=images.reshape(1797,8*8) 
 
X_train, X_test, y_train, y_test = train_test_split(images,  
targets, test_size=0.3, random_state=42) 
 
model = LGBMClassifier(objective='multiclass') 
model.fit(X_train, y_train) 
print(model.best_iteration_) 
 
y_pred=model.predict(X_test) 
accuracy = accuracy_score(y_test, y_pred) 
 
print("Accuracy: %.2f%%" % (accuracy * 100.0)) 
# -> 97.78% 
confusion = confusion_matrix(y_test, y_pred) 
print('Confusion Matrix\n') 
print(confusion) 
# Confusion Matrix ...