Aller au contenu

Situez votre modèle face à la machine de Bayes

Votre droite prédit les salaires avec une erreur quadratique moyenne de, disons, 24 k$² sur la population. Est-ce bien ou mal ? Impossible de répondre sans un point de comparaison. Et le plus parlant de tous serait : quelle est la meilleure erreur possible, celle qu’aucune machine, aussi géniale soit-elle, ne pourrait battre ?

C’est l’étape 8 de la roue, l’analyse théorique. Dans ce chapitre, vous allez rencontrer la machine de Bayes, qui atteint cette erreur minimale, et apprendre à découper l’écart entre votre modèle et elle en deux morceaux qui ne se soignent pas de la même façon.

Reprenons le cadre du chapitre 2. La population est décrite par une loi PXYP_{XY} inconnue, la perte ℓ\ell est fixée, et le risque d’une fonction ff est R(f)=E[ℓ(Y,f(X))]R(f) = \mathbb{E}[\ell(Y, f(X))]. Cette fois, oublions toute restriction : cherchons la meilleure fonction dans l’univers YX\mathcal{Y}^{\mathcal{X}} de toutes les fonctions possibles.

f∗=arg⁡min⁡f∈YXR(f),R∗=R(f∗)f^* = \arg\min_{f \in \mathcal{Y}^{\mathcal{X}}} R(f), \qquad R^* = R(f^*)
  • f∗f^* s’appelle la machine de Bayes (Bayes learner, ou règle de Bayes) ;
  • R∗R^* est le risque de Bayes : la plus petite erreur atteignable pour ce problème et cette perte.

Pour les pertes usuelles (quadratique L2L_2, absolue L1L_1, 0-1), cette machine existe et l’on sait l’écrire. Pourquoi R∗R^* n’est-il pas nul ? Parce que XX ne détermine pas complètement YY. Deux diplômés qui ont exactement le même GPA ne gagnent pas le même salaire : l’un a fait un stage chez un grand groupe, l’autre a choisi une association, un troisième a mieux négocié. Tout ce que XX ne mesure pas se comporte, vu de XX, comme du bruit. R∗R^* mesure ce bruit.

Voici le résultat central : la machine de Bayes change de visage avec la perte.

PerteMachine de Bayes f∗(x)f^*(x)En mots
Quadratique (L2L_2)E[Y∣X=x]\mathbb{E}[Y \mid X = x]le salaire moyen des diplômés de GPA xx
Absolue (L1L_1)la médiane de YY sachant X=xX = xle salaire médian des diplômés de GPA xx
0-1 (classification)arg⁡max⁡yP(Y=y∣X=x)\arg\max_y P(Y = y \mid X = x)la classe la plus probable sachant xx

On retrouve, point par point, ce que vous avez vu au chapitre 2 pour une constante (moyenne pour L2L_2, médiane pour L1L_1). La différence : on calcule maintenant la moyenne ou la médiane à xx fixé, pour chaque valeur de xx.

Pour la perte quadratique, la machine de Bayes est l’espérance conditionnelle :

f∗(x)=E[Y∣X=x]=∫y p(y∣x) dyf^*(x) = \mathbb{E}[Y \mid X = x] = \int y \, p(y \mid x) \, dy

où p(y∣x)p(y \mid x) est la densité des salaires parmi les diplômés de GPA xx. Attention à la nuance : c’est l’espérance de YY sachant X=xX = x, pas l’espérance de YY tout court (qui serait le salaire moyen de toute la population, sans tenir compte du GPA).

Pourquoi ce choix est-il optimal ? Pour n’importe quelle fonction ff, on peut montrer (exercice 3) que

R(f)=R∗+E[(f(X)−f∗(X))2]R(f) = R^* + \mathbb{E}\Big[\big(f(X) - f^*(X)\big)^2\Big]

Le second terme est positif et ne s’annule que si f=f∗f = f^* (presque partout). Autrement dit, le risque de n’importe quelle fonction est le risque de Bayes plus sa distance quadratique moyenne à f∗f^*. Si le salaire s’écrit Y=f∗(X)+εY = f^*(X) + \varepsilon, avec un bruit ε\varepsilon de moyenne nulle et de variance σ2\sigma^2, alors R∗=σ2R^* = \sigma^2.

