Formation ML / Apprentissage supervisé - Régression

Gradient Boosting

Intermédiaire 45 min 12 sections

Chaque arbre apprend l'erreur que les précédents ont laissée, séquentiellement, là où la forêt aléatoire les moyenne.

Objectifs d'apprentissage

  • Comprendre la différence entre bagging et boosting
  • Implémenter Gradient Boosting avec scikit-learn
  • Comparer avec XGBoost et LightGBM
  • Régler les hyperparamètres clés

Prérequis

Module Random Forest recommandé

Le code de cette page s'exécute dans votre navigateur. Le premier lancement télécharge Python et ses bibliothèques.

Théorie

Bagging vs Boosting

Il existe deux approches principales pour combiner plusieurs modèles:

Bagging (Random Forest):

  • Arbres entraînés en parallèle
  • Chaque arbre est indépendant
  • Prédiction = moyenne des prédictions
  • Réduit la variance (overfitting)

Boosting (Gradient Boosting):

  • Arbres entraînés séquentiellement
  • Chaque arbre corrige les erreurs du précédent
  • Prédiction = somme pondérée des prédictions
  • Réduit le biais (underfitting)

Intuition du Gradient Boosting:

  1. Arbre 1 fait des prédictions
  2. On calcule les erreurs (résidus)
  3. Arbre 2 apprend à prédire ces erreurs
  4. On répète jusqu'à convergence

La prédiction finale: $\hat{y} = \sum_{i=1}^{n} \alpha_i \cdot h_i(x)$

Ou $h_i$ est le i-ème arbre et $\alpha_i$ son poids (learning rate).

Théorie

Schéma: Fonctionnement du Gradient Boosting

Entraînement séquentiel - Étape par étape:

flowchart LR subgraph Etape1 ["Étape 1"] D1["y réel"] T1["Arbre 1"] P1["Prédiction 1"] D1 --> T1 --> P1 end subgraph Etape2 ["Étape 2"] E1["Erreur 1
y - pred1"] T2["Arbre 2"] P2["Corrige
erreur 1"] E1 --> T2 --> P2 end subgraph Etape3 ["Étape 3"] E2["Erreur 2
restante"] T3["Arbre 3"] P3["Corrige
erreur 2"] E2 --> T3 --> P3 end P1 --> E1 P2 --> E2 class D1 ml-node-secondary class T1 ml-node-success class T2 ml-node-success class T3 ml-node-success class E1 ml-node-danger class E2 ml-node-danger class P1 ml-node-warning class P2 ml-node-warning class P3 ml-node-warning

Prédiction finale = Somme des contributions:

flowchart LR P1["Arbre 1
300k EUR"] PLUS1["+"] P2["Arbre 2
+15k
x learning_rate"] PLUS2["+"] P3["Arbre 3
+8k
x learning_rate"] EQ["="] F["323k EUR"] P1 --> PLUS1 --> P2 --> PLUS2 --> P3 --> EQ --> F class P1 ml-node-success class P2 ml-node-warning class P3 ml-node-warning class F ml-node-accent class PLUS1 ml-node-plain class PLUS2 ml-node-plain class EQ ml-node-plain

Exemple concret:

  • Maison réelle: 350k EUR
  • Arbre 1 prédit: 300k (erreur = +50k)
  • Arbre 2 corrige: +15k (erreur restante = +35k)
  • Arbre 3 corrige: +8k (erreur restante = +27k)
  • ... et ainsi de suite jusqu'à convergence

Comparaison Bagging vs Boosting:

flowchart TB subgraph BAG ["BAGGING - Parallèle"] DB["Données"] BA1["Arbre 1"] BA2["Arbre 2"] BA3["Arbre 3"] BM["Moyenne"] DB --> BA1 DB --> BA2 DB --> BA3 BA1 --> BM BA2 --> BM BA3 --> BM end subgraph BOOST ["BOOSTING - Séquentiel"] DBo["Données"] Bo1["Arbre 1"] Bo2["Arbre 2"] Bo3["Arbre 3"] BS["Somme"] DBo --> Bo1 Bo1 --> Bo2 Bo2 --> Bo3 Bo3 --> BS end class BM ml-node-brand class BS ml-node-accent class DB ml-node-secondary class DBo ml-node-secondary
Avancé Exercice manuel: À vous de calculer!

Objectif: Comprendre le boosting à la main (résidus, apprentissage séquentiel).

CONTEXTE

Vous predisez le prix d'une maison (valeur réelle : 300 000 EUR).

Le premier modèle (arbre faible) prédit : $\hat{y}_1 = 250\,000$ EUR

Learning rate : $\eta = 0.5$

PARTIE 1 : Calcul du résidu

1.1) Calculez le résidu $r_1 = y_{vrai} - \hat{y}_1$ 1.2) Que représente ce résidu ?

PARTIE 2 : Deuxième modèle

Le 2ème modèle apprend à prédire le résidu et prédit : $\hat{r}_2 = 40\,000$ EUR

2.1) Calculez la prédiction combinée : $\hat{y}_2 = \hat{y}_1 + \eta \cdot \hat{r}_2$ 2.2) Quel est le nouveau résidu ?

