ML Learning Hub
Méthodes d'Ensembleintermédiaire

Gradient Boosting : XGBoost, LightGBM, CatBoost

De petites corrections cumulées valent mieux qu'une grande supposition — poursuivre les résidus séquentiellement

Du Gradient Boosting vanilla à XGBoost (Tree Score = SSR + λT), LightGBM (histogram, leaf-wise) et CatBoost (ordered boosting).

60 min
18 diagrammes
6 Concepts Couverts

Prérequis

Decision Trees
Calculus & Optimization

Concepts Couverts

ResidualsTree Score (SSR+λT)Histogram BinningLeaf-wise GrowthOrdered BoostingOptuna HPO

Formules Clés

Ensemble de Boosting

Prédiction finale = somme de M apprenants faibles, chacun pondéré par γ — chaque arbre corrige les erreurs des précédents

Pseudo-Résidus

Gradient négatif de la perte — ce que le prochain arbre doit apprendre pour réduire l'erreur

Score d'Arbre XGBoost

Gain d'une division (G = somme des dérivées premières, H = somme des dérivées secondes) — maximiser ce score choisit le meilleur split

Gain de Division

Amélioration de l'objectif en divisant une feuille en deux — utilisé pour l'élagage et le critère d'arrêt

Simulation Interactive

Loading visualization…
Loading visualization…

Architecture du Modèle

Loading visualization…
Loading visualization…
Loading visualization…
Loading visualization…
🎯

Pourquoi le Gradient Boosting Domine les Données Tabulaires

motivation

Depuis 2014, les méthodes de gradient boosting (XGBoost, LightGBM, CatBoost) ont remporté la majorité des compétitions Kaggle sur les données structurées. Ce sont les meilleurs algorithmes pour le ML tabulaire : ils gèrent les types mixtes nativement, ne nécessitent pas de mise à l'échelle, capturent les interactions non linéaires complexes, et viennent avec une régularisation intégrée.

💡

L'Idée Centrale : Ajuster les Erreurs

intuition

Supposez que votre modèle actuel prédit les prix des maisons et se trompe de 50k€ sur la maison A. Au lieu de ré-entraîner depuis zéro, entraînez un nouvel arbre pour prédire exactement cette erreur de 50k€. Ajoutez-le à votre modèle. Maintenant vous vous trompez moins. Répétez. Chaque nouvel arbre cible les erreurs résiduelles de tous les arbres précédents combinés.

Le 'gradient' dans le gradient boosting se réfère à la descente de gradient fonctionnel, pas à la descente de gradient paramétrique. Nous optimisons dans l'espace des fonctions, pas des poids.

Gradient Boosting comme Descente de Gradient dans l'Espace Fonctionnel

math

À l'étape m, nous ajustons un arbre hₘ au gradient négatif de la perte par rapport à la prédiction actuelle F_{m-1}(x). Pour la perte ECM L = ½(y − F(x))², le gradient négatif est exactement le résidu r = y − F(x). Pour d'autres pertes (log loss, MAE), nous obtenons différents 'pseudo-résidus' — d'où la généralité du cadre.