2,002,252,502,753,003,253,503,754,00GPA304050607080salaire (k$)p(y | x) : salaires desdiplômés de GPA xbruit autour de f* :σ² = 16 = R*diplômés (population simulée)machine de Bayes f*(x) = E[Y | X = x]meilleure droite : risque 16 + 7,85
La machine de Bayes passe par le centre de chaque densité conditionnelle p(y | x) : c'est le salaire moyen à GPA fixé. La dispersion autour d'elle (variance 16) est le risque de Bayes, qu'aucune machine ne peut réduire. La meilleure droite ajoute 7,85 d'erreur d'approximation.

Pour la perte 0-1, se tromper coûte 1 quelle que soit l’erreur. La meilleure décision, pour un xx donné, est donc la classe qui a le plus de chances d’être la bonne. L’erreur de Bayes vaut alors, en moyenne sur les xx, la probabilité de ne pas être dans cette classe :

R∗=E[1−max⁡yP(Y=y∣X)]R^* = \mathbb{E}\Big[1 - \max_y P(Y = y \mid X)\Big]
bas(moins de 3)f* = 0 · erreur 0,20moyen(3 à 3,5)f* = 0 · erreur 0,45haut(3,5 et plus)f* = 1 · erreur 0,20seuil0,5Y = 1(> 60 k$)Y = 0largeur = P(X = x) · hachures = erreurs de f*, aire totale R* = 0,325
Chaque colonne est une tranche de GPA, de largeur P(X = x). La machine de Bayes prédit la classe majoritaire de la colonne ; les hachures sont ses erreurs, et leur aire totale vaut R* = 0,3 × 0,20 + 0,5 × 0,45 + 0,2 × 0,20 = 0,325.

Nous avons maintenant trois fonctions en main, qu’il ne faut surtout pas confondre :

  • f∗f^*, la machine de Bayes : la meilleure dans tout l’univers YX\mathcal{Y}^{\mathcal{X}} ;
  • fH⋄f^\diamond_{\mathcal{H}} (lisez « f diamant »), la meilleure de l’espace H\mathcal{H} : la fonction de H\mathcal{H} qui minimise le vrai risque ;
  • f^H,Dn\hat{f}_{\mathcal{H}, D_n}, la machine apprise : celle de H\mathcal{H} qui minimise le risque empirique sur nos nn données.
univers de toutes les fonctionsHmachine apprisemeilleure de Hmachine de Bayesestimationapproximation

L’écart entre le risque de la machine apprise et le plancher R∗R^*, qu’on appelle l’excès de risque, se découpe exactement en deux :

R(f^H,Dn)−R∗=R(f^H,Dn)−R(fH⋄)⏟erreur d’estimation+R(fH⋄)−R∗⏟erreur d’approximationR(\hat{f}_{\mathcal{H}, D_n}) - R^* = \underbrace{R(\hat{f}_{\mathcal{H}, D_n}) - R(f^\diamond_{\mathcal{H}})}_{\text{erreur d'estimation}} + \underbrace{R(f^\diamond_{\mathcal{H}}) - R^*}_{\text{erreur d'approximation}}

Chaque terme a une cause précise.

  • L’erreur d’approximation vient de H\mathcal{H} : on ne cherche que dans une fraction de l’univers. Si la vraie relation est courbe et que H\mathcal{H} ne contient que des droites, même la meilleure droite reste loin de f∗f^*. Elle ne dépend pas des données.
  • L’erreur d’estimation vient de DnD_n : on ne dispose que d’une fraction de la population. Avec d’autres diplômés, on aurait appris une autre droite. C’est le prix de l’inférence, du passage de l’échantillon à la population. Elle diminue quand nn augmente.
0,00,10,20,30,40,50,6vrai risque (taux d’erreur)machine de Bayes f*meilleure constante f◇machine apprise f̂0,3250,3250,3250,120,4450,3250,120,110,555R* (bruit)erreur d’approximationerreur d’estimation
Les chiffres de l'exemple : partant du plancher R* = 0,325, se restreindre aux constantes coûte 0,12 (approximation), et n'avoir que 20 diplômés coûte encore 0,11 (estimation).

