Aller au contenu

Arbitrez le dilemme biais-variance

Au chapitre précédent, vous avez vu qu’agrandir l’espace d’hypothèses réduit l’erreur d’approximation mais augmente l’erreur d’estimation. C’est une belle idée… mais ces deux erreurs font intervenir f∗f^* et fH⋄f^\diamond_{\mathcal{H}}, que l’on ne connaît jamais. Comment raisonner concrètement ?

Le dilemme biais-variance (bias-variance dilemma) répond à cette question pour la régression avec perte quadratique. Il découpe l’erreur d’une machine apprise en trois morceaux lisibles, que l’on peut mesurer par simulation et sur lesquels on sait agir. Notre fil rouge reste le salaire prédit à partir du GPA, avec la population du chapitre 3 : un salaire moyen qui plafonne, f∗(x)=70−25 e−2(x−2)f^*(x) = 70 - 25\,e^{-2(x - 2)}, et un bruit de variance σ2=16\sigma^2 = 16.

Le mot « biais » ne vient pas de l’apprentissage automatique, mais de la théorie de l’estimation. Vous voulez connaître une quantité θ\theta de la population, par exemple le salaire moyen de tous les diplômés. Vous la calculez sur un échantillon et obtenez θ^\hat{\theta}, un estimateur. Comme l’échantillon est aléatoire, θ^\hat{\theta} l’est aussi : avec d’autres diplômés, vous auriez obtenu une autre valeur.

Le biais mesure l’erreur systématique de l’estimateur :

Biais(θ^)=E[θ^]−θ\text{Biais}(\hat{\theta}) = \mathbb{E}[\hat{\theta}] - \theta

où E[θ^]\mathbb{E}[\hat{\theta}] est la valeur moyenne de l’estimateur si l’on refaisait l’expérience sur un très grand nombre d’échantillons.

  • Un biais négatif signifie que l’estimateur sous-estime en moyenne.
  • Un biais positif signifie qu’il surestime en moyenne.
  • Un estimateur de biais nul est dit sans biais.

La variance Var(θ^)=E[(θ^−E[θ^])2]\text{Var}(\hat{\theta}) = \mathbb{E}\big[(\hat{\theta} - \mathbb{E}[\hat{\theta}])^2\big] mesure, elle, la dispersion de l’estimateur d’un échantillon à l’autre. Et l’erreur quadratique moyenne se décompose exactement en ces deux morceaux :

E[(θ^−θ)2]=Biais(θ^)2+Var(θ^)\mathbb{E}\big[(\hat{\theta} - \theta)^2\big] = \text{Biais}(\hat{\theta})^2 + \text{Var}(\hat{\theta})
050100150200250300350400valeur de l’estimateur (5 diplômés par échantillon)densitévraie valeur σ² = 100moyenne 80 :biais −20diviser par n : biaisédiviser par n − 1 : sans biais
Les deux estimateurs sur des échantillons de 5 salaires (σ² = 100). Diviser par n donne en moyenne 80 : un biais de −20. Diviser par n − 1 recentre la loi sur 100. Les deux restent très dispersés avec si peu de données.

La réponse classique des statisticiens au choix d’un estimateur est l’estimateur sans biais de variance minimale (minimum variance unbiased estimator, MVUE) : parmi tous les estimateurs sans biais, prendre celui qui varie le moins. Cette réponse est élégante, mais elle n’est pas toujours la meilleure au sens de l’erreur totale, et c’est là que naît le dilemme.

Transposons. La machine apprise f^H,Dn\hat{f}_{\mathcal{H}, D_n} est, elle aussi, un estimateur : elle estime f∗f^* à partir de l’échantillon DnD_n. Pour un GPA xx fixé, sa prédiction f^(x)\hat{f}(x) change d’un échantillon à l’autre. On définit donc, en chaque point xx :

