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é.

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.