Réduire l’erreur d’approximation : le théorème de Weierstrass

Section intitulée « Réduire l’erreur d’approximation : le théorème de Weierstrass »

Peut-on rendre l’erreur d’approximation aussi petite que l’on veut ? Pour les polynômes, un théorème classique d’analyse répond oui.

Théorème de Weierstrass. Toute fonction continue sur un segment [a,b][a, b] peut être approchée uniformément d’aussi près que l’on veut par un polynôme : pour tout ε>0\varepsilon > 0, il existe un polynôme PP tel que ∣f(x)−P(x)∣≤ε\lvert f(x) - P(x) \rvert \le \varepsilon pour tout x∈[a,b]x \in [a, b].

Appliqué à notre problème : si le salaire moyen f∗(x)=E[Y∣X=x]f^*(x) = \mathbb{E}[Y \mid X = x] varie continûment avec le GPA, alors en prenant pour H\mathcal{H} les polynômes de degré pp assez grand, on peut rendre l’erreur d’approximation aussi faible que l’on veut. On a donc une échelle d’espaces emboîtés, les polynômes de degré 0, 1, 2…, dont l’erreur d’approximation tend vers 0.

2,02,53,03,54,0GPA45505560657075salaire moyen (k$)f*degré 0degré 1degré 2degré 301234degré p0,0010,010,1110100erreur d’approximation (k$²)40,457,850,760,0440,0017R* = 16
Chaque degré en plus colle davantage à f* : l'erreur d'approximation est divisée par 5 à 20 à chaque pas, et passe sous le bruit R* = 16 dès le degré 1. Dès le degré 3, la courbe est indiscernable de f*.

Peut-on connaître l’erreur d’approximation de son propre modèle ? En général, non : il faudrait connaître f∗f^*. La théorie de l’approximation donne des vitesses (l’erreur décroît d’autant plus vite avec pp que f∗f^* est régulière), mais sous des hypothèses que l’on ne peut pas vérifier sur des données réelles. En pratique, on l’observe indirectement : un modèle qui se trompe beaucoup même sur ses données d’apprentissage souffre d’une forte erreur d’approximation.

Si Weierstrass nous autorise à rendre l’erreur d’approximation aussi petite que l’on veut, pourquoi ne pas prendre un polynôme de degré 50 ? Parce que l’erreur d’estimation, elle, augmente avec la taille de H\mathcal{H}. Plus l’espace est riche, plus il contient de fonctions capables de coller au hasard de l’échantillon, et plus la machine apprise f^\hat{f} risque de s’éloigner de fH⋄f^\diamond_{\mathcal{H}}.

Quand on…Erreur d’approximationErreur d’estimationR∗R^*
agrandit H\mathcal{H} (degré plus élevé)baissemonteinchangé
augmente nn (plus de diplômés)inchangéebaisseinchangé
ajoute une variable (la filière)peut changermonte un peubaisse (plus d’information)

C’est exactement le dilemme biais-variance, que le chapitre suivant rend quantitatif. Retenez d’ici là qu’il n’y a pas d’espace d’hypothèses « le meilleur dans l’absolu » : le bon choix dépend de la quantité de données.

  • La machine de Bayes f∗f^* minimise le risque sur l’univers de toutes les fonctions ; son risque R∗R^* est le plus petit possible et ne dépend que du problème.
  • Pour la perte quadratique, f∗(x)=E[Y∣X=x]f^*(x) = \mathbb{E}[Y \mid X = x] ; pour la perte absolue, c’est la médiane conditionnelle ; pour la perte 0-1, c’est la classe la plus probable sachant xx.
  • f∗f^* est incalculable en pratique, car PXYP_{XY} est inconnue ; elle sert de référence.
  • L’excès de risque R(f^)−R∗R(\hat{f}) - R^* se décompose en erreur d’estimation (échantillon fini) et erreur d’approximation (espace H\mathcal{H} restreint), avec fH⋄f^\diamond_{\mathcal{H}} la meilleure fonction de H\mathcal{H}.
  • Le théorème de Weierstrass garantit qu’avec des polynômes de degré assez élevé, l’erreur d’approximation d’une fonction continue devient aussi petite que l’on veut.
  • Agrandir H\mathcal{H} réduit l’erreur d’approximation mais augmente l’erreur d’estimation ; seule une information nouvelle fait baisser R∗R^*.

