Accueil / Factory / Algos ML / Elastic Net — factory / algos ML / apprentissage supervisé · régularisation

ELASTIC NET.

Une régression qui combine les deux pénalités : celle du Lasso, qui met des variables à zéro, et celle de Ridge, qui stabilise. Quand les variables vont par groupes très corrélés, le Lasso en garde une au hasard ; Elastic Net garde le groupe ensemble tout en écartant ce qui est inutile.

RégressionClassificationRégularisationVariables corréléesNiveau : intermédiaire

FICHE D'IDENTITÉ

notes sur 5 · usage entreprise
PerformanceSouvent au niveau de Ridge, avec moins de variables
InterprétabilitéModèle allégé, groupes de variables cohérents
VitesseRapide, mais deux paramètres à explorer
Facilité de réglageDeux paramètres : le mélange et la force de la pénalité
Tolérance aux données brutesMise à l'échelle obligatoire, manquants à traiter
EN 30 SECONDES

Un recruteur qui doit réduire l'équipe. Le Lasso garde un seul des trois jumeaux et renvoie les deux autres. Elastic Net garde les trois jumeaux avec un rôle réduit, et renvoie les vrais inutiles.

1. On additionne deux pénalités

L'erreur est pénalisée à la fois par la somme des |coefficients| (Lasso) et par la somme des coefficients au carré (Ridge).

2. On règle le mélange

Un paramètre de mélange va de 0 (Ridge pur) à 1 (Lasso pur). À 0,5, le modèle sélectionne tout en partageant le poids entre variables corrélées.

3. On règle la force

Pour un mélange donné, la force de la pénalité se choisit par validation croisée, comme pour Ridge ou Lasso.

LE CAS MÉTIER

documents · banque / logistique / administration
EN ENTRÉE

Une image de 8 × 8 pixels

Des chiffres manuscrits scannés, comme sur un formulaire ou un bon de livraison. Chaque image donne 64 variables, et deux pixels voisins sont très corrélés. Le modèle doit reconnaître le chiffre de 0 à 9.

EN SORTIE

Un chiffre reconnu, avec moins de pixels

Sur le jeu d'exemple, à pénalité égale, le Lasso n'utilise que 33 pixels et reconnaît 88 % des chiffres. Elastic Net en utilise 44 pour 92 %, Ridge 60 pour 93,5 %. Elastic Net garde l'essentiel de la précision avec environ un quart de pixels en moins.

CE QU'ON MESURE

L'exactitude, et le nombre de variables

Les dix chiffres sont à peu près équilibrés : l'exactitude (part d'images bien lues) est ici une bonne mesure. On la lit à côté du nombre de pixels utilisés, qui dit combien le modèle est simple.

QUAND LE SORTIR, QUAND L'ÉVITER

OUI

  • Variables par groupes très corrélés : pixels, capteurs voisins, indicateurs qui se recoupent
  • Besoin de sélectionner sans perdre des variables proches mais utiles
  • Plus de variables que de lignes, avec des corrélations fortes
  • Lasso instable d'un échantillon à l'autre

NON

  • Peu de variables peu corrélées : une régression classique ou logistique suffit
  • Relations non linéaires ou interactions : un modèle à base d'arbres est plus adapté
  • Images réelles de grande taille : un réseau convolutif (CNN) fait bien mieux
  • Pas le temps de régler deux paramètres : commencer par Ridge ou Lasso
LES 3 RÉGLAGES QUI COMPTENT

Noms donnés pour R (glmnet) et Python (scikit-learn). Les noms se croisent : lisez bien.

alpha / l1_ratio

Le mélange. 1 = Lasso, 0 = Ridge. 0,5 est un bon départ ; on peut aussi tester 0,2, 0,5 et 0,8 en validation croisée. En R c'est alpha, en Python l1_ratio.

lambda / C ou alpha

La force de la pénalité. En R, lambda, choisi par cv.glmnet. En Python, alpha pour ElasticNet (régression) ou C, son inverse, pour LogisticRegression : plus C est petit, plus la pénalité est forte.

solver = "saga"

En classification avec scikit-learn, seul le solveur saga accepte le mélange des deux pénalités. Il converge mieux sur des variables mises à l'échelle.

LE CODE MINIMAL

jeu d'exemple : chiffres_manuscrits.csv ↓
# Lecture de chiffres manuscrits : Elastic Net en R
library(glmnet)

chiffres <- read.csv("chiffres_manuscrits.csv")
X <- as.matrix(chiffres[, 1:64]) / 16   # 64 pixels, voisins très corrélés
y <- factor(chiffres$chiffre)
set.seed(42)
idx <- sample(nrow(X), round(0.7 * nrow(X)))

# alpha : 1 = Lasso, 0 = Ridge, entre les deux = Elastic Net
for (a in c(1, 0.5, 0)) {
  cv <- cv.glmnet(X[idx, ], y[idx], family = "multinomial", alpha = a, nfolds = 5)
  pred <- predict(cv, newx = X[-idx, ], s = "lambda.1se", type = "class")
  # Un pixel est utilisé s'il a un coefficient non nul pour au moins un chiffre
  poids <- sapply(coef(cv, s = "lambda.1se"), function(m) abs(as.matrix(m)[-1, 1]))
  cat("alpha", a, ": exactitude", round(mean(pred[, 1] == y[-idx]), 3),
      "| pixels utilisés", sum(rowSums(poids) > 0), "sur 64\n")
}

QUESTIONS FRÉQUENTES

Quand choisir Elastic Net plutôt que Lasso ?

Quand les variables sont corrélées par groupes. Le Lasso garde alors une variable du groupe presque au hasard, et ce choix change d'un échantillon à l'autre. Elastic Net répartit le poids sur le groupe et donne une sélection plus stable.

Comment choisir le paramètre de mélange d'Elastic Net ?

On teste quelques valeurs, par exemple 0,2, 0,5 et 0,8, et pour chacune on choisit la force de la pénalité par validation croisée. On garde le couple qui donne la meilleure erreur, ou le modèle plus simple si l'écart est faible.

Elastic Net marche-t-il en classification ?

Oui. La double pénalité s'applique à une régression logistique : glmnet avec family = "binomial" ou "multinomial" en R, LogisticRegression avec le solveur saga en Python.

LES ALGOS VOISINS

à comparer avant de choisir
la sélection pure

Lasso

Plus radical : modèle plus court, mais instable quand les variables sont corrélées.

Voir la fiche →
la stabilité pure

Ridge

Garde toutes les variables avec des poids réduits. Souvent un peu plus précis, jamais sélectif.

Voir la fiche →
le modèle de base

Régression logistique

Elastic Net en classification, c'est une régression logistique avec la double pénalité.

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 →