Aller au contenu

Transformez une question en minimisation du risque

« Prédire le salaire à partir du GPA » est une phrase. Un ordinateur, lui, a besoin d’un problème mathématique précis : une liste de candidats possibles, un critère pour les départager, et une procédure pour trouver le meilleur. Ce chapitre fait ce passage, qui correspond aux étapes 2 à 5 de la roue : vous allez voir qu’apprendre, dans ce cadre, revient à minimiser un risque.

Nous gardons notre fil rouge : le service carrières d’une université veut prédire le premier salaire annuel YY (en milliers de dollars) d’un diplômé à partir de son GPA XX (entre 0 et 4).

Commençons par une remarque vertigineuse. Parmi toutes les façons d’associer un salaire à un GPA, il y en a une infinité : des droites, des courbes, des escaliers, des fonctions qui font n’importe quoi entre 3,1 et 3,2. L’ensemble de toutes les fonctions de X\mathcal{X} (les GPA possibles) dans Y\mathcal{Y} (les salaires possibles) se note YX\mathcal{Y}^{\mathcal{X}}. C’est l’univers des fonctions.

Chercher dans tout cet univers est impossible, et d’ailleurs pas souhaitable (vous verrez pourquoi au chapitre 4). On se restreint donc à une famille, l’espace d’hypothèses (hypothesis space), noté H\mathcal{H}. Pour commencer, les droites :

H={f:x↦β0+β1x  ∣  β0,β1∈R}\mathcal{H} = \big\lbrace f : x \mapsto \beta_0 + \beta_1 x \;\big|\; \beta_0, \beta_1 \in \mathbb{R} \big\rbrace
  • β0\beta_0 est l’ordonnée à l’origine : le salaire prédit pour un GPA nul (une valeur théorique, que personne n’observera) ;
  • β1\beta_1 est la pente : le gain de salaire, en milliers de dollars, pour un point de GPA en plus.

Chaque couple (β0,β1)(\beta_0, \beta_1) désigne une hypothèse ; choisir une hypothèse, c’est choisir deux nombres. D’autres espaces sont possibles :

Espace d’hypothèsesFormeNombre de paramètres
Constantesf(x)=β0f(x) = \beta_01
Droitesf(x)=β0+β1xf(x) = \beta_0 + \beta_1 x2
Polynômes de degré ppf(x)=∑j=0pβjxjf(x) = \sum_{j=0}^{p} \beta_j x^jp+1p + 1
Moyennes des kk plus proches voisinsla moyenne des salaires des kk GPA les plus prochesaucun paramètre fixe (non paramétrique)

Choisir H\mathcal{H}, c’est faire une hypothèse sur la forme de la relation (linéaire ou non). C’est un choix de modélisation, pas un résultat : les données viendront seulement choisir dans H\mathcal{H}.

5055606570salaire (k$)1 paramètreconstantes2 paramètresdroites2,53,03,54,0GPA5055606570salaire (k$)4 paramètrespolynômes de degré 32,53,03,54,0GPAnon paramétrique2 plus proches voisins
Les mêmes six diplômés vus par quatre espaces d'hypothèses. Chaque espace impose sa forme : un palier, une droite, une courbe, un escalier. Les données choisissent seulement la meilleure fonction dans chaque famille.

Étape 3 : mesurer l’insatisfaction avec une perte

Section intitulée « Étape 3 : mesurer l’insatisfaction avec une perte »

Pour départager les hypothèses, il faut dire ce que coûte une erreur. C’est le rôle de la fonction de perte (loss function), notée ℓ(y,f(x))\ell(y, f(x)) : elle mesure l’insatisfaction quand on prédit f(x)f(x) alors que la vraie valeur est yy. Plus elle est grande, plus la prédiction est mauvaise.

Les trois pertes les plus courantes :

PerteFormuleUsageCe qu’elle pénalise
Quadratique (L2L_2)(y−f(x))2(y - f(x))^2régressionfortement les grosses erreurs
Absolue (L1L_1)∣y−f(x)∣\lvert y - f(x) \rvertrégression robustetoutes les erreurs proportionnellement
0-111 si y≠f(x)y \neq f(x), 00 sinonclassificationle fait de se tromper, quelle que soit l’erreur