Biais(f^(x))=EDn[f^(x)]−f∗(x),Var(f^(x))=EDn[(f^(x)−EDn[f^(x)])2]\text{Biais}\big(\hat{f}(x)\big) = \mathbb{E}_{D_n}\big[\hat{f}(x)\big] - f^*(x), \qquad \text{Var}\big(\hat{f}(x)\big) = \mathbb{E}_{D_n}\Big[\big(\hat{f}(x) - \mathbb{E}_{D_n}[\hat{f}(x)]\big)^2\Big]
  • EDn\mathbb{E}_{D_n} désigne la moyenne sur tous les échantillons de taille nn que l’on aurait pu tirer ;
  • EDn[f^(x)]\mathbb{E}_{D_n}[\hat{f}(x)] est donc la prédiction moyenne en xx, celle d’une « machine moyenne » ;
  • le biais compare cette machine moyenne à la vérité f∗(x)f^*(x) ;
  • la variance mesure à quel point la prédiction en xx bouge quand l’échantillon change.

Si le salaire s’écrit Y=f∗(x)+εY = f^*(x) + \varepsilon en xx, avec un bruit ε\varepsilon de moyenne nulle, de variance σ2\sigma^2 et indépendant de l’échantillon d’apprentissage, l’erreur quadratique attendue en xx se décompose en trois termes (exercice 3) :

E[(Y−f^(x))2]=σ2⏟bruit+Biais2(f^(x))⏟biais au carreˊ+Var(f^(x))⏟variance\mathbb{E}\Big[\big(Y - \hat{f}(x)\big)^2\Big] = \underbrace{\sigma^2}_{\text{bruit}} + \underbrace{\text{Biais}^2\big(\hat{f}(x)\big)}_{\text{biais au carré}} + \underbrace{\text{Var}\big(\hat{f}(x)\big)}_{\text{variance}}

Chaque terme se relie à ce que vous connaissez déjà.

  1. σ2\sigma^2 est l’erreur irréductible : c’est le risque de Bayes R∗R^* du chapitre 3. Aucune machine n’y échappe.
  2. Le biais au carré reflète l’erreur d’approximation : même en moyennant sur tous les échantillons possibles, un espace H\mathcal{H} trop pauvre reste loin de f∗f^*.
  3. La variance reflète l’erreur d’estimation : c’est la part d’erreur due au fait que DnD_n n’est qu’un échantillon parmi d’autres.

Biais et variance se définissent en moyennant sur « tous les échantillons possibles ». Dans la vraie vie, vous n’en avez qu’un. Mais sur une population simulée, dont on connaît f∗f^*, on peut tirer des milliers d’échantillons et tout mesurer. C’est l’expérience la plus instructive de ce cours.

import numpy as np
from numpy.polynomial import Polynomial
rng = np.random.default_rng(1)
def f_star(x): # salaire moyen de la population (k$)
return 70 - 25 * np.exp(-2 * (x - 2))
n, sigma, repetitions = 30, 4.0, 2000
grille = np.linspace(2.02, 3.98, 50) # centres de 50 cases de [2, 4], où l'on mesure biais et variance
for degre in [0, 1, 2, 3, 4, 6, 8]:
predictions = np.empty((repetitions, grille.size))
for r in range(repetitions):
x = rng.uniform(2, 4, n) # un nouvel échantillon de 30 diplômés
y = f_star(x) + rng.normal(0, sigma, n)
modele = Polynomial.fit(x, y, degre) # moindres carrés dans H = polynômes de degré p
predictions[r] = modele(grille)
moyenne = predictions.mean(axis=0) # la « machine moyenne »
biais2 = np.mean((moyenne - f_star(grille)) ** 2)
variance = np.mean(predictions.var(axis=0))
print(f"degré {degre} : biais² {biais2:7.2f} variance {variance:7.2f} "
f"erreur attendue {sigma**2 + biais2 + variance:7.2f}")

