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.
La meilleure machine possible
Section intitulée « La meilleure machine possible »Reprenons le cadre du chapitre 2. La population est décrite par une loi inconnue, la perte est fixée, et le risque d’une fonction est . Cette fois, oublions toute restriction : cherchons la meilleure fonction dans l’univers de toutes les fonctions possibles.
- s’appelle la machine de Bayes (Bayes learner, ou règle de Bayes) ;
- est le risque de Bayes : la plus petite erreur atteignable pour ce problème et cette perte.
Pour les pertes usuelles (quadratique , absolue , 0-1), cette machine existe et l’on sait l’écrire. Pourquoi n’est-il pas nul ? Parce que ne détermine pas complètement . 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 ne mesure pas se comporte, vu de , comme du bruit. mesure ce bruit.
Sa forme dépend de la perte
Section intitulée « Sa forme dépend de la perte »Voici le résultat central : la machine de Bayes change de visage avec la perte.
| Perte | Machine de Bayes | En mots |
|---|---|---|
| Quadratique () | le salaire moyen des diplômés de GPA | |
| Absolue () | la médiane de sachant | le salaire médian des diplômés de GPA |
| 0-1 (classification) | la classe la plus probable sachant |
On retrouve, point par point, ce que vous avez vu au chapitre 2 pour une constante (moyenne pour , médiane pour ). La différence : on calcule maintenant la moyenne ou la médiane à fixé, pour chaque valeur de .
En régression, l’espérance conditionnelle
Section intitulée « En régression, l’espérance conditionnelle »Pour la perte quadratique, la machine de Bayes est l’espérance conditionnelle :
où est la densité des salaires parmi les diplômés de GPA . Attention à la nuance : c’est l’espérance de sachant , pas l’espérance de 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 , on peut montrer (exercice 3) que
Le second terme est positif et ne s’annule que si (presque partout). Autrement dit, le risque de n’importe quelle fonction est le risque de Bayes plus sa distance quadratique moyenne à . Si le salaire s’écrit , avec un bruit de moyenne nulle et de variance , alors .
En classification, la classe la plus probable
Section intitulée « En classification, la classe la plus probable »Pour la perte 0-1, se tromper coûte 1 quelle que soit l’erreur. La meilleure décision, pour un 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 , la probabilité de ne pas être dans cette classe :
Trois fonctions, deux écarts
Section intitulée « Trois fonctions, deux écarts »Nous avons maintenant trois fonctions en main, qu’il ne faut surtout pas confondre :
- , la machine de Bayes : la meilleure dans tout l’univers ;
- (lisez « f diamant »), la meilleure de l’espace : la fonction de qui minimise le vrai risque ;
- , la machine apprise : celle de qui minimise le risque empirique sur nos données.
L’écart entre le risque de la machine apprise et le plancher , qu’on appelle l’excès de risque, se découpe exactement en deux :
Chaque terme a une cause précise.
- L’erreur d’approximation vient de : on ne cherche que dans une fraction de l’univers. Si la vraie relation est courbe et que ne contient que des droites, même la meilleure droite reste loin de . Elle ne dépend pas des données.
- L’erreur d’estimation vient de : 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 augmente.
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 peut être approchée uniformément d’aussi près que l’on veut par un polynôme : pour tout , il existe un polynôme tel que pour tout .
Appliqué à notre problème : si le salaire moyen varie continûment avec le GPA, alors en prenant pour les polynômes de degré 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.
Peut-on connaître l’erreur d’approximation de son propre modèle ? En général, non : il faudrait connaître . La théorie de l’approximation donne des vitesses (l’erreur décroît d’autant plus vite avec que 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.
Le prix d’un espace plus grand
Section intitulée « Le prix d’un espace plus grand »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 . Plus l’espace est riche, plus il contient de fonctions capables de coller au hasard de l’échantillon, et plus la machine apprise risque de s’éloigner de .
| Quand on… | Erreur d’approximation | Erreur d’estimation | |
|---|---|---|---|
| agrandit (degré plus élevé) | baisse | monte | inchangé |
| augmente (plus de diplômés) | inchangée | baisse | inchangé |
| ajoute une variable (la filière) | peut changer | monte un peu | baisse (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.
En résumé
Section intitulée « En résumé »- La machine de Bayes minimise le risque sur l’univers de toutes les fonctions ; son risque est le plus petit possible et ne dépend que du problème.
- Pour la perte quadratique, ; pour la perte absolue, c’est la médiane conditionnelle ; pour la perte 0-1, c’est la classe la plus probable sachant .
- est incalculable en pratique, car est inconnue ; elle sert de référence.
- L’excès de risque se décompose en erreur d’estimation (échantillon fini) et erreur d’approximation (espace restreint), avec la meilleure fonction de .
- 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 réduit l’erreur d’approximation mais augmente l’erreur d’estimation ; seule une information nouvelle fait baisser .
Exercices
Section intitulée « Exercices »Exercice · Calculer une erreur de Bayes
facileUn recruteur classe les candidatures en « entretien » () ou « refus » () 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 .
Voir la solution
- Pour l’école A, : , avec une erreur de dans ce groupe.
- Pour l’école B, : , avec une erreur de dans ce groupe.
. 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 écoleerreur = np.minimum(p_entretien, 1 - p_entretien) # erreur dans chaque groupeprint(f_bayes, erreur) # [1 0] [0.1 0.3]print(round(np.sum(p_ecole * erreur), 2)) # R* = 0.18p_ecole <- c(A = 0.6, B = 0.4)p_entretien <- c(A = 0.9, B = 0.3) # P(Y = 1 | école)
f_bayes <- as.integer(p_entretien > 0.5) # classe la plus probable par écoleerreur <- pmin(p_entretien, 1 - p_entretien) # erreur dans chaque groupef_bayes; erreur # 1 0 0.1 0.3sum(p_ecole * erreur) # R* = 0.18Exercice · Quelle erreur a changé ?
moyenPour chaque décision, dites si elle agit sur l’erreur d’approximation, l’erreur d’estimation ou le risque de Bayes , et dans quel sens.
- Passer de 200 à 2 000 diplômés, en gardant des droites.
- Passer des droites aux polynômes de degré 3, avec les mêmes 200 diplômés.
- Ajouter la filière comme seconde variable explicative.
- Dans l’exemple du salaire qui plafonne, vérifier que l’erreur d’approximation des constantes (40,45) est égale à la variance de . Pourquoi est-ce logique ?
Voir la solution
- 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.
- 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.
- Le risque de Bayes baisse, ou au pire reste égal : on donne plus d’information sur , 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.
- Pour la perte quadratique, la meilleure constante est (la moyenne, comme au chapitre 2, appliquée à ). L’erreur d’approximation vaut donc , qui est exactement la variance de : 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 npfrom 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 cc = 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.45f_star <- function(x) 70 - 25 * 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 <- integrate(function(x) f_star(x) * densite, 2, 4)$valuevariance <- integrate(function(x) (f_star(x) - esperance)^2 * densite, 2, 4)$valuec(esperance, variance) # 63.86 40.45
# Vérification : la constante qui minimise l'erreur quadratiqueerreur <- function(c) integrate(function(x) (f_star(x) - c)^2 * densite, 2, 4)$valueoptimize(erreur, c(50, 65)) # minimum 63.86, objectif 40.45Exercice · Pourquoi l'espérance conditionnelle ?
difficileOn note . Montrez que, pour toute fonction ,
et concluez que est la machine de Bayes pour la perte quadratique. On pourra écrire .
Voir la solution
On développe le carré :
Il suffit de montrer que le double produit est d’espérance nulle. Conditionnons par : sachant , le facteur est connu, donc
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 , et le second est positif ou nul. Le risque est donc minimal quand le second terme est nul, c’est-à-dire quand presque sûrement. La machine de Bayes pour la perte quadratique est bien l’espérance conditionnelle, et .
En code
import numpy as np
rng = np.random.default_rng(0)n = 1_000_000x = 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 quelconquegauche = 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èsprint(round(double_produit, 3)) # 0.05 : proche de 0 (l'écart entre les deux)set.seed(0)n <- 1e6x <- runif(n, 2, 4)f_star <- function(x) 70 - 25 * exp(-2 * (x - 2)) # E[Y | X = x]y <- f_star(x) + rnorm(n, 0, 4) # bruit de variance 16
f <- function(x) 24 + 11 * x # une fonction quelconquegauche <- mean((y - f(x))^2)droite <- mean((y - f_star(x))^2) + mean((f_star(x) - f(x))^2)double_produit <- mean(2 * (y - f_star(x)) * (f_star(x) - f(x)))c(gauche, droite) # 71.45 71.40 : égaux au bruit prèsdouble_produit # 0.042 : proche de 0