Mais pourquoi s’embêter ? Toutes ces pertes disent « une erreur, c’est mal ». Bonne question ! Elles ne classent pourtant pas les hypothèses de la même façon, et l’exemple suivant le montre de manière spectaculaire.

−3−2−10123écart y − f(x) (k$)02468perteerreur de 3 : pénalité 9pénalité 3erreurs < 1 : le carréest plus indulgentquadratique (y − f(x))²absolue |y − f(x)|0-1 (se tromper coûte 1)
La perte quadratique est plus indulgente que la perte absolue pour les écarts inférieurs à 1, mais explose pour les grands écarts. La perte 0-1 ne voit que le fait de se tromper.

Pourquoi la moyenne pour la perte quadratique ? La somme ∑i(yi−c)2\sum_i (y_i - c)^2 est un polynôme de degré 2 en cc ; sa dérivée −2∑i(yi−c)-2 \sum_i (y_i - c) s’annule pour c=1n∑iyic = \frac{1}{n}\sum_i y_i. Pour la perte absolue, la dérivée de ∑i∣yi−c∣\sum_i \lvert y_i - c \rvert (là où elle existe) vaut « nombre de yiy_i sous cc moins nombre de yiy_i au-dessus de cc » : elle s’annule quand cc coupe l’échantillon en deux moitiés, c’est-à-dire à la médiane.

010 00020 00030 000risque (k$²)perte quadratiqueminimum à la moyenne : 87,150100150200250constante c prédite pour tout le monde (k$)050100150risque (k$)perte absolueminimum à la médiane : 60le 250 tire la moyenne,pas la médiane
Le risque empirique en fonction de la constante c. La parabole de la perte quadratique a son fond à la moyenne (87,1), tirée par le salaire de 250 ; la perte absolue a son minimum à la médiane (60), au milieu des six salaires ordinaires.

Une perte juge une prédiction. Pour juger une hypothèse, on regarde sa perte moyenne. Encore faut-il dire : moyenne sur quoi ?

Posons le cadre. On suppose que chaque diplômé est un tirage d’une loi de probabilité inconnue PXYP_{XY}, qui décrit la population entière (tous les diplômés passés et futurs, avec leur GPA et leur salaire). Nos données sont nn tirages indépendants de cette loi :

Dn={(X1,Y1),…,(Xn,Yn)},(Xi,Yi)∼PXY indeˊpendantsD_n = \big\lbrace (X_1, Y_1), \dots, (X_n, Y_n) \big\rbrace, \qquad (X_i, Y_i) \sim P_{XY} \text{ indépendants}

Le risque (risk) d’une hypothèse ff est sa perte moyenne sur toute la population :

R(f)=E[ℓ(Y,f(X))]R(f) = \mathbb{E}\big[\ell(Y, f(X))\big]

où E\mathbb{E} désigne l’espérance par rapport à un nouveau couple (X,Y)(X, Y) tiré selon PXYP_{XY}. Avec la perte quadratique, R(f)=E[(Y−f(X))2]R(f) = \mathbb{E}\big[(Y - f(X))^2\big] : c’est l’écart quadratique moyen entre le salaire prédit et le salaire réel. On l’appelle aussi erreur réelle, perte espérée (expected loss) ou erreur de généralisation. C’est exactement ce qui nous intéresse : comment l’hypothèse se comportera-t-elle sur les diplômés que nous n’avons pas vus ?

Hélas, PXYP_{XY} est inconnue, donc R(f)R(f) ne se calcule pas. On le remplace par sa version calculable, le risque empirique (empirical risk), qui est la perte moyenne sur l’échantillon :

R^n(f)=1n∑i=1nℓ(Yi,f(Xi))\hat{R}_n(f) = \frac{1}{n} \sum_{i=1}^{n} \ell\big(Y_i, f(X_i)\big)

