XGBoost (Régression) : Guide Complet — Principes, Exemples et Implémentation Python

XGBoost (Régression) : Guide Complet — Principes, Exemples et Implémentation Python

XGBoost en régression sert à prédire une valeur numérique à partir d’exemples étiquetés : une durée, une consommation ou un montant. Ce guide explique le principe du modèle, propose un script complet et montre comment utiliser l’arrêt anticipé sans régler le modèle sur son test final.

Exemple exécuté le 14 septembre 2026 avec Python 3.12.14, XGBoost 3.4.1, scikit-learn 1.9.1 et NumPy 2.5.3. Les données et les résultats ci-dessous sont synthétiques.

Vous connaissez déjà les bases et souhaitez travailler sur un fichier ? Passez au projet CSV : prédire une durée de traitement avec XGBoost, avec données et script gratuits.

Comment XGBoost construit une prédiction

Avec le booster d’arbres utilisé ici, le modèle additionne les contributions de petits arbres successifs. Chaque nouvel arbre est construit à partir des dérivées de la perte par rapport aux prédictions actuelles. Pour l’erreur quadratique, l’intuition consiste à corriger progressivement les écarts entre les valeurs prédites et les valeurs observées.

Le taux d’apprentissage réduit la contribution de chaque nouvel arbre. La régularisation freine certaines formes de complexité, mais ne dispense pas de vérifier le résultat sur des observations séparées. La méthode hist regroupe les valeurs en intervalles pour rechercher les séparations des arbres.

Le choix doit rester lié au problème. Une moyenne constitue un premier repère ; une régression linéaire, un Random Forest ou un autre modèle d’arbres peuvent aussi convenir. Ce tutoriel ne compare pas leurs performances et ne désigne pas un gagnant universel.

Définir ce qui entre dans le modèle

X contient les variables disponibles au moment de la future prédiction ; y contient la valeur à apprendre. Pour estimer une durée avant une tâche, sa taille d’entrée peut appartenir à X. Sa durée finale appartient uniquement à y. Utiliser une mesure obtenue après la tâche donnerait une information indisponible au moment utile.

L’exemple emploie make_friedman1 : 2 000 observations artificielles, dix variables numériques et une relation non linéaire bruitée. Cette fonction permet un exercice reproductible sans téléchargement de données externes. Les valeurs cibles n’ont ici aucune unité métier.

Apprentissage, validation et test : trois rôles séparés

Ensemble Lignes Utilisation
Apprentissage 1 200 Ajuster les arbres et calculer la moyenne de référence.
Validation 400 Surveiller la RMSE et retenir le nombre d’arbres.
Test 400 Mesurer une fois le résultat final du protocole choisi.

On réserve d’abord 20 % au test, puis 25 % des 80 % restants à la validation : cela donne 60/20/20. Le tirage aléatoire convient à cet exercice d’observations indépendantes. Pour une prévision dans le temps ou plusieurs lignes du même client, la séparation doit tenir compte de la chronologie ou des groupes.

Installer et exécuter l’exemple complet

Dans un environnement Python dédié, installez les versions utilisées :

python -m pip install numpy==2.5.3 scikit-learn==1.9.1 xgboost==3.4.1

Enregistrez ce code dans exemple_xgboost.py, puis lancez python exemple_xgboost.py. Il fonctionne sur CPU ; aucun compte ni clé API n’est nécessaire.

"""Exemple complet, données synthétiques et test tenu à l'écart du réglage."""
import numpy as np
from sklearn.datasets import make_friedman1
from sklearn.dummy import DummyRegressor
from sklearn.metrics import mean_absolute_error, root_mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from xgboost import XGBRegressor

X, y = make_friedman1(n_samples=2000, n_features=10, noise=1.0, random_state=42)
indices = np.arange(len(y))
trainval, test = train_test_split(indices, test_size=0.2, random_state=42)
train, val = train_test_split(trainval, test_size=0.25, random_state=42)

baseline = DummyRegressor(strategy="mean").fit(X[train], y[train])
model = XGBRegressor(
    objective="reg:squarederror", n_estimators=1000, learning_rate=0.05,
    max_depth=3, subsample=0.9, colsample_bytree=0.9,
    reg_lambda=1.0, tree_method="hist", n_jobs=1, random_state=42,
    eval_metric="rmse", early_stopping_rounds=30,
)
model.fit(X[train], y[train], eval_set=[(X[val], y[val])], verbose=False)

print("Apprentissage / validation / test :", len(train), len(val), len(test))
for name, estimator in [("Moyenne", baseline), ("XGBoost", model)]:
    prediction = estimator.predict(X[test])
    print(f"{name} : MAE={mean_absolute_error(y[test], prediction):.3f} ; "
          f"RMSE={root_mean_squared_error(y[test], prediction):.3f} ; "
          f"R2={r2_score(y[test], prediction):.3f}")
print("Arbres retenus :", model.best_iteration + 1)

Sortie observée avec l’environnement indiqué :

Apprentissage / validation / test : 1200 400 400
Moyenne : MAE=4.014 ; RMSE=4.925 ; R2=-0.004
XGBoost : MAE=1.104 ; RMSE=1.372 ; R2=0.922
Arbres retenus : 481

