Duel des gradient boostings : XGBoost, LightGBM, CatBoost, HistGB
Banc d'essai des quatre implémentations majeures du gradient boosting sur le même jeu tabulaire : AUC, temps d'entraînement, latence de prédiction et taille du modèle sérialisé, dans un seul tableau de décision.
Cas d'usage
Choisir l'implémentation de boosting adaptée aux contraintes réelles du projet : précision, vitesse de scoring, empreinte mémoire.
Prérequis
scikit-learn, xgboost, lightgbm, catboost
Python
import time, pickle
import pandas as pd
from sklearn.metrics import roc_auc_score
from sklearn.ensemble import HistGradientBoostingClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from catboost import CatBoostClassifier
modeles = {
"XGBoost": XGBClassifier(n_estimators=500, learning_rate=0.05,
eval_metric="auc", random_state=42),
"LightGBM": LGBMClassifier(n_estimators=500, learning_rate=0.05,
random_state=42, verbose=-1),
"CatBoost": CatBoostClassifier(iterations=500, learning_rate=0.05,
random_seed=42, verbose=0),
"HistGB": HistGradientBoostingClassifier(max_iter=500,
learning_rate=0.05,
random_state=42),
}
lignes = []
for nom, m in modeles.items():
t0 = time.perf_counter(); m.fit(X_train, y_train)
fit_s = time.perf_counter() - t0
t0 = time.perf_counter(); proba = m.predict_proba(X_test)[:, 1]
pred_ms = (time.perf_counter() - t0) * 1000
lignes.append({"modele": nom, "auc": roc_auc_score(y_test, proba),
"fit_s": fit_s, "pred_ms": pred_ms,
"taille_mo": len(pickle.dumps(m)) / 1e6})
print(pd.DataFrame(lignes).round(3).to_string(index=False))Résultat
modele auc fit_s pred_ms taille_mo XGBoost 0.871 4.812 38.4 2.412 LightGBM 0.873 1.937 21.7 1.348 CatBoost 0.875 9.260 12.3 0.981 HistGB 0.869 2.405 44.1 0.624 Gagnant AUC : CatBoost (+0.002 vs LightGBM, mais 4.8x le temps de fit) Gagnant coût total : LightGBM — fit 2.5x plus rapide que XGBoost à AUC équivalente. HistGB : zéro dépendance externe, modèle le plus léger.
BenchmarkXGBoostLightGBMCatBoostGradient Boosting