Pour les droites et la perte quadratique :

R^n(β0,β1)=1n∑i=1n(Yi−β0−β1Xi)2\hat{R}_n(\beta_0, \beta_1) = \frac{1}{n} \sum_{i=1}^{n} \big(Y_i - \beta_0 - \beta_1 X_i\big)^2

Le principe qui consiste à choisir, dans H\mathcal{H}, l’hypothèse de plus petit risque empirique s’appelle la minimisation du risque empirique (empirical risk minimization, ERM) :

f^H,Dn=arg⁡min⁡f∈HR^n(f)\hat{f}_{\mathcal{H}, D_n} = \arg\min_{f \in \mathcal{H}} \hat{R}_n(f)

La notation f^H,Dn\hat{f}_{\mathcal{H}, D_n} rappelle que la machine apprise dépend de deux choix : l’espace H\mathcal{H} (le vôtre) et l’échantillon DnD_n (celui que le hasard vous a donné). Nous la noterons simplement f^\hat{f} quand il n’y a pas d’ambiguïté.

−100102030405060ordonnée à l’origine β₀05101520pente β₁minimum : β̂₀ ≈ 24,16, β̂₁ ≈ 11,32risque empirique 3,12meilleure constante(β₀ = 60, β₁ = 0) : 35
Le risque empirique des droites, calculé sur les six diplômés de l'exemple suivant : chaque point du plan est une droite. Minimiser, c'est trouver le fond de cette cuvette. Elle est très allongée, car augmenter la pente en baissant l'ordonnée à l'origine laisse la droite presque inchangée autour du GPA moyen.

Place au calcul. Pour minimiser R^n(β0,β1)\hat{R}_n(\beta_0, \beta_1), on annule ses dérivées partielles. La dérivée par rapport à β0\beta_0 donne ∑i(Yi−β0−β1Xi)=0\sum_i (Y_i - \beta_0 - \beta_1 X_i) = 0, soit β0=Yˉ−β1Xˉ\beta_0 = \bar{Y} - \beta_1 \bar{X}. En reportant dans la dérivée par rapport à β1\beta_1, on obtient les moindres carrés (least squares) :

β^1=∑i=1n(Xi−Xˉ)(Yi−Yˉ)∑i=1n(Xi−Xˉ)2,β^0=Yˉ−β^1Xˉ\hat{\beta}_1 = \frac{\sum_{i=1}^{n} (X_i - \bar{X})(Y_i - \bar{Y})}{\sum_{i=1}^{n} (X_i - \bar{X})^2}, \qquad \hat{\beta}_0 = \bar{Y} - \hat{\beta}_1 \bar{X}
  • Xˉ\bar{X} et Yˉ\bar{Y} sont les moyennes des GPA et des salaires de l’échantillon ;
  • le numérateur de β^1\hat{\beta}_1 mesure à quel point GPA et salaire varient ensemble (c’est nn fois leur covariance empirique) ;
  • le dénominateur mesure la dispersion des GPA (nn fois leur variance empirique).

La droite obtenue passe toujours par le point moyen (Xˉ,Yˉ)(\bar{X}, \bar{Y}).

2,42,62,83,03,23,43,63,84,0GPA5055606570salaire (k$)0,68−0,851,89−3,511,100,70point moyen (3,17 ; 60)f̂(x) ≈ 24,16 + 11,32 xmeilleure constante (60) : SSE = 210droite des moindres carrés : SSE ≈ 18,74
Les résidus sont les écarts verticaux entre les points et la droite ; les moindres carrés minimisent la somme de leurs carrés (18,74, contre 210 pour la constante). La droite passe par le point moyen.

En Python, le calcul tient en quelques lignes :