PARTIE 3 : Troisième itération

Le 3ème modèle prédit un résidu de : $\hat{r}_3 = 25\,000$ EUR

3.1) Calculez $\hat{y}_3$ 3.2) Quelle est l'erreur finale ?

PARTIE 4 : Interprétation

4.1) Pourquoi utilise-t-on un learning rate < 1 ? 4.2) Quel est le risque d'un learning rate trop élevé ?

Avancé Solution de l'exercice manuel

SOLUTION DÉTAILLÉE

PARTIE 1 : Calcul du résidu

1.1) Résidu : $$r_1 = 300\,000 - 250\,000 = \textcolor{#e74c3c}{\mathbf{50\,000}}$$ EUR

1.2) Le résidu représente l'erreur du modèle précédent. Le prochain modèle essaiera de corriger cette erreur.

PARTIE 2 : Deuxième modèle

2.1) Prédiction combinée :

$$\hat{y}_2 = 250\,000 + 0.5 \times 40\,000$$

$$= 250\,000 + 20\,000 = \textcolor{#F7E64D}{\mathbf{270\,000}}$$ EUR

2.2) Nouveau résidu : $$r_2 = 300\,000 - 270\,000 = \textcolor{#e67e22}{30\,000}$$ EUR

PARTIE 3 : Troisième itération

3.1) Prédiction finale :

$$\hat{y}_3 = 270\,000 + 0.5 \times 25\,000$$

$$= 270\,000 + 12\,500 = \textcolor{#27ae60}{\mathbf{282\,500}}$$ EUR

3.2) Erreur finale : $$\text{Erreur} = |300\,000 - 282\,500| = \textcolor{#e74c3c}{17\,500}$$ EUR (5.8%)

ItérationPrédictionRésidu
1250 00050 000
2270 00030 000
3282 50017 500

PARTIE 4 : Interprétation

4.1) Learning rate < 1 :

  • Évite le sur-apprentissage
  • Chaque modèle contribue partiellement
  • Plus stable mais nécessite plus d'itérations

4.2) Learning rate trop élevé :

  • Risque d'overfitting
  • Oscillations autour de la solution
  • Moins de généralisation

Légende : $\textcolor{#e74c3c}{Rouge}$: résidus/erreurs, $\textcolor{#F7E64D}{Jaune}$: prédictions intermédiaires, $\textcolor{#27ae60}{Vert}$: résultat final

Code

Explorer les données

# Fonction pour formater les nombres au style francais (espace comme separateur)
def fmt(n, decimals=0):
    n = float(n)  # Convertit les arrays numpy en scalaire
    return f"{n:,.{decimals}f}".replace(",", " ")

print("=" * 70)
print("   EXPLORATION DU DATASET IMMOBILIER")
print("   Pour l'entrainement du Gradient Boosting")
print("=" * 70)

# =================================================================
# 1. APERCU DES DONNEES
# =================================================================
print("\n" + "-" * 40)
print("1. APERCU DU DATASET")
print("-" * 40)
print("""
Nous utilisons le meme dataset immobilier que pour le Random Forest.
Le Gradient Boosting va apprendre a corriger iterativement ses erreurs.
""")
display(df.head(10), title="Dataset Immobilier")

# =================================================================
# 2. DISTRIBUTION DES PRIX
# =================================================================
print("\n" + "-" * 40)
print("2. DISTRIBUTION DU PRIX CIBLE")
print("-" * 40)

print(f"""
STATISTIQUES DU PRIX:

  Minimum:     {df['price'].min():>12,} EUR
  Maximum:     {df['price'].max():>12,} EUR
  Moyenne:     {fmt(df['price'].mean()):>12} EUR
  Mediane:     {fmt(df['price'].median()):>12} EUR
  Ecart-type:  {fmt(df['price'].std()):>12} EUR

INTERPRETATION:
- Le Gradient Boosting va commencer par predire la moyenne (~{fmt(df['price'].mean())} EUR)
- Puis, chaque arbre va corriger les erreurs residuelles
- Apres N iterations, l'erreur devrait diminuer significativement
""")

# =================================================================
# 3. CORRELATIONS AVEC LE PRIX
# =================================================================
print("\n" + "-" * 40)
print("3. CORRELATIONS")
print("-" * 40)

corr_surface = df['surface'].corr(df['price'])
corr_rooms = df['nb_rooms'].corr(df['price'])

print(f"""
Correlation avec le prix:
  - Surface:   {corr_surface:.3f} ({'forte' if abs(corr_surface) > 0.7 else 'moderee'})
  - Nb_rooms:  {corr_rooms:.3f} ({'forte' if abs(corr_rooms) > 0.7 else 'moderee'})

Le Gradient Boosting peut capturer des relations plus complexes
que les correlations lineaires simples!
""")
Ctrl+Entrée

Cliquez sur « Exécuter » pour voir le résultat.

Contenu verrouillé
5 / 12

Continuez votre apprentissage

Vous avez exploré 5 sections de ce module. Connectez-vous pour débloquer le reste du cours, incluant les exercices pratiques et les solutions.

Ctrl ou Cmd plus Entrée exécute le code. Tab indente ; Échap puis Tab quitte l'éditeur.