LightGBM : Guide Complet — Gradient Boosting Rapide et Léger

LightGBM : Guide Complet — Gradient Boosting Rapide et Léger

LightGBM : Guide complet — Gradient Boosting Rapide et Léger

Résumé — LightGBM (Light Gradient Boosting Machine) est un algorithme de gradient boosting développé par Microsoft en 2017. Il se distingue de ses concurrents (XGBoost, CatBoost) par trois innovations majeures : le split basé sur des histogrammes (au lieu du tri exhaustif des valeurs), le GOSS (échantillonnage asymétrique des gradients) et l’EFB (regroupement de features mutuellement exclusives). Ces optimisations en font le boosting le plus rapide du marché, particulièment adapté aux très gros jeux de données.


Principe mathématique

1. Histogram-based splitting

Contrairement à XGBoost qui trie toutes les valeurs de chaque feature pour trouver le seuil optimal (coût O(n × m) pour n échantillons et m features), LightGBM discrétise chaque feature continue en B bins (typiquement 255) via un histogramme :

  1. Construire B bins pour chaque feature couvrant la plage de valeurs.
  2. Remplir les histogrammes en comptant les gradients et hessiens dans chaque bin.
  3. Trouver le meilleur seuil en parcourant les B bins (au lieu de n valeurs).

Le coût passe de O(n × m) à O(B × m) par split, soit une réduction massive quand n est grand (n ≫ B).

2. GOSS (Gradient-based One-Side Sampling)

L’idée clé : les exemples avec de petits gradients (faible erreur) sont déjà bien prédits et contribuent peu à l’information du gradient. On peut les sous-échantillonner sans perdre beaucoup de précision.

Procédure GOSS :
1. Trier les exemples par valeur absolue du gradient |g_i|.
2. Garder les top a × 100% exemples avec les plus gros gradients.
3. Échantillonner aléatoirement b × 100% des exemples restants.
4. Compenser le sous-échantillonnage en multipliant les gradients des exemples échantillonnés par un facteur (1-a)/b.

Ce mécanisme de compensation garantit que l’estimation du gain d’information reste non biaisée malgré le sous-échantillonnage.

3. EFB (Exclusive Feature Bundling)

Dans les jeux de données creux (one-hot encoding, features sparse), de nombreuses features sont mutuellement exclusives : elles ne sont jamais non-nulles simultanément. L’EFB regroupe ces features en une seule feature bundle :

$$\text{Si } F_j \text{ et } F_k \text{ sont exclusives, on les combine en } F_{jk}(x) = F_j(x) + c \cdot F_k(x)$$

où c est un offset pour séparer les plages de valeurs. Cela réduit le nombre de features à traiter de m à m’ ≪ m.

4. Croissance leaf-wise (au lieu de level-wise)

XGBoost et d’autres croissent les arbres niveau par niveau (level-wise) : tous les nœuds d’un même niveau sont splittés simultanément. LightGBM croît feuille par feuille (leaf-wise) : à chaque étape, il split la feuille qui réduit le plus le coût.

Résultat : les arbres leaf-wise atteignent une erreur inférieure avec moins de nœuds, car chaque split est optimal localement. Le risque de surapprentissage est contrôlé par max_depth.

5. Fonction objectif (similaire à XGBoost)

Comme XGBoost, LightGBM minimise :

$$L = \sum_i l(y_i, \hat{y}_i) + \sum_k \Omega(f_k)$$

avec $$\Omega(f) = \gamma T + \frac{1}{2}\lambda ||w||^2$$

Les améliorations de LightGBM ne changent pas la fonction objectif — elles accélèrent simplement sa minimisation.


Intuition

Imaginez que vous cherchez le meilleur restaurant dans une ville.

XGBoost examine chaque restaurant individuellement, le classe par note, et compare méticuleusement. C’est précis mais lent.

LightGBM regroupe les restaurants par quartier (histogrammes/bins), élimine d’emblée les quartiers connus pour être médiocres (GOSS), et combine les restaurants trop similaires en un seul représentant (EFB). Le résultat est presque aussi bon, mais beaucoup plus rapide à obtenir.

L’analogie du tri de pièces de monnaie : Si vous devez trier 10 000 pièces par taille, XGBoost les mesure une par une avec un pied à coulisse. LightGBM les passe par des tamis de différentes tailles (les bins) — en quelques secondes, les pièces sont triées avec la même précision.