import numpy as np
gpa = np.array([2.4, 2.8, 3.0, 3.3, 3.6, 3.9])
salaire = np.array([52, 55, 60, 58, 66, 69]) # en milliers de dollars
# Moindres carrés, formule fermée
xc, yc = gpa - gpa.mean(), salaire - salaire.mean()
b1 = (xc * yc).sum() / (xc ** 2).sum()
b0 = salaire.mean() - b1 * gpa.mean()
print(f"salaire ≈ {b0:.2f} + {b1:.2f} × GPA")
# Risque empirique (perte quadratique) de la droite et de la constante
risque_droite = np.mean((salaire - (b0 + b1 * gpa)) ** 2)
risque_constante = np.mean((salaire - salaire.mean()) ** 2)
print(f"risque empirique : droite {risque_droite:.2f}, constante {risque_constante:.2f}")

Pour des espaces plus riches (plusieurs variables, polynômes), on écrit la même chose sous forme matricielle, et np.linalg.lstsq ou LinearRegression de scikit-learn font le travail. Pour d’autres pertes, il n’y a en général pas de formule fermée : on minimise alors numériquement, par exemple par descente de gradient (voir le cours d’Optimisation numérique).

Nous avons une machine, f^(x)≈24,16+11,32 x\hat{f}(x) \approx 24{,}16 + 11{,}32\,x, et un risque empirique de 3,12. Peut-on annoncer au service carrières que l’erreur typique sera de 3,12≈1,8\sqrt{3{,}12} \approx 1{,}8 k$ ? Certainement pas.

Le risque empirique de la machine apprise est un estimateur optimiste de son vrai risque. La raison est simple : f^\hat{f} a été choisie précisément parce qu’elle faisait bien sur ces six diplômés-là. Elle a profité de leurs particularités. Sur un septième diplômé, elle fera en moyenne moins bien. Et plus l’espace H\mathcal{H} est riche, plus cet optimisme est grand : avec un polynôme de degré 5, on passerait exactement par les six points, avec un risque empirique nul, sans que cela dise quoi que ce soit du septième.

2,252,502,753,003,253,503,754,00GPA404550556065707580salaire (k$)que prédire pour un 7ᵉ diplômé à 2,6 ou à 3,8 ?droite : risque empirique 3,12polynôme de degré 5 : risque empirique 0
Le polynôme de degré 5 a un risque empirique nul : il passe par les six points. Mais entre eux et aux bords, il fait des bonds que rien ne justifie. Son risque empirique ne dit rien de ce qu'il prédira pour un septième diplômé.

Il reste donc deux grandes questions, qui occupent la suite du cours :

  1. Même avec une infinité de données, quelle est la meilleure erreur possible, et à quelle distance en est notre espace H\mathcal{H} ? C’est l’étape 8 de la roue, et l’objet du chapitre 3.
  2. Avec nos nn données, combien perd-on par rapport au meilleur de H\mathcal{H}, et comment choisir la taille de H\mathcal{H} ? C’est le dilemme biais-variance du chapitre 4.
  • L’espace d’hypothèses H\mathcal{H} est la famille de fonctions parmi lesquelles on cherche (droites, polynômes, voisins…) ; c’est un choix de modélisation, pris dans l’univers YX\mathcal{Y}^{\mathcal{X}} de toutes les fonctions.
  • La fonction de perte ℓ\ell mesure l’insatisfaction d’une prédiction : quadratique, absolue ou 0-1. Changer de perte peut changer le meilleur modèle (moyenne ou médiane).
  • Le risque R(f)=E[ℓ(Y,f(X))]R(f) = \mathbb{E}[\ell(Y, f(X))] est la perte moyenne sur la population ; il est incalculable car PXYP_{XY} est inconnue.
  • Le risque empirique R^n(f)\hat{R}_n(f) est la perte moyenne sur l’échantillon ; on le minimise dans H\mathcal{H} (principe ERM).
  • Avec des droites et la perte quadratique, on obtient les moindres carrés : β^1=∑(Xi−Xˉ)(Yi−Yˉ)/∑(Xi−Xˉ)2\hat{\beta}_1 = \sum (X_i - \bar{X})(Y_i - \bar{Y}) / \sum (X_i - \bar{X})^2 et β^0=Yˉ−β^1Xˉ\hat{\beta}_0 = \bar{Y} - \hat{\beta}_1 \bar{X}.
  • Le risque empirique de la machine apprise est optimiste : il ne mesure pas la généralisation.