Avec 30 diplômés par échantillon, σ=4\sigma = 4 et 2 000 échantillons, une telle simulation donne des valeurs proches de celles du tableau ci-dessous. Elles varient un peu d’un tirage à l’autre (et d’un générateur aléatoire à l’autre) ; la dernière colonne donne en plus le risque empirique moyen, mesuré sur les données d’apprentissage :

Degré ppBiais²VarianceErreur attendue (1616 + biais² + variance)Risque empirique moyen
040,41,958,354,5
17,81,925,722,1
20,82,018,814,9
30,052,718,713,9
40,004,320,313,3
60,0028,644,612,3
80,71 3001 31711,2
0123468degré p du polynôme (30 diplômés par échantillon)0,11101001000k$² (échelle log)bruit σ² = 16biais² ≈ 0 aux degrés 4 et 6minimum :18,8 et 18,7passe sous le bruit :si on choisissait ainsi,on prendrait le degré 8biais²varianceerreur attendue = 16 + biais² + variancerisque empirique (apprentissage)
Le tableau en image (échelle logarithmique). L'erreur attendue (en vert) est la somme du bruit, du biais² et de la variance : elle forme un U. Le risque empirique (en rose) ne fait que baisser et désignerait le pire modèle.

Lisons ce tableau attentivement, car il contient tout le chapitre.

  • Le biais² retrouve l’erreur d’approximation. 40,4 ; 7,8 ; 0,8 ; 0,05 : ce sont, aux fluctuations près, les valeurs 40,45 ; 7,85 ; 0,76 ; 0,044 calculées au chapitre 3.
  • La variance explose avec le degré. Modeste jusqu’au degré 3, elle devient énorme au degré 8 : avec 30 points seulement, un polynôme de degré 8 fait des bonds considérables là où les données sont rares, en particulier aux bords de l’intervalle.
  • L’erreur attendue a une forme en U, minimale vers les degrés 2 et 3. C’est le bon compromis pour 30 diplômés.
  • Le risque empirique, lui, ne fait que baisser (54,5 puis 22,1, 14,9… jusqu’à 11,2), et passe même sous le bruit σ2=16\sigma^2 = 16 dès le degré 2. C’est l’optimisme du chapitre 2 en chiffres : si l’on choisissait le degré sur le risque empirique, on prendrait le pire modèle du tableau.
234GPA4050607080salaire prédit (k$)degré 1 :biais fortf*machine moyenne234GPAdegré 3 :bon compromis234GPAdegré 8 :variance énorme
Vingt échantillons, vingt machines apprises. Au degré 1, elles se ressemblent mais ratent toutes la courbure (biais). Au degré 8, leur moyenne suit f*, mais chacune s'en écarte fortement, surtout aux bords (variance).

On résume souvent ce dilemme par un schéma : en abscisse, la capacité du modèle (sa flexibilité : degré du polynôme, profondeur d’un arbre, nombre de paramètres…) ; en ordonnée, les erreurs.

capacité optimalecapacité du modèle (degré, profondeur, nombre de paramètres…)erreursous-apprentissage(le biais domine)surapprentissage(la variance domine)biais²variancebruit σ² (irréductible)erreur de généralisation
L'erreur de généralisation (en vert) est la somme du bruit, du biais² et de la variance. Son minimum, la capacité optimale, sépare la zone où le biais domine de celle où la variance domine.
  • À gauche, dans la zone de sous-apprentissage (underfitting), le biais domine : le modèle est trop rigide. Il se trompe beaucoup, y compris sur ses données d’apprentissage.
  • À droite, dans la zone de surapprentissage (overfitting), la variance domine : le modèle suit le bruit de l’échantillon et généralise mal.
  • Le minimum du U est la capacité optimale. Elle dépend de nn : avec 3 000 diplômés au lieu de 30, la variance de chaque degré serait environ cent fois plus faible, et la capacité optimale se déplacerait vers la droite.