Règle de mise à jour (ν = rétrécissement / taux d'apprentissage)
🔬

XGBoost : Optimisation du Second Ordre

deepdive

Le GBM original de Friedman n'utilise que des gradients de premier ordre (résidus). XGBoost utilise à la fois le premier (G) et le second (H) ordre du développement de Taylor de la perte, lui donnant de meilleures informations sur la courbure — comme la méthode de Newton vs la descente de gradient.

Objectif régularisé XGBoost (développé de Taylor)
⚖️

XGBoost vs LightGBM vs CatBoost

comparison

Three major frameworks, each with distinct architectural innovations:

1

XGBoost : Croissance en largeur + optimisation de second ordre. Plus lent mais mature. Meilleur pour les petits/moyens jeux de données.

2

LightGBM : Croissance feuille par feuille + histogrammes. 10–20× plus rapide à l'entraînement. Meilleur pour les grands jeux de données.

3

CatBoost : Boosting ordonné pour éviter les fuites de cibles. Gestion native des catégorielles. Meilleur avec beaucoup de caractéristiques catégorielles.

4

Règle empirique : Commencez avec LightGBM. Utilisez CatBoost avec beaucoup de catégorielles. XGBoost pour les petits jeux où la vitesse ne compte pas.

⚙️

Croissance Feuille par Feuille de LightGBM

algorithm
1

Initialiser F₀(x) = log(p/(1-p)) pour la classification binaire

2

Pour m = 1 à M :

Calculer les pseudo-résidus rᵢ = -∂L/∂F(xᵢ)|_{F=F_{m-1}}

Trouver la meilleure feuille à diviser (globalement, pas niveau par niveau)

Calculer les valeurs des feuilles : γⱼ = ΣᵢGᵢ / (ΣᵢHᵢ + λ)

Mise à jour : F_m(x) = F_{m-1}(x) + ν · γ_{feuille(x)}

Ajouter un arrêt anticipé si la perte de validation cesse de s'améliorer

</>

LightGBM en Production avec Optuna

code
python37 lines
import lightgbm as lgb
import optuna
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

class="tok-comment"># ── Données dclass="tok-str">'exemple ──────────────────────────────────────────────────
X, y = make_classification(n_samples=class="tok-num">1000, n_features=class="tok-num">20,
                            n_informative=class="tok-num">10, random_state=class="tok-num">42)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=class="tok-num">0.2, random_state=class="tok-num">42)
dtrain = lgb.Dataset(X_train, label=y_train)

def objectif(trial):
    params = {
        'objectiveclass="tok-str">': 'binaryclass="tok-str">',
        'metricclass="tok-str">': 'aucclass="tok-str">',
        'learning_rateclass="tok-str">': trial.suggest_float('lrclass="tok-str">', class="tok-num">0.01, class="tok-num">0.3, log=True),
        'num_leavesclass="tok-str">': trial.suggest_int('num_leavesclass="tok-str">', class="tok-num">20, class="tok-num">300),
        'max_depthclass="tok-str">': trial.suggest_int('max_depthclass="tok-str">', class="tok-num">3, class="tok-num">12),
        'min_data_in_leafclass="tok-str">': trial.suggest_int('min_childclass="tok-str">', class="tok-num">10, class="tok-num">100),
        'feature_fractionclass="tok-str">': trial.suggest_float('feat_fracclass="tok-str">', class="tok-num">0.4, class="tok-num">1.0),
        'bagging_fractionclass="tok-str">': trial.suggest_float('bag_fracclass="tok-str">', class="tok-num">0.4, class="tok-num">1.0),
        'lambda_l1class="tok-str">': trial.suggest_float('l1class="tok-str">', class="tok-num">1e-8, class="tok-num">10.0, log=True),
        'lambda_l2class="tok-str">': trial.suggest_float('l2class="tok-str">', class="tok-num">1e-8, class="tok-num">10.0, log=True),
        'verboseclass="tok-str">': -class="tok-num">1,
    }
    cv_resultats = lgb.cv(
        params, dtrain, nfold=class="tok-num">5,
        num_boost_round=class="tok-num">500,
        early_stopping_rounds=class="tok-num">50,
        stratified=True
    )
    return max(cv_resultats['valid auc-meanclass="tok-str">'])

etude = optuna.create_study(direction='maximize')
etude.optimize(objectif, n_trials=class="tok-num">100)

?Vérification des Connaissances

La progression est sauvegardée dans votre navigateur — aucun compte requis.

Besoin d'un ingénieur IA ou data scientist ?

Je conçois des modèles ML sur mesure, des agents IA, de la vision par ordinateur et de l'automatisation — de l'idée à la production.