Exercice · Calculer un risque empirique

facile

Un collègue propose l’hypothèse f(x)=20+12xf(x) = 20 + 12x. Calculez son risque empirique, avec la perte quadratique, sur ces trois diplômés : (GPA 3,0 ; 60 k$), (GPA 3,5 ; 62 k$), (GPA 2,5 ; 52 k$). Même question avec la perte absolue.

Voir la solution

Les prédictions sont f(3,0)=56f(3{,}0) = 56, f(3,5)=62f(3{,}5) = 62 et f(2,5)=50f(2{,}5) = 50. Les écarts y−f(x)y - f(x) valent donc 44, 00 et 22.

  • Perte quadratique : R^3=(16+0+4)/3=20/3≈6,67\hat{R}_3 = (16 + 0 + 4)/3 = 20/3 \approx 6{,}67 (en k$²).
  • Perte absolue : R^3=(4+0+2)/3=2\hat{R}_3 = (4 + 0 + 2)/3 = 2 (en k$).

Remarquez que les deux risques n’ont pas la même unité : pour comparer à un salaire, on prend souvent la racine du risque quadratique (6,67≈2,58\sqrt{6{,}67} \approx 2{,}58 k$).

En code

import numpy as np
gpa = np.array([3.0, 3.5, 2.5])
salaire = np.array([60, 62, 52]) # en k$
prediction = 20 + 12 * gpa # hypothèse du collègue
ecart = salaire - prediction
print(prediction, ecart) # [56. 62. 50.] [4. 0. 2.]
risque_quadratique = np.mean(ecart ** 2)
risque_absolu = np.mean(np.abs(ecart))
print(round(risque_quadratique, 2), risque_absolu) # 6.67 2.0
print(round(np.sqrt(risque_quadratique), 2)) # 2.58 (en k$)

Exercice · Moyenne ou médiane ?

moyen

Le service carrières veut afficher un seul chiffre par filière : « le salaire typique ». Pour une petite filière, les salaires déclarés sont 48, 50, 51, 53 et 120 (en k$).

  1. Quelle constante minimise le risque empirique avec la perte quadratique ? Avec la perte absolue ?
  2. Laquelle afficheriez-vous, et pourquoi ?
Voir la solution
  1. Perte quadratique : la moyenne, (48+50+51+53+120)/5=322/5=64,4(48 + 50 + 51 + 53 + 120)/5 = 322/5 = 64{,}4. Perte absolue : la médiane, 5151.
  2. On afficherait plutôt la médiane. Un étudiant qui lit « salaire typique : 64 400 dollars » sera déçu, puisque quatre diplômés sur cinq gagnent entre 48 000 et 53 000. La perte absolue correspond mieux à l’objectif « donner un ordre de grandeur réaliste » et résiste à la valeur extrême, qu’elle soit réelle ou due à une erreur de saisie. C’est d’ailleurs pour cette raison que les enquêtes de salaire publient presque toujours des médianes.

En code

import numpy as np
salaires = np.array([48, 50, 51, 53, 120]) # en k$
print(salaires.mean(), np.median(salaires)) # 64.4 51.0
# Vérification numérique : on balaie les constantes c et on garde la meilleure
c = np.linspace(40, 130, 9001)
risque_l2 = ((salaires[:, None] - c) ** 2).mean(axis=0)
risque_l1 = np.abs(salaires[:, None] - c).mean(axis=0)
print(c[risque_l2.argmin()], c[risque_l1.argmin()]) # 64.4 51.0

Exercice · Pourquoi le risque empirique est optimiste

difficile

On note fH⋄f^\diamond_{\mathcal{H}} la meilleure hypothèse de H\mathcal{H} au sens du vrai risque (celle qui minimise RR sur H\mathcal{H}), supposée fixe, et f^\hat{f} celle qui minimise le risque empirique sur DnD_n.

  1. Montrez que, pour une hypothèse ff fixée à l’avance, E[R^n(f)]=R(f)\mathbb{E}\big[\hat{R}_n(f)\big] = R(f).
  2. En déduire que E[R^n(f^)]≤E[R(f^)]\mathbb{E}\big[\hat{R}_n(\hat{f})\big] \le \mathbb{E}\big[R(\hat{f})\big]. Interprétez.