La référence DummyRegressor prédit toujours la moyenne de y sur l’apprentissage. Sa RMSE vaut ici 4,925 ; celle de XGBoost vaut 1,372 sur les mêmes 400 observations de test. Ce résultat décrit cet exemple et ce découpage. Il ne prédit pas la performance sur vos fichiers.

Comprendre l’arrêt anticipé

Dans l’interface scikit-learn actuelle de XGBoost, early_stopping_rounds=30 se place dans le constructeur. fit reçoit la validation via eval_set. Ici, l’entraînement s’arrête après 30 itérations sans amélioration de sa RMSE, ou lorsqu’il atteint le plafond de 1 000 arbres.

best_iteration commence à zéro. Le résultat 480 désigne donc 481 arbres retenus. XGBRegressor.predict utilise automatiquement cette meilleure itération ; des arbres supplémentaires peuvent rester dans le modèle entraîné. Un appel à fit avec seulement eval_set, sans paramètre ou callback d’arrêt, ne déclenche pas à lui seul un arrêt anticipé.

Courbe de RMSE de validation de l’exemple synthétique, minimum à 481 arbres.
Courbe calculée avec le script : la validation choisit l’itération. Le test n’intervient pas dans cette courbe.

Le minimum de cette courbe ne signifie pas « nombre optimal d’arbres pour tout problème ». Si vous testez plusieurs configurations, choisissez-les sur la validation ou un protocole de validation croisée approprié. Réutiliser le test pour choisir les paramètres lui fait perdre son rôle de contrôle final.

Les paramètres à comprendre en premier

La référence officielle des paramètres précise leur portée :

Paramètre Rôle dans ce modèle
n_estimators Plafond du nombre d’arbres ajoutés ; l’arrêt anticipé peut arrêter avant.
learning_rate Réduit la contribution de chaque arbre. Une valeur faible demande souvent davantage d’itérations.
max_depth Profondeur maximale des arbres ; une profondeur élevée augmente leur capacité.
min_child_weight Somme minimale des Hessiennes dans un enfant ; ce n’est pas une règle générale de nombre minimal de lignes.
gamma Réduction minimale de perte exigée pour une séparation supplémentaire.
subsample / colsample_bytree Fractions de lignes et de variables échantillonnées pendant l’apprentissage.
reg_alpha / reg_lambda Pénalités L1 et L2 sur les poids des feuilles.

Commencez avec une configuration lisible et un objectif mesurable. Sur une tâche de durée, décidez par exemple quelle erreur en secondes reste acceptable. Ajouter une recherche de paramètres avant de vérifier les données et le découpage peut améliorer un score trompeur.

Lire MAE, RMSE et R² sans les confondre

La MAE est la moyenne des erreurs absolues. La RMSE applique une racine après la moyenne des erreurs au carré : les grandes erreurs y pèsent davantage. Ces deux mesures conservent l’unité de la cible. Une RMSE de 1,372 n’est donc pas « 98,6 % de précision ».

R² compare l’erreur quadratique à celle d’une prédiction constante égale à la moyenne du jeu évalué. Il peut être négatif. La moyenne apprise sur l’apprentissage et la moyenne du test n’étant pas nécessairement identiques, notre référence obtient un R² légèrement négatif. Même un bon score global peut cacher de fortes erreurs dans un sous-groupe ; examinez aussi les résidus et les cas où une erreur coûte cher.

Questions fréquentes avant d’utiliser ses propres données

Faut-il standardiser toutes les colonnes ?

Ce modèle d’arbres n’exige pas de mettre systématiquement les variables à la même échelle. Cela ne dispense pas de contrôler les unités, les valeurs impossibles et la présence de données futures dans les entrées. Les transformations apprises, si vous en ajoutez, doivent être ajustées sur l’apprentissage seulement.

XGBoost accepte-t-il les catégories ?

Oui, les versions actuelles offrent une prise en charge des variables catégorielles, notamment avec des colonnes typées category, enable_categorical=True et une méthode compatible comme hist. Le script de ce guide utilise uniquement des nombres. Passer des chaînes quelconques dans un tableau NumPy ne remplace pas la préparation des catégories.

Et les cellules manquantes ?

Le booster d’arbres peut apprendre une direction pour les valeurs manquantes des variables. Cela ne fournit pas une cible manquante et ne répare pas une erreur de collecte. Documentez ce que signifie une absence et vérifiez le comportement sur les nouvelles observations.

Peut-on prévoir des valeurs très éloignées de l’apprentissage ?

Des arbres ne prolongent pas spontanément une tendance comme une droite. Un résultat satisfaisant entre les valeurs observées ne valide pas une extrapolation loin de ces valeurs. Vérifiez la couverture de vos données avant de présenter une prédiction comme exploitable.

Passer du guide à un projet reproductible

Le projet CSV de prédiction des durées ajoute un schéma de fichier, des identifiants conservés, une comparaison de référence et un export des prédictions de test. Télécharger les fichiers gratuits du projet (ZIP).

Si vous cherchez plutôt des lignes inhabituelles sans durée à apprendre, consultez le projet CSV avec Isolation Forest. Pour consolider les prérequis, notre page de ressources Python et de livres par niveau propose un parcours complémentaire.