Exercice · Calculer une erreur de Bayes

facile

Un recruteur classe les candidatures en « entretien » (Y=1Y = 1) ou « refus » (Y=0Y = 0) selon l’école d’origine, A ou B. Dans la population : 60 % des candidats viennent de A, et 90 % d’entre eux obtiennent un entretien ; 40 % viennent de B, et 30 % d’entre eux obtiennent un entretien. Donnez la machine de Bayes pour la perte 0-1 et son risque R∗R^*.

Voir la solution
  • Pour l’école A, P(Y=1∣A)=0,9>0,5P(Y = 1 \mid A) = 0{,}9 > 0{,}5 : f∗(A)=1f^*(A) = 1, avec une erreur de 0,10{,}1 dans ce groupe.
  • Pour l’école B, P(Y=1∣B)=0,3<0,5P(Y = 1 \mid B) = 0{,}3 < 0{,}5 : f∗(B)=0f^*(B) = 0, avec une erreur de 0,30{,}3 dans ce groupe.

R∗=0,6×0,1+0,4×0,3=0,06+0,12=0,18R^* = 0{,}6 \times 0{,}1 + 0{,}4 \times 0{,}3 = 0{,}06 + 0{,}12 = 0{,}18. Aucune règle fondée sur la seule école ne peut se tromper moins de 18 % du temps.

En code

import numpy as np
p_ecole = np.array([0.6, 0.4]) # P(A), P(B)
p_entretien = np.array([0.9, 0.3]) # P(Y = 1 | école)
f_bayes = (p_entretien > 0.5).astype(int) # classe la plus probable par école
erreur = np.minimum(p_entretien, 1 - p_entretien) # erreur dans chaque groupe
print(f_bayes, erreur) # [1 0] [0.1 0.3]
print(round(np.sum(p_ecole * erreur), 2)) # R* = 0.18

Exercice · Quelle erreur a changé ?

moyen

Pour chaque décision, dites si elle agit sur l’erreur d’approximation, l’erreur d’estimation ou le risque de Bayes R∗R^*, et dans quel sens.

  1. Passer de 200 à 2 000 diplômés, en gardant des droites.
  2. Passer des droites aux polynômes de degré 3, avec les mêmes 200 diplômés.
  3. Ajouter la filière comme seconde variable explicative.
  4. Dans l’exemple du salaire qui plafonne, vérifier que l’erreur d’approximation des constantes (40,45) est égale à la variance de f∗(X)f^*(X). Pourquoi est-ce logique ?
Voir la solution
  1. L’erreur d’estimation baisse (plus de données, droite apprise plus proche de la meilleure droite). L’erreur d’approximation est inchangée : c’est toujours l’espace des droites.
  2. L’erreur d’approximation baisse (de 7,85 à 0,044 dans notre exemple), mais l’erreur d’estimation monte : quatre paramètres à estimer au lieu de deux, avec les mêmes données.
  3. Le risque de Bayes baisse, ou au pire reste égal : on donne plus d’information sur YY, donc le plancher descend. Mais l’espace d’hypothèses change aussi, avec plus de paramètres, donc l’erreur d’estimation augmente un peu.
  4. Pour la perte quadratique, la meilleure constante est c=E[f∗(X)]c = \mathbb{E}[f^*(X)] (la moyenne, comme au chapitre 2, appliquée à f∗(X)f^*(X)). L’erreur d’approximation vaut donc E[(f∗(X)−E[f∗(X)])2]\mathbb{E}[(f^*(X) - \mathbb{E}[f^*(X)])^2], qui est exactement la variance de f∗(X)f^*(X) : ce que la constante ne peut pas capter, c’est précisément la variation du salaire moyen avec le GPA.