Implémentation Python

Exemple 1 : LightGBM basique avec sklearn API

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import lightgbm as lgb

# Données
X, y = make_classification(n_samples=10000, n_features=20, n_informative=10,
    n_redundant=5, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
    random_state=42)

# LightGBM Classifier
lgb_clf = lgb.LGBMClassifier(
    n_estimators=200,
    learning_rate=0.05,
    num_leaves=31,
    max_depth=-1,
    min_child_samples=20,
    subsample=0.8,
    colsample_bytree=0.8,
    reg_alpha=0.1,
    reg_lambda=0.1,
    random_state=42,
    verbose=-1
)
lgb_clf.fit(X_train, y_train)
lgb_pred = lgb_clf.predict(X_test)
lgb_acc = accuracy_score(y_test, lgb_pred)
print(f"LightGBM accuracy : {lgb_acc:.3f}")

Exemple 2 : Comparaison vitesse LightGBM vs XGBoost vs Random Forest

import time
import lightgbm as lgb
from sklearn.ensemble import RandomForestClassifier

# LightGBM
start = time.time()
lgb_model = lgb.LGBMClassifier(n_estimators=200, learning_rate=0.1,
    num_leaves=31, verbose=-1, random_state=42)
lgb_model.fit(X_train, y_train)
lgb_time = time.time() - start
lgb_acc = accuracy_score(y_test, lgb_model.predict(X_test))
print(f"LightGBM   : {lgb_time:.2f}s | Acc: {lgb_acc:.3f}")

# Random Forest
start = time.time()
rf_model = RandomForestClassifier(n_estimators=200, max_depth=10,
    random_state=42, n_jobs=-1)
rf_model.fit(X_train, y_train)
rf_time = time.time() - start
rf_acc = accuracy_score(y_test, rf_model.predict(X_test))
print(f"RandomForest: {rf_time:.2f}s | Acc: {rf_acc:.3f}")

print(f"\nLightGBM est {rf_time/lgb_time:.1f}x plus rapide que Random Forest")

Exemple 3 : Early stopping et validation

# API native avec early stopping
train_data = lgb.Dataset(X_train, label=y_train)
val_data = lgb.Dataset(X_test, label=y_test, reference=train_data)

params = {
    'objective': 'binary',
    'metric': 'binary_logloss',
    'learning_rate': 0.05,
    'num_leaves': 31,
    'min_child_samples': 20,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'verbose': -1
}

callbacks = [
    lgb.early_stopping(stopping_rounds=20),
    lgb.log_evaluation(period=50)
]

model = lgb.train(
    params,
    train_data,
    num_boost_round=500,
    valid_sets=[val_data],
    callbacks=callbacks
)

print(f"\nMeilleur itération : {model.best_iteration}")
print(f"Nombre d'arbres utilisés : {model.best_iteration}")

# Feature importance
import matplotlib.pyplot as plt
lgb.plot_importance(model, max_num_features=10, figsize=(8, 5))
plt.title('LightGBM - Feature Importance')
plt.tight_layout()
plt.savefig('lightgbm_importance.png', dpi=150)

Exemple 4 : Mode API native avec métriques avancées

# Prédiction avec probabilités
probs = model.predict(X_test)
from sklearn.metrics import roc_auc_score, classification_report
auc = roc_auc_score(y_test, probs)
print(f"ROC AUC : {auc:.3f}")
preds = (probs >= 0.5).astype(int)
print(classification_report(y_test, preds))

Hyperparamètres

Hyperparamètre Valeur typique Description
n_estimators 100-1000 Nombre d’arbres (boosting rounds). Utiliser avec early stopping
learning_rate 0.01-0.1 Pas d’apprentissage. Petit + beaucoup d’arbres = meilleure performance
num_leaves 20-100 Nombre maximum de feuilles. Plus important que max_depth pour la complexité
max_depth -1 (illimité) ou 6-12 Profondeur max. -1 = pas de limite (contrôler par num_leaves)
min_data_in_leaf 20-100 Nombre minimum d’échantillons par feuille. Augmenter pour éviter le surapprentissage
feature_fraction 0.6-1.0 Fraction de features utilisées par arbre (comme colsample_bytree)
bagging_fraction 0.6-1.0 Fraction d’échantillons utilisés par itération (subsample)
lambda_l1 / lambda_l2 0-10 Régularisation L1/L2 sur les poids des feuilles
min_gain_to_split 0-1 Gain minimum requis pour créer un split (comme gamma dans XGBoost)

