Accueil / Factory / Algos ML / LightGBM — factory / algos ML / apprentissage supervisé

ALGORITHME LIGHTGBM.

Une implémentation du gradient boosting conçue par Microsoft pour aller vite sur de gros volumes. Elle regroupe les valeurs de chaque variable en tranches et fait pousser ses arbres feuille par feuille. Sur de gros volumes, LightGBM entraîne nettement plus vite qu'un gradient boosting classique, pour une précision comparable à XGBoost.

ClassificationRégressionGros volumesEnsemble / boostingNiveau : intermédiaire

FICHE D'IDENTITÉ

notes sur 5 · usage entreprise
PerformanceAu niveau de XGBoost, souvent un peu plus rapide
InterprétabilitéImportance des variables et SHAP, pas de règle lisible
VitesseConçu pour les millions de lignes, peu gourmand en mémoire
Facilité de réglagenum_leaves et arrêt précoce à régler, surapprend vite
Tolérance aux données brutesManquants et catégorielles gérés, sans normalisation
EN 30 SECONDES

Plutôt que de trier chaque âge au jour près, on range les conducteurs dans 255 tranches d'âge au maximum. On cherche ensuite la meilleure coupure parmi ces tranches, ce qui va beaucoup plus vite et perd très peu d'information.

1. On découpe chaque variable en tranches

Avant l'entraînement, chaque variable numérique est résumée en un histogramme de quelques centaines de tranches au maximum. Les calculs portent ensuite sur ces tranches, pas sur chaque ligne.

2. On fait pousser l'arbre feuille par feuille

Au lieu de remplir chaque étage de l'arbre, LightGBM découpe à chaque fois la feuille qui réduit le plus l'erreur. Les arbres deviennent asymétriques et plus efficaces, à condition de limiter leur nombre de feuilles.

3. On empile les arbres comme tout boosting

Chaque nouvel arbre corrige l'erreur restante, avec un petit pas d'apprentissage. L'arrêt précoce stoppe l'ajout d'arbres quand le score de validation ne progresse plus.

LE CAS MÉTIER

prime pure · assurance auto / IARD
EN ENTRÉE

Un contrat par ligne, souvent des millions

Âge du conducteur, puissance du véhicule, zone, bonus-malus, durée d'exposition. La cible est le coût total des sinistres de l'année, nul pour la grande majorité des contrats.

EN SORTIE

Un coût attendu par année d'assurance

C'est la prime pure : ce que le contrat coûtera en moyenne, avant frais et marge. La perte Tweedie gère à la fois la masse de zéros et les quelques sinistres coûteux, sans séparer fréquence et coût moyen.

CE QU'ON MESURE

Le coût réel par quintile de risque

On classe les contrats de test par prime prédite, en 5 groupes. Un bon modèle montre un coût observé nettement plus élevé dans le dernier quintile que dans le premier. Sur un petit jeu comme celui-ci, les quintiles du milieu restent bruités.

QUAND LE SORTIR, QUAND L'ÉVITER

OUI

  • Des centaines de milliers à des millions de lignes, réentraînement fréquent
  • Recherche de la meilleure performance sur données en tableau
  • Variables catégorielles nombreuses, déclarées sans créer d'indicatrices
  • Cibles spéciales : Tweedie, Poisson, quantile, classement (lambdarank)

NON

  • Moins de quelques milliers de lignes : les arbres feuille par feuille surapprennent, préférer une Random Forest
  • Tarif à documenter variable par variable : un GLM reste la référence du marché
  • Besoin d'un modèle lisible par le métier : un arbre de décision ou une régression
  • Catégorielles à très nombreuses modalités et peu de lignes : CatBoost est plus robuste
LES 4 RÉGLAGES QUI COMPTENT

Noms donnés pour R (lgb.train) et Python (LGBMRegressor), qui partagent le même moteur.

num_leaves

Le nombre maximal de feuilles par arbre, 31 par défaut. C'est le réglage principal de la complexité, puisque les arbres poussent feuille par feuille. Sur des données bruitées comme l'assurance, 8 à 16 suffisent.

min_data_in_leaf / min_child_samples

Le nombre minimum de lignes par feuille, 20 par défaut. L'augmenter (100 ou plus) évite qu'une feuille repose sur quelques sinistres isolés.

learning_rate + arrêt précoce