Le diagnostic pratique (comparer le score d’apprentissage et le score sur des données non vues) et le tableau des « boutons de complexité » des modèles classiques sont présentés dans le cours d’Apprentissage automatique. Ici, retenez le mécanisme : chaque bouton déplace le modèle sur l’axe de la capacité.

Revenons au MVUE. Viser un biais nul est-il toujours une bonne idée ? Le dilemme dit que non : un estimateur un peu biaisé mais beaucoup moins variable peut avoir une erreur totale plus petite.

0,00,20,40,60,81,01,2facteur de rétrécissement a (estimateur a·Ȳ)01234567k$²Ȳ sans biais (a = 1) : 40,5 Ȳ : biais² 1 + variance 1 = 2biais² = ((1 − a) μ)²variance = a² × 4erreur quadratique moyenne
Rétrécir Ȳ vers 0 ajoute du biais² mais retire de la variance. Pour μ = 2, le meilleur compromis est a = 0,5 : l'erreur tombe de 4 à 2.

C’est exactement l’idée de la régularisation. Au lieu de minimiser le seul risque empirique, on ajoute une pénalité sur la taille des coefficients. Pour la régression ridge :

β^=arg⁡min⁡β  ∑i=1n(Yi−∑j=0pβjXij)2+λ∑j=1pβj2\hat{\beta} = \arg\min_{\beta} \; \sum_{i=1}^{n} \Big(Y_i - \sum_{j=0}^{p} \beta_j X_i^j\Big)^2 + \lambda \sum_{j=1}^{p} \beta_j^2
  • le premier terme est la somme des carrés des résidus (le risque empirique, à un facteur près) ;
  • le second pénalise les grands coefficients, sauf l’ordonnée à l’origine β0\beta_0 ;
  • λ≥0\lambda \ge 0 règle la force de la pénalité : λ=0\lambda = 0 redonne les moindres carrés, un λ\lambda très grand écrase tous les coefficients vers 0.

En augmentant λ\lambda, on ajoute du biais (les coefficients sont tirés vers 0) et l’on réduit la variance (le polynôme ne peut plus faire de grands bonds). Un polynôme de degré 8 régularisé peut ainsi redevenir raisonnable avec 30 points. La régularisation ne change pas l’espace H\mathcal{H}, elle change la façon d’y choisir : c’est une autre manière de régler la capacité.

  • Le biais d’un estimateur est l’écart entre sa valeur moyenne et la vraie valeur (négatif : il sous-estime ; positif : il surestime). Sa variance mesure sa dispersion d’un échantillon à l’autre.
  • Une machine apprise est un estimateur de f∗f^* : en chaque xx, on définit son biais et sa variance en moyennant sur les échantillons possibles.
  • En régression quadratique : erreur attendue = σ2\sigma^2 + biais² + variance. Le bruit est irréductible, le biais² reflète l’erreur d’approximation, la variance l’erreur d’estimation.
  • Quand la capacité augmente, le biais baisse et la variance monte : l’erreur de généralisation a une forme en U, et la capacité optimale dépend de la taille de l’échantillon.
  • Le risque empirique décroît toujours avec la capacité : il ne permet pas de choisir la capacité.
  • La régularisation (ridge, par exemple) accepte un peu de biais pour réduire beaucoup la variance, à l’opposé de la logique du MVUE.

Exercice · Lire un biais

facile

Trois méthodes estiment le salaire médian d’une promotion, qui vaut réellement 60 k$. En les appliquant à 1 000 échantillons simulés, on obtient :

  • méthode A : moyenne des estimations 60,1, écart-type 6 ;
  • méthode B : moyenne 57, écart-type 1 ;
  • méthode C : moyenne 63, écart-type 4.

Donnez le signe du biais de chaque méthode et calculez (approximativement) son erreur quadratique moyenne. Laquelle préférez-vous ?

Voir la solution

