Accueil / Factory / Algos ML / Modèle additif généralisé (GAM) — factory / algos ML / apprentissage supervisé · statistique

MODÈLE ADDITIF GÉNÉRALISÉ.

Un modèle qui remplace chaque coefficient par une courbe lisse. L'effet de l'ancienneté sur le risque de départ n'est plus une droite : il peut baisser, remonter à l'échéance du contrat, puis se stabiliser. Chaque courbe se trace et se lit séparément : c'est le compromis entre la précision et la clarté.

RégressionClassificationSplinesModèle interprétableNiveau : avancé

FICHE D'IDENTITÉ

notes sur 5 · usage entreprise
PerformanceCapte les courbes sans perdre la structure additive
InterprétabilitéUne courbe par variable, à tracer et commenter
VitesseQuelques secondes à quelques minutes selon la taille
Facilité de réglageLissage automatique, mais choix des courbes à faire
Tolérance aux données brutesManquants à traiter, sensible aux zones peu peuplées
EN 30 SECONDES

Une régression logistique dont chaque règle droite est remplacée par une règle souple. La règle se plie là où les données le demandent, et un ressort l'empêche de faire des zigzags.

1. On découpe la variable en morceaux

L'ancienneté est décrite par une base de splines : des morceaux de courbe simples, raccordés en douceur, que le modèle combine pour épouser la forme des données.

2. On pénalise les zigzags

Le modèle ajuste les morceaux, mais paie un prix pour chaque courbure. Le niveau de lissage est choisi automatiquement (REML dans mgcv).

3. On additionne les effets

Le score est la somme des courbes et des effets linéaires. Avec une loi binomiale, il est ensuite converti en probabilité, comme en régression logistique.

LE CAS MÉTIER

churn · télécom / énergie / abonnements
EN ENTRÉE

Une ligne par client

Ancienneté en mois, appels au support, montant mensuel, type de contrat, incidents récents, et la colonne à prédire : le client est-il parti ? L'ancienneté est traitée en courbe, le reste en effets linéaires.

EN SORTIE

La courbe du risque selon l'ancienneté

Pour un client type sur le jeu d'exemple : environ 20 % de risque à 2 mois, 8 % à 12 mois, un rebond à 11 % autour de 24 mois, à l'échéance d'engagement, puis 6,5 % à 48 mois. Une droite aurait gommé ce rebond.

CE QU'ON MESURE

L'AUC, et le sens métier des courbes

Sur les clients jamais vus, l'AUC atteint 0,80, contre environ 0,78 pour la régression logistique classique. Le vrai gain est ailleurs : la courbe désigne les moments où déclencher une action de rétention.

QUAND LE SORTIR, QUAND L'ÉVITER

OUI

  • Effets non linéaires attendus : âge, ancienneté, température, prix
  • Besoin de montrer la forme de chaque effet à des métiers ou à un régulateur
  • Amélioration d'un GLM existant sans tout changer
  • Données tabulaires de taille moyenne, avec peu d'interactions

NON

  • Beaucoup d'interactions entre variables : un gradient boosting les trouve seul
  • Des centaines de variables : lent et difficile à lire, préférer une régularisation
  • Effet en marche d'escalier net, comme un seuil réglementaire : une variable en tranches suffit
  • Cible hors des lois classiques et forte exigence de performance : XGBoost
LES 4 RÉGLAGES QUI COMPTENT

Noms donnés pour R (mgcv) et Python (scikit-learn, pyGAM).

s(x, k = …) / n_knots

Le nombre maximal de morceaux de la courbe. C'est un plafond : le lissage réduit ensuite la flexibilité réelle. Trop bas, un rebond étroit est gommé ; ici k = 20.

method = "REML"

La façon de choisir le lissage dans mgcv. REML est la recommandation actuelle : plus stable que la valeur par défaut, GCV.Cp.

edf

Les degrés de liberté effectifs, lus dans summary(). Proche de 1, l'effet est quasi linéaire ; plus haut, la courbe est réellement utilisée.

family

La loi de la cible, comme pour un GLM : binomial pour un oui / non, poisson pour un comptage, gaussian pour une valeur continue.

LE CODE MINIMAL

jeu d'exemple : clients_churn.csv ↓
# Churn selon l'ancienneté : modèle additif généralisé (GAM) en R
library(mgcv)

clients <- read.csv("clients_churn.csv")
clients$contrat <- factor(clients$contrat)
set.seed(42)
idx <- sample(nrow(clients), round(0.7 * nrow(clients)))
train <- clients[idx, ]
test <- clients[-idx, ]

# s() : courbe lisse pour l'ancienneté, effets linéaires pour le reste
modele <- gam(churn ~ s(anciennete, k = 20) + appels_support + montant + contrat + incidents_3m,
              family = binomial, data = train, method = "REML")
print(summary(modele))   # edf proche de 1 = effet quasi linéaire, plus haut = courbe

# Lecture de la courbe : risque d'un client type selon son ancienneté
type_client <- data.frame(anciennete = c(2, 6, 12, 18, 24, 30, 48), appels_support = 1, montant = 45,
                          contrat = factor("annuel", levels = levels(clients$contrat)), incidents_3m = 0)
print(round(100 * predict(modele, type_client, type = "response"), 1))

# AUC test (formule des rangs)
proba <- predict(modele, test, type = "response")
n1 <- sum(test$churn == 1); n0 <- sum(test$churn == 0)
cat("AUC test :", round((sum(rank(proba)[test$churn == 1]) - n1 * (n1 + 1) / 2) / (n1 * n0), 3), "\n")

QUESTIONS FRÉQUENTES

Quelle différence entre GLM et GAM ?

Un GLM relie la cible à une somme d'effets linéaires. Un GAM remplace tout ou partie de ces effets par des courbes lisses estimées sur les données. Il garde la même famille de lois et la même lecture variable par variable.

Comment interpréter un GAM ?

On trace la courbe de chaque variable : elle montre comment le score évolue quand la variable varie, les autres restant fixes. L'edf indique la complexité de la courbe. Sur une échelle logit, on convertit en probabilité pour un profil type, comme dans le code.

Existe-t-il un GAM en Python ?

Oui : pyGAM et statsmodels (GLMGam) proposent des GAM pénalisés. Avec scikit-learn seul, SplineTransformer suivi d'une régression pénalisée donne une approximation proche, sans le choix automatique du lissage de mgcv, la référence en R.

LES ALGOS VOISINS

à comparer avant de choisir
la version droite

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

Mêmes lois et liens, mais des effets linéaires. Le GAM part souvent d'un GLM existant.

Voir la fiche →
des morceaux de droites

MARS

Remplace les courbes lisses par des segments raccordés, et cherche seul les nœuds et les interactions.

Voir la fiche →
plus précis, moins lisible

Gradient Boosting

Capte seul les interactions. Des outils comme SHAP sont alors nécessaires pour l'expliquer.

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 →