Pas de 0,1 par défaut. On le baisse (0,03), on fixe un nombre d'arbres large et on arrête quand le score de validation ne progresse plus depuis 100 tours.

objective

La perte : binary pour oui / non, poisson pour un comptage, tweedie pour un coût avec beaucoup de zéros. tweedie_variance_power, entre 1 et 2, règle le compromis ; 1,5 est un point de départ courant.

LE CODE MINIMAL

jeu d'exemple : sinistres.csv ↓
# Prime pure auto : LightGBM en R
library(lightgbm)

contrats <- read.csv("sinistres.csv")
contrats$zone <- as.integer(factor(contrats$zone)) - 1L   # codes 0, 1, 2 déclarés catégoriels
X <- as.matrix(contrats[, c("age_conducteur", "puissance_cv", "zone", "bonus_malus")])
y <- contrats$cout_total / contrats$exposition            # coût par année d'assurance
w <- contrats$exposition

# 60 % apprentissage, 20 % validation (arrêt précoce), 20 % test
set.seed(42)
groupe <- sample(c("fit", "valid", "test"), nrow(X), replace = TRUE, prob = c(0.6, 0.2, 0.2))
dfit <- lgb.Dataset(X[groupe == "fit", ], label = y[groupe == "fit"], weight = w[groupe == "fit"],
                    categorical_feature = "zone")
dvalid <- lgb.Dataset.create.valid(dfit, X[groupe == "valid", ], label = y[groupe == "valid"],
                                   weight = w[groupe == "valid"])

# Perte Tweedie : beaucoup de zéros, quelques coûts élevés
params <- list(objective = "tweedie", tweedie_variance_power = 1.5, learning_rate = 0.03,
               num_leaves = 8, min_data_in_leaf = 100, seed = 42, verbose = -1)
modele <- lgb.train(params = params, data = dfit, nrounds = 2000, valids = list(valid = dvalid),
                    early_stopping_rounds = 100, verbose = -1)
cat("Arbres retenus :", modele$best_iter, "\n")

# Coût annuel observé et prédit par quintile de risque, sur les contrats jamais vus
test <- contrats[groupe == "test", ]
test$prime <- predict(modele, X[groupe == "test", ])
quintile <- cut(rank(test$prime, ties.method = "first"), 5, labels = 1:5)
observe <- tapply(test$cout_total, quintile, sum) / tapply(test$exposition, quintile, sum)
predit <- tapply(test$prime * test$exposition, quintile, sum) / tapply(test$exposition, quintile, sum)
print(round(cbind(observe, predit)))
print(lgb.importance(modele))

QUESTIONS FRÉQUENTES

LightGBM ou XGBoost ?

Les deux donnent des performances très proches une fois réglés. LightGBM est souvent plus rapide et plus économe en mémoire sur les gros volumes, et gère nativement les variables catégorielles. XGBoost est plus répandu dans les outils et un peu moins sensible au surapprentissage sur les petits jeux.

Pourquoi LightGBM est-il si rapide ?

Il travaille sur des histogrammes : chaque variable est résumée en tranches avant l'entraînement, ce qui réduit fortement le nombre de coupures à tester. Il ajoute des astuces optionnelles, comme regrouper les variables rarement non nulles ou ne garder qu'une partie des lignes bien prédites à chaque tour.

Comment LightGBM gère-t-il les variables catégorielles ?

Une variable déclarée catégorielle n'a pas besoin d'indicatrices 0 / 1. À chaque coupure, LightGBM trie les modalités selon leur effet sur l'erreur et cherche la meilleure partition en deux groupes. En Python, il suffit que la colonne soit de type category dans pandas.

LES ALGOS VOISINS

à comparer avant de choisir
le concurrent direct

XGBoost

Même famille, arbres construits étage par étage par défaut. Performances très proches ; le choix se fait souvent sur l'outillage en place.

Voir la fiche →
pour les catégorielles

CatBoost

Le boosting qui encode lui-même les variables catégorielles. Plus robuste aux réglages par défaut, souvent plus lent à entraîner.

Voir la fiche →
la référence actuarielle

Modèle linéaire généralisé (GLM)

Le modèle de tarification historique, avec les mêmes lois (Poisson, Gamma, Tweedie). Moins précis, mais chaque coefficient se justifie.

Voir la fiche →
— formation

Passer de la fiche à la pratique

Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.

Voir les formations →