L’erreur quadratique moyenne vaut biais² + variance, avec variance = écart-type².

  • A : biais ≈+0,1\approx +0{,}1 (quasi sans biais), variance 3636, erreur ≈36\approx 36.
  • B : biais −3-3 (elle sous-estime), variance 11, erreur 9+1=109 + 1 = 10.
  • C : biais +3+3 (elle surestime), variance 1616, erreur 9+16=259 + 16 = 25.

La méthode B, pourtant biaisée, a la plus petite erreur quadratique moyenne. Si l’on sait qu’elle sous-estime de 3 environ, on peut même la corriger. La méthode A est sans biais, mais trop instable pour être utile sur un seul échantillon.

En code

vraie_valeur = 60
methodes = {"A": (60.1, 6), "B": (57, 1), "C": (63, 4)} # (moyenne, écart-type)
for nom, (moyenne, ecart_type) in methodes.items():
biais = moyenne - vraie_valeur
eqm = biais ** 2 + ecart_type ** 2 # erreur quadratique = biais² + variance
print(nom, round(biais, 1), round(eqm, 2))
# A 0.1 36.01 / B -3 10 / C 3 25 : B a la plus petite erreur

Exercice · Rétrécir un estimateur

moyen

On estime une quantité μ=10\mu = 10 par Yˉ\bar{Y}, sans biais, de variance 2525. On propose l’estimateur θ^=0,8 Yˉ\hat{\theta} = 0{,}8\,\bar{Y}.

  1. Calculez son biais, sa variance et son erreur quadratique moyenne. Est-il meilleur que Yˉ\bar{Y} ?
  2. Pour quelles valeurs de μ\mu l’estimateur 0,8 Yˉ0{,}8\,\bar{Y} devient-il moins bon que Yˉ\bar{Y} ?
Voir la solution
  1. Biais =0,8×10−10=−2= 0{,}8 \times 10 - 10 = -2, donc biais² =4= 4. Variance =0,82×25=0,64×25=16= 0{,}8^2 \times 25 = 0{,}64 \times 25 = 16. Erreur =4+16=20= 4 + 16 = 20, contre 2525 pour Yˉ\bar{Y} : il est meilleur.
  2. Pour une valeur quelconque de μ\mu, l’erreur de 0,8 Yˉ0{,}8\,\bar{Y} vaut (0,2 μ)2+16=0,04 μ2+16(0{,}2\,\mu)^2 + 16 = 0{,}04\,\mu^2 + 16. Elle dépasse 2525 quand 0,04 μ2>90{,}04\,\mu^2 > 9, soit μ2>225\mu^2 > 225, c’est-à-dire ∣μ∣>15\lvert \mu \rvert > 15. Le rétrécissement vers 0 n’est rentable que si la vraie valeur n’est pas trop loin de 0 : on échange un risque de biais contre un gain de variance, et le pari peut être perdant. D’où l’intérêt de régler l’intensité du rétrécissement sur des données.

En code

import numpy as np
mu, var_moyenne, a = 10, 25, 0.8
biais = a * mu - mu
variance = a ** 2 * var_moyenne
print(round(biais, 2), round(variance, 2), round(biais ** 2 + variance, 2)) # -2.0 16.0 20.0
# Question 2 : erreur de 0,8 Ȳ en fonction de mu, comparée aux 25 de Ȳ
eqm = lambda m: (0.2 * m) ** 2 + 16
print([round(eqm(m), 2) for m in (14, 15, 16)]) # [23.84, 25.0, 26.24] : seuil |mu| = 15
# Vérification par simulation (Ȳ de loi normale, moyenne mu, variance 25)
rng = np.random.default_rng(0)
y_barre = rng.normal(mu, 5, 1_000_000)
print(round(np.mean((a * y_barre - mu) ** 2), 2)) # 20.01

Exercice · Démontrer la décomposition

difficile