Voir la solution
  1. Si ff ne dépend pas des données, chaque terme ℓ(Yi,f(Xi))\ell(Y_i, f(X_i)) a la même loi que ℓ(Y,f(X))\ell(Y, f(X)) pour un nouveau couple, donc la même espérance R(f)R(f). Par linéarité, E[R^n(f)]=1n∑iR(f)=R(f)\mathbb{E}[\hat{R}_n(f)] = \frac{1}{n} \sum_i R(f) = R(f) : le risque empirique d’une hypothèse fixée est un estimateur sans biais de son risque.

  2. On enchaîne trois arguments :

    • f^\hat{f} minimise le risque empirique, donc R^n(f^)≤R^n(fH⋄)\hat{R}_n(\hat{f}) \le \hat{R}_n(f^\diamond_{\mathcal{H}}) pour tout échantillon, et en espérance E[R^n(f^)]≤E[R^n(fH⋄)]\mathbb{E}[\hat{R}_n(\hat{f})] \le \mathbb{E}[\hat{R}_n(f^\diamond_{\mathcal{H}})] ;
    • fH⋄f^\diamond_{\mathcal{H}} est fixe, donc d’après la question 1, E[R^n(fH⋄)]=R(fH⋄)\mathbb{E}[\hat{R}_n(f^\diamond_{\mathcal{H}})] = R(f^\diamond_{\mathcal{H}}) ;
    • fH⋄f^\diamond_{\mathcal{H}} minimise le vrai risque sur H\mathcal{H} et f^∈H\hat{f} \in \mathcal{H}, donc R(fH⋄)≤R(f^)R(f^\diamond_{\mathcal{H}}) \le R(\hat{f}) pour tout échantillon, et donc R(fH⋄)≤E[R(f^)]R(f^\diamond_{\mathcal{H}}) \le \mathbb{E}[R(\hat{f})].

    Au total : E[R^n(f^)]≤R(fH⋄)≤E[R(f^)]\mathbb{E}[\hat{R}_n(\hat{f})] \le R(f^\diamond_{\mathcal{H}}) \le \mathbb{E}[R(\hat{f})].

Interprétation : en moyenne, le risque mesuré sur les données d’apprentissage est inférieur au vrai risque de la machine apprise. Le problème ne vient pas du risque empirique lui-même (question 1), mais du fait que l’on évalue la machine sur les données qui ont servi à la choisir. Pour une estimation honnête, il faut des données indépendantes de ce choix.

En code

import numpy as np
rng = np.random.default_rng(0)
f_star = lambda x: 70 - 25 * np.exp(-2 * (x - 2)) # population du chapitre 3
def tirer(n):
x = rng.uniform(2, 4, n)
return x, f_star(x) + rng.normal(0, 4, n)
x_pop, y_pop = tirer(200_000) # grand échantillon : sert à approcher R
f_fixe = lambda x: 24 + 11 * x # une droite fixée à l'avance
emp_fixe, emp_appr, vrai_appr = [], [], []
for _ in range(2000): # 2000 échantillons de 10 diplômés
x, y = tirer(10)
emp_fixe.append(np.mean((y - f_fixe(x)) ** 2))
b1, b0 = np.polyfit(x, y, 1) # la machine apprise (ERM sur les droites)
emp_appr.append(np.mean((y - b0 - b1 * x) ** 2))
vrai_appr.append(np.mean((y_pop - b0 - b1 * x_pop) ** 2))
print(round(np.mean(emp_fixe), 2), round(np.mean((y_pop - f_fixe(x_pop)) ** 2), 2)) # 71.36 71.59 : sans biais
print(round(np.mean(emp_appr), 2), round(np.mean(vrai_appr), 2)) # 18.26 31.18 : optimiste