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 (en milliers de dollars) d’un diplômé à partir de son GPA (entre 0 et 4).
Étape 2 : choisir un espace d’hypothèses
Section intitulée « Étape 2 : choisir un espace d’hypothèses »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 (les GPA possibles) dans (les salaires possibles) se note . 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é . Pour commencer, les droites :
- est l’ordonnée à l’origine : le salaire prédit pour un GPA nul (une valeur théorique, que personne n’observera) ;
- est la pente : le gain de salaire, en milliers de dollars, pour un point de GPA en plus.
Chaque couple désigne une hypothèse ; choisir une hypothèse, c’est choisir deux nombres. D’autres espaces sont possibles :
| Espace d’hypothèses | Forme | Nombre de paramètres |
|---|---|---|
| Constantes | 1 | |
| Droites | 2 | |
| Polynômes de degré | ||
| Moyennes des plus proches voisins | la moyenne des salaires des GPA les plus proches | aucun paramètre fixe (non paramétrique) |
Choisir , 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 .
É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 : elle mesure l’insatisfaction quand on prédit alors que la vraie valeur est . Plus elle est grande, plus la prédiction est mauvaise.
Les trois pertes les plus courantes :
| Perte | Formule | Usage | Ce qu’elle pénalise |
|---|---|---|---|
| Quadratique () | régression | fortement les grosses erreurs | |
| Absolue () | régression robuste | toutes les erreurs proportionnellement | |
| 0-1 | si , sinon | classification | le 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.
Pourquoi la moyenne pour la perte quadratique ? La somme est un polynôme de degré 2 en ; sa dérivée s’annule pour . Pour la perte absolue, la dérivée de (là où elle existe) vaut « nombre de sous moins nombre de au-dessus de » : elle s’annule quand coupe l’échantillon en deux moitiés, c’est-à-dire à la médiane.
Étape 4 : le risque et le risque empirique
Section intitulée « Étape 4 : le risque et le risque empirique »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 , 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 tirages indépendants de cette loi :
Le risque (risk) d’une hypothèse est sa perte moyenne sur toute la population :
où désigne l’espérance par rapport à un nouveau couple tiré selon . Avec la perte quadratique, : 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, est inconnue, donc ne se calcule pas. On le remplace par sa version calculable, le risque empirique (empirical risk), qui est la perte moyenne sur l’échantillon :
Pour les droites et la perte quadratique :
Le principe qui consiste à choisir, dans , l’hypothèse de plus petit risque empirique s’appelle la minimisation du risque empirique (empirical risk minimization, ERM) :
La notation rappelle que la machine apprise dépend de deux choix : l’espace (le vôtre) et l’échantillon (celui que le hasard vous a donné). Nous la noterons simplement quand il n’y a pas d’ambiguïté.
Étape 5 : calculer la machine réelle
Section intitulée « Étape 5 : calculer la machine réelle »Place au calcul. Pour minimiser , on annule ses dérivées partielles. La dérivée par rapport à donne , soit . En reportant dans la dérivée par rapport à , on obtient les moindres carrés (least squares) :
- et sont les moyennes des GPA et des salaires de l’échantillon ;
- le numérateur de mesure à quel point GPA et salaire varient ensemble (c’est fois leur covariance empirique) ;
- le dénominateur mesure la dispersion des GPA ( fois leur variance empirique).
La droite obtenue passe toujours 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éexc, 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 constanterisque_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).
Minimiser le risque empirique, est-ce suffisant ?
Section intitulée « Minimiser le risque empirique, est-ce suffisant ? »Nous avons une machine, , et un risque empirique de 3,12. Peut-on annoncer au service carrières que l’erreur typique sera de k$ ? Certainement pas.
Le risque empirique de la machine apprise est un estimateur optimiste de son vrai risque. La raison est simple : 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 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.
Il reste donc deux grandes questions, qui occupent la suite du cours :
- Même avec une infinité de données, quelle est la meilleure erreur possible, et à quelle distance en est notre espace ? C’est l’étape 8 de la roue, et l’objet du chapitre 3.
- Avec nos données, combien perd-on par rapport au meilleur de , et comment choisir la taille de ? C’est le dilemme biais-variance du chapitre 4.
En résumé
Section intitulée « En résumé »- L’espace d’hypothèses est la famille de fonctions parmi lesquelles on cherche (droites, polynômes, voisins…) ; c’est un choix de modélisation, pris dans l’univers de toutes les fonctions.
- La fonction de perte 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 est la perte moyenne sur la population ; il est incalculable car est inconnue.
- Le risque empirique est la perte moyenne sur l’échantillon ; on le minimise dans (principe ERM).
- Avec des droites et la perte quadratique, on obtient les moindres carrés : et .
- Le risque empirique de la machine apprise est optimiste : il ne mesure pas la généralisation.
Exercices
Section intitulée « Exercices »Exercice · Calculer un risque empirique
facileUn collègue propose l’hypothèse . 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 , et . Les écarts valent donc , et .
- Perte quadratique : (en k$²).
- Perte absolue : (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 ( 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ègueecart = salaire - predictionprint(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.0print(round(np.sqrt(risque_quadratique), 2)) # 2.58 (en k$)gpa <- c(3.0, 3.5, 2.5)salaire <- c(60, 62, 52) # en k$prediction <- 20 + 12 * gpa # hypothèse du collègueecart <- salaire - predictionprediction; ecart # 56 62 50 4 0 2
risque_quadratique <- mean(ecart^2)risque_absolu <- mean(abs(ecart))c(risque_quadratique, risque_absolu) # 6.67 2sqrt(risque_quadratique) # 2.58 (en k$)Exercice · Moyenne ou médiane ?
moyenLe 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$).
- Quelle constante minimise le risque empirique avec la perte quadratique ? Avec la perte absolue ?
- Laquelle afficheriez-vous, et pourquoi ?
Voir la solution
- Perte quadratique : la moyenne, . Perte absolue : la médiane, .
- 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 meilleurec = 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.0salaires <- c(48, 50, 51, 53, 120) # en k$c(mean(salaires), median(salaires)) # 64.4 51
# Vérification numérique : on balaie les constantes c et on garde la meilleurec_grille <- seq(40, 130, by = 0.01)risque_l2 <- sapply(c_grille, function(c) mean((salaires - c)^2))risque_l1 <- sapply(c_grille, function(c) mean(abs(salaires - c)))c(c_grille[which.min(risque_l2)], c_grille[which.min(risque_l1)]) # 64.4 51Exercice · Pourquoi le risque empirique est optimiste
difficileOn note la meilleure hypothèse de au sens du vrai risque (celle qui minimise sur ), supposée fixe, et celle qui minimise le risque empirique sur .
- Montrez que, pour une hypothèse fixée à l’avance, .
- En déduire que . Interprétez.
Voir la solution
-
Si ne dépend pas des données, chaque terme a la même loi que pour un nouveau couple, donc la même espérance . Par linéarité, : le risque empirique d’une hypothèse fixée est un estimateur sans biais de son risque.
-
On enchaîne trois arguments :
- minimise le risque empirique, donc pour tout échantillon, et en espérance ;
- est fixe, donc d’après la question 1, ;
- minimise le vrai risque sur et , donc pour tout échantillon, et donc .
Au total : .
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 3def 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 Rf_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 biaisprint(round(np.mean(emp_appr), 2), round(np.mean(vrai_appr), 2)) # 18.26 31.18 : optimisteset.seed(0)f_star <- function(x) 70 - 25 * exp(-2 * (x - 2)) # population du chapitre 3tirer <- function(n) { x <- runif(n, 2, 4) data.frame(x = x, y = f_star(x) + rnorm(n, 0, 4))}pop <- tirer(200000) # grand échantillon : sert à approcher Rf_fixe <- function(x) 24 + 11 * x # une droite fixée à l'avance
res <- replicate(2000, { # 2000 échantillons de 10 diplômés d <- tirer(10) b <- coef(lm(y ~ x, data = d)) # la machine apprise (ERM sur les droites) c(emp_fixe = mean((d$y - f_fixe(d$x))^2), emp_appr = mean((d$y - b[1] - b[2] * d$x)^2), vrai_appr = mean((pop$y - b[1] - b[2] * pop$x)^2))})c(mean(res["emp_fixe", ]), mean((pop$y - f_fixe(pop$x))^2)) # 70.80 71.13 : sans biaisc(mean(res["emp_appr", ]), mean(res["vrai_appr", ])) # 18.44 31.08 : optimiste