Avantages de LightGBM

  1. Vitesse d’entraînement exceptionnelle : Les histogrammes et le GOSS rendent LightGBM 5 à 10 fois plus rapide que XGBoost sur les gros datasets. Sur des millions de lignes, la différence est flagrante.
  2. Faible consommation mémoire : La discrétisation en bins (255 bins = 1 octet par valeur au lieu de 8 pour un float64) réduit l’occupation mémoire d’un facteur 8. Idéal pour les machines limitées.
  3. Support natif des features catégorielles : LightGBM gère directement les features catégorielles sans one-hot encoding, via un algorithme de split optimisé qui trouve les meilleures combinaisons de catégories.
  4. Croissance leaf-wise plus efficace : En splittant la feuille la plus prometteuse plutôt que toutes les feuilles d’un niveau, LightGBM converge plus vite avec moins d’arbres.
  5. Parallélisation efficace : LightGBM supporte l’entraînement distribué sur multiple machines et le parallélisme sur les features (feature parallel) et les données (data parallel).

Limites de LightGBM

  1. Surapprentissage sur petits datasets : Sur des données de moins de 10 000 lignes, les optimisations de LightGBM (GOSS, leaf-wise) peuvent causer du surapprentissage. XGBoost ou Random Forest sont souvent plus stables.
  2. Sensibilité aux hyperparamètres : num_leaves et min_data_in_leaf doivent être bien réglés. Un num_leaves trop élevé avec un min_data_in_leaf trop bas mène inévitablement au surapprentissage.
  3. Moins interprétable que XGBoost : Les arbres leaf-wise sont plus profonds et irréguliers, rendant la visualisation et l’interprétation plus difficiles.
  4. GOSS perd de l’information : Bien que théoriquement compensé, le sous-échantillonnage des gradients faibles peut négliger des patterns subtils dans les données bien classées.
  5. Dépendance à la compilation : Pour des performances optimales, LightGBM nécessite une installation avec compilateur C++ (Visual Studio sous Windows). L’installation peut être problématique sur certains environnements.

4 cas d’usage concrets

1. Compétitions Kaggle sur données tabulaires

LightGBM est l’un des algorithmes les plus utilisés dans les compétitions de data science sur données tabulaires. Sa vitesse permet d’itérer rapidement entre les expériences, et ses performances sont souvent au niveau ou au-dessus de XGBoost. Combiné avec CatBoost et XGBoost en stacking, il constitue un trio redoutable.

2. Scoring de crédit en temps quasi-réel

Dans les systèmes de scoring bancaire, LightGBM est apprécié pour sa rapidité d’inférence et sa capacité à gérer des millions de transactions quotidiennes. La prédiction par arbre est très rapide, et la nature leaf-wise donne de bons résultats avec peu d’arbres comparé à d’autres méthodes.

3. Traitement de logs et données de clickstream

Les données de navigation web et les logs système sont massives, creuses et riches en features catégorielles (URL, user agent, pays). LightGBM gère nativement ces features creuses et catégorielles, et son efficacité mémoire permet de traiter des datasets qui tiendraient difficilement en mémoire avec XGBoost.

4. Détection de fraude en streaming

La prédiction rapide de LightGBM est cruciale pour la détection de fraude en temps réel : chaque transaction doit être évaluée en quelques millisecondes. Un modèle LightGBM de 100-200 arbres offre une inférence très rapide, compatible avec les contraintes de latence des systèmes de paiement.


Conclusion

LightGBM est le choix idéal quand la vitesse compte : gros datasets, itération rapide, contraintes mémoire. Ses innovations (histogrammes, GOSS, EFB, leaf-wise) ne sont pas des gadgets — elles représentent des gains réels de 5x à 10x en vitesse sur des datasets de taille industrielle.

Le compromis est une sensibilité accrue au surapprentissage sur petits datasets. Pour des données de moins de 10 000 lignes, préférez XGBoost ou Random Forest. Au-delà, LightGBM devient progressivement imbattable.


Voir aussi


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.