En code

import numpy as np
from scipy.integrate import quad
f_star = lambda x: 70 - 25 * np.exp(-2 * (x - 2)) # salaire moyen, X uniforme sur [2, 4]
densite = 1 / 2
# Question 4 : meilleure constante = E[f*(X)], erreur d'approximation = Var(f*(X))
esperance = quad(lambda x: f_star(x) * densite, 2, 4)[0]
variance = quad(lambda x: (f_star(x) - esperance) ** 2 * densite, 2, 4)[0]
print(round(esperance, 2), round(variance, 2)) # 63.86 40.45
# Vérification par balayage des constantes c
c = np.linspace(50, 65, 1501)
erreur = [quad(lambda x: (f_star(x) - ci) ** 2 * densite, 2, 4)[0] for ci in c]
print(round(c[np.argmin(erreur)], 2), round(min(erreur), 2)) # 63.86 40.45

Exercice · Pourquoi l'espérance conditionnelle ?

difficile

On note f∗(x)=E[Y∣X=x]f^*(x) = \mathbb{E}[Y \mid X = x]. Montrez que, pour toute fonction ff,

E[(Y−f(X))2]=E[(Y−f∗(X))2]+E[(f∗(X)−f(X))2]\mathbb{E}\big[(Y - f(X))^2\big] = \mathbb{E}\big[(Y - f^*(X))^2\big] + \mathbb{E}\big[(f^*(X) - f(X))^2\big]

et concluez que f∗f^* est la machine de Bayes pour la perte quadratique. On pourra écrire Y−f(X)=(Y−f∗(X))+(f∗(X)−f(X))Y - f(X) = (Y - f^*(X)) + (f^*(X) - f(X)).

Voir la solution

On développe le carré :

(Y−f(X))2=(Y−f∗(X))2+(f∗(X)−f(X))2+2 (Y−f∗(X))(f∗(X)−f(X))(Y - f(X))^2 = (Y - f^*(X))^2 + (f^*(X) - f(X))^2 + 2\,(Y - f^*(X))(f^*(X) - f(X))

Il suffit de montrer que le double produit est d’espérance nulle. Conditionnons par XX : sachant XX, le facteur g(X)=f∗(X)−f(X)g(X) = f^*(X) - f(X) est connu, donc

E[(Y−f∗(X)) g(X)∣X]=g(X) (E[Y∣X]−f∗(X))=g(X)×0=0\mathbb{E}\big[(Y - f^*(X))\,g(X) \mid X\big] = g(X)\,\big(\mathbb{E}[Y \mid X] - f^*(X)\big) = g(X) \times 0 = 0

En prenant l’espérance (propriété de l’espérance totale), le double produit a une espérance nulle, d’où l’égalité annoncée.

Le premier terme de droite ne dépend pas de ff, et le second est positif ou nul. Le risque est donc minimal quand le second terme est nul, c’est-à-dire quand f(X)=f∗(X)f(X) = f^*(X) presque sûrement. La machine de Bayes pour la perte quadratique est bien l’espérance conditionnelle, et R∗=E[(Y−f∗(X))2]R^* = \mathbb{E}[(Y - f^*(X))^2].

En code

import numpy as np
rng = np.random.default_rng(0)
n = 1_000_000
x = rng.uniform(2, 4, n)
f_star = lambda x: 70 - 25 * np.exp(-2 * (x - 2)) # E[Y | X = x]
y = f_star(x) + rng.normal(0, 4, n) # bruit de variance 16
f = lambda x: 24 + 11 * x # une fonction quelconque
gauche = np.mean((y - f(x)) ** 2)
droite = np.mean((y - f_star(x)) ** 2) + np.mean((f_star(x) - f(x)) ** 2)
double_produit = np.mean(2 * (y - f_star(x)) * (f_star(x) - f(x)))
print(round(gauche, 2), round(droite, 2)) # 71.37 71.32 : égaux au bruit près
print(round(double_produit, 3)) # 0.05 : proche de 0 (l'écart entre les deux)