En un point xx fixé, on suppose Y=f∗(x)+εY = f^*(x) + \varepsilon, avec E[ε]=0\mathbb{E}[\varepsilon] = 0, Var(ε)=σ2\text{Var}(\varepsilon) = \sigma^2, et ε\varepsilon indépendant de l’échantillon d’apprentissage DnD_n (donc de f^(x)\hat{f}(x)). On note fˉ(x)=EDn[f^(x)]\bar{f}(x) = \mathbb{E}_{D_n}[\hat{f}(x)]. Démontrez que

E[(Y−f^(x))2]=σ2+(fˉ(x)−f∗(x))2+E[(f^(x)−fˉ(x))2]\mathbb{E}\big[(Y - \hat{f}(x))^2\big] = \sigma^2 + \big(\bar{f}(x) - f^*(x)\big)^2 + \mathbb{E}\big[(\hat{f}(x) - \bar{f}(x))^2\big]
Voir la solution

Écrivons Y−f^(x)=ε+(f∗(x)−fˉ(x))+(fˉ(x)−f^(x))Y - \hat{f}(x) = \varepsilon + \big(f^*(x) - \bar{f}(x)\big) + \big(\bar{f}(x) - \hat{f}(x)\big), somme de trois termes : le bruit, un terme constant (moins le biais), et un terme aléatoire de moyenne nulle.

En élevant au carré et en prenant l’espérance, on obtient les trois carrés et trois doubles produits.

  • Les carrés donnent E[ε2]=σ2\mathbb{E}[\varepsilon^2] = \sigma^2, puis (f∗(x)−fˉ(x))2=Biais2\big(f^*(x) - \bar{f}(x)\big)^2 = \text{Biais}^2, puis E[(fˉ(x)−f^(x))2]=Var(f^(x))\mathbb{E}\big[(\bar{f}(x) - \hat{f}(x))^2\big] = \text{Var}(\hat{f}(x)).
  • Double produit bruit × constante : 2 (f∗(x)−fˉ(x)) E[ε]=02\,(f^*(x) - \bar{f}(x))\,\mathbb{E}[\varepsilon] = 0.
  • Double produit bruit × terme aléatoire : par indépendance, 2 E[ε] E[fˉ(x)−f^(x)]=02\,\mathbb{E}[\varepsilon]\,\mathbb{E}[\bar{f}(x) - \hat{f}(x)] = 0.
  • Double produit constante × terme aléatoire : 2 (f∗(x)−fˉ(x)) E[fˉ(x)−f^(x)]=02\,(f^*(x) - \bar{f}(x))\,\mathbb{E}[\bar{f}(x) - \hat{f}(x)] = 0, car E[f^(x)]=fˉ(x)\mathbb{E}[\hat{f}(x)] = \bar{f}(x).

Il reste bien σ2+Biais2+Var\sigma^2 + \text{Biais}^2 + \text{Var}. L’hypothèse d’indépendance entre le nouveau bruit et l’échantillon d’apprentissage est essentielle : c’est elle qui traduit que l’on évalue la machine sur un nouveau diplômé.

En code

import numpy as np
rng = np.random.default_rng(0)
f_star = lambda x: 70 - 25 * np.exp(-2 * (x - 2))
sigma, n, x0 = 4, 30, 2.2 # point x fixé : GPA 2,2
pred, y_neuf = [], []
for _ in range(20_000): # un échantillon D_n par répétition
x = rng.uniform(2, 4, n)
y = f_star(x) + rng.normal(0, sigma, n)
b1, b0 = np.polyfit(x, y, 1) # machine apprise : une droite
pred.append(b0 + b1 * x0)
y_neuf.append(f_star(x0) + rng.normal(0, sigma)) # nouveau diplômé, bruit indépendant
pred, y_neuf = np.array(pred), np.array(y_neuf)
gauche = np.mean((y_neuf - pred) ** 2)
biais2 = (pred.mean() - f_star(x0)) ** 2
variance = pred.var()
print(round(gauche, 2), round(sigma ** 2 + biais2 + variance, 2)) # 27.17 27.15 : égaux
print(round(biais2, 2), round(variance, 2)) # biais² 7.91, variance 3.24