Apprentissage automatique
La régression linéaire

Madjid KHICHANE, "Le Machine Learning et l'IA générative avec Python", ENI, 2025
Jamie FLUX, "Fondements Mathématiques de Base de l'Intelligence Artificielle", Amazon, 2024
Arnaud BODIN, François Recher, "DEEPMATH, Mathématiques (simples) des réseaux de neurones (pas trop compliqués)", Amazon, 2025
David FOSTER, "Deep learning génératif, Apprendre aux machines à dessiner, composer, écrire et jouer", O'RAILLY, 2023

1) L'apprentissage supervisé

L'apprentissage supervisé est une méthode statistique pour modéliser la relation entre une variable `y` et une liste de variables `vec x = (x_1,x_2,x_3,...x_n)`. Elle ajuste une listes de paramètres `vec p = (p_1,p_2,p_3,...,p_d)` afin que le calcul `f(vec x,vec p)` produise une prédiction la plus proche de `y`. L'équation générale du modèle est donnée par :

`y = f(vec x,vec p) - epsilon`

`f` est une fonction analytique quelconque permettant de définir toutes sortes d'apprentissages supervisés spécifiques, et où `epsilon` représente l'erreur de prédiction. La prédiction moins l'erreur de prédiction donne la valeur réelle.

La donnée d'entrée du modèle est appelée une observation. C'est la liste de `n` valeurs : `vec x = (x_1,x_2,x_3,...,x_n)`.

La donnée de sortie du modèle est appelée une observation cible. C'est la valeur `y`.

La mémoire d'apprentissage du modèle est une liste de paramètres qui s'ajustent : `vec p = (p_1,p_2,p_3,...,p_d)`

La fonction prédictive `f(vec x, vec p)` calcule la prédiction de `y` que l'on note simplement `f= f(vec x, vec p)` selon le neurone suivant :

`f←(vecx,vecp)`

L'apprentissage automatique supervisé s'opère sur un jeux de `N` observations. Délors, lorsque l'on parle de la variable `vecx` et `y`, on désigne en fait `vecx_i` et `y_i`, pour un `i` donnée entre `1` et `N`, constituant la `i`ième observation.   Par convention on ajoute ainsi en première place ce nouvel indice `i` qui parcourir les `N` observations. Et on utilise l'indice `j` pour parcourir les `n` composantes d'une observation. Chaque observation est un vecteur `vec(x_i) = (x_(i,1),x_(i,2),x_(i,3),...,x_(i,n))` et chaque observation cible est une valeur `y_i`. La valeur `x_(i,j)` représente la `j`ième composante de la `i`ième observation. La valeur `y_i` représente la `i`ième observation cible. La valeur `f_i` représente la `i`ième prédiction. L'erreur de prédiction `epsilon_i` représente l'écart entre la prédiction et la valeur réelle `epsilon_i = f_i-y_i` pour la `i`ième observation. La prédiction à laquelle on enlève l'erreur de prédiction donne la valeur réelle.

`f_i = f(vecx_i,vecp)`         `epsilon_i=f_i-y_i`

L'ensemble des données forme les matrices `X` et le vecteur `Y`. L'ensemble des prédictions forme le vecteur `F`. On note ainsi parfois simplement en majuscule les matrices et vecteurs. Le premier indice désigne le numéro de ligne. Le second indice désigne le numéro de colonne :

`AAi,AAj,        X= [x_(i,j)]_(i,j)`        `Y= [y_i]_i`        `F= [f_i]_i`        `E= [epsilon_i]_i`

Cette déclaration précise par quel lettre sont désignés les composantes des vecteurs et matrices. On représente la liste des observations par la matrice `X`, et la liste des observations cibles par le vecteur `Y`, et la liste des prédictions par le vecteur `F` , et la liste des erreurs de prédiction par le vecteur `E`. L'indice `i` indique le numéro de ligne (une observation par ligne). L'indice `j` indique le numéro de colonne.

`X= ((x_(1,1),x_(1,2),...,x_(1,n)),(x_(2,1),x_(2,2),...,x_(2,n)),(⫶,⫶,⋱,⫶),(x_(N,1),x_(N,2),...,x_(N,n)))`            `Y=((y_1),(y_2),(⫶),(y_N))`            `F=((f_1),(f_2),(⫶),(f_N))`          `E=((epsilon_1),(epsilon_2),(⫶),(epsilon_N))=F - Y`

L'apprentissage automatique supervisé va, à partir du jeu de données d'entrainement `X, Y`, ajuster les paramètres `vec p` pour obtenir une erreur `E` minimale. Mais, il faut définir ce qu'on entend par vecteur d'erreur `E` minimal. Il s'agit de comparer la variable statistique `epsilon` avec la valeur constante zéro. Dans le cas de variables statistiques gaussiennes, l'écart type de `epsilon` que l'on note `sigma` nous permet de calculer les probabilités d'erreur de prédiction :

`P(y in [f"-"sigma,f"+"sigma]) = 68%`
`P(y in [f"-"2sigma,f"+"2sigma]) = 95.5%`
`P(y in [f"-"3sigma,f"+"3sigma]) = 99.7%`

`sigma = sqrt(1/Nsum_i epsilon_i^2)`  

On cherche donc à minimiser cette mesure qu'est l'écart type `sigma`. C'est la racine carrée de la moyenne du carré des erreurs. Cela revient à minimiser la somme des carrés, d'où le nom de "méthode des moindres carrés". L'apprentissage va alors ajuster les paramètres `vec p``=``(p_1,p_2,...,p_d)` afin que le vecteur des erreurs `E``=``(epsilon_1,epsilon_2,...,epsilon_N)` possède une somme de carré qui soit minimale.

`AAi,  epsilon_i =  f(x_(i,1),x_(i,2),...,x_(i,n),p_1,p_2,...,p_d)-y_i`

`sum_i epsilon_i^2`  doit être minimal.

On garde néanmoins l'expression exacte de l'écart type `sigma` sous la main, qui nous permet de calculer une probabilité sur la prédiction.

Pour maitriser facilement cette technique il faut avoir dans un premier temps une bonne représentation graphique de la façon dont sont rangées les données, sous forme de tableaux, de matrices et de vecteurs. Puis on donne des noms intuitifs et on développe le langage mathématique pour pouvoir exprimer l'hypothèse par une formule sans ambiguité.

Récapitulons la disposition des données :

`x` Variable d'entrée, observation.
`y` Variable de sortie, observation cible.

On considère `n` variables d'entrée comme autant de composantes de `x`. On ajoute donc une dimension représenté par l'indice `j` :

`n` Nombre de variables d'entrée.
`j in {1,2,3,...,n}` Indice désignant la variable d'entrée.
`x_1,x_2,x_3,...,x_n` Les `n` variables d'entrée.
`vec(x)=(x_1,x_2,...x_n)` Forme vectorielle des variables d'entrée.

On considère `N` observations. On ajoute donc une dimension représenté par l'indice `i` :

`N` Nombre d'observations.
`i in {1,2,3,...,N}` Indice désignant les observations.
`vec(x_i) = ( x_(i,1),x_(i,2),x_(i,3), ... ,x_(i,n) )` `i`ième observation
Les `N"×"n` données d'entrée. Le premier indice indique le numéro de l'observation.
Le second indice indique la variable d'entrée :
`(x_(1,1),x_(1,2),...,x_(1,n)),(x_(2,1),x_(2,2),...,x_(2,n)),...,(x_(N,1),x_(N,2),...,x_(N,n))`
`y_1,y_2,...,y_N` Les `N` données de sortie. Les observations cibles.

L'ensemble des données se mettent sous forme matricielle comme suit :

`X=[(x_(1,1),x_(1,2),...,x_(1,n)),(x_(2,1),x_(2,2),...,x_(2,n)),(⫶,⫶,⋱,⫶),(x_(N,1),x_(N,2),...,x_(N,n))]`       `Y = [(y_1),(y_2),(⫶),(y_N)]`

Le premier indice est l'indice de ligne. Le second indice est l'indice de colonne.

Notez que cette disposition géométrique des matrices et vecteurs, transposées ou non, en lignes ou en colonnes, n'est qu'une convention. Ce qui compte dans la composition des matrices, c'est l'ordre des indices et le type de produit définit à l'aide de ces indices. D'une manière générale, à chaque fois que l'on ajoute une dimension en dézoomant l'échelle, on ajoute ici l'indice correspondant comme premier indice.

L'équation du modéle se décline pour chaque observation :

`y_1 = f(vec x_1,vec p) - epsilon_1`
`y_2 = f(vec x_2,vec p) - epsilon_2`
`y_3 = f(vec x_3,vec p) - epsilon_3`
`⫶`
`y_N = f(vec x_N,vec p) - epsilon_N`

Il convient donc d'adopter une notation pour pouvoir regrouper ces équations en une seule équation vectorielle :

`Y = F(X"|"vec p) - E`

Où, dans la liste des arguments d'une fonction, le symbôle `"|"` mis après le premier argument qui doit être une liste de listes, (ici, un vecteur colonne de vecteurs lignes, autrement dit, une matrice), indique que la fonction s'applique à chaque terme de la liste (ici à chaque terme du vecteur colonne) en complétant avec le même reste des arguments, pour produire le vecteur image :

`F = F(X"|"vec p) = ((f(vecx_1,vecp)),(f(vecx_2,vecp)),(⫶),(f(vecx_N,vecp)))`        `X=((vecx_1),(vecx_2),(⫶),(vecx_N))`      `AAi,  vecx_i"="(x_(i,1),x_(i,2),...,x_(i,n))`

A ce stade, il convient d'étudier le calcul différentiel décrit dans les chapitres ci-dessous :

  1. Calcul différentiel
  2. Calcul différentiel à plusieurs variables
  3. Calcul différentiel vectoriel

Ain de percevoir quel cas de fonction prédictive on doit étudier en premier. La fonction prédictive `f(vecx,vecp)` étant analytique, au voisinage d'un `vecx`, elle se comporte linéairement selon `dvecp`. Cela signifie qu'une petite variation des paramètres `dvecp` va opérer linéairement une petite variation de `f` notée `df`. Il existe donc localement une forme linéaire `vecm` telle que la petite variation de `f` soit égale au produit scalaire `vecm"·"dvecp` :

`df = vecm"·"dvecp`

Par définition, ce vecteur `vecm` s'appelle la dériviée de `f` selon `vecp`.

`vecm=(df)/(dvecp)`

En répétant cette construction pour les `N` observations, on voit qu'il existe localement une matrice `M` telle que la variation de `dF` soit égale au produit matriciel `Mdvecp` :

`dF = Mdvecp`

Par définition, cette matrice s'appelle la dériviée de `F` selon `vecp`.

`M = (dF)/(dvecp)`

On voit ainsi que le problème d'adapter les paramètres d'une fonction prédictive analytique quelconque se ramène localement à trouver les paramètres d'une fonction prédictive linéaire. C'est pourquoi la première fonction prédictive à étudier est celle linéaire.

2) La régression linéaire

On considère le cas où la fonction prédictive est une combinaison linéaire :

`f(vecx,veca) =a_0+a_1x_1 + a_2x_2+ a_3x_3+...+ a_nx_n`

La regression linéaire est une méthode statistique pour modéliser la relation entre une variable `y` appelée observation cible et une liste de variables `x_1,x_2,...,x_n` appelée observation. L'équation du modèle est une combinaison linéaire avec un terme supplémentaire `a_0`  :

`y = a_0"+"a_1x_1"+"a_2x_2"+"..."+"a_nx_n - epsilon`

En notation matricielle, cela peut s'écrire comme suit, où on ajoute à toutes les observations la composante `x_0"="1` :

`Y = F-E`

`F = Xveca`

`X= ((1,x_(1,1),x_(1,2),...,x_(1,n)),(1, x_(2,1),x_(2,2),...,x_(2,n)),(1,⫶,⫶,⋱,⫶),(1, x_(N,1),x_(N,2),...,x_(N,n)))`        `vecp=((a_0),(a_1),(a_2),(⫶),(a_n))`        `Y=((1),(y_1),(y_2),(⫶),(y_N))`        `F =((f_0),(f_1),(f_2),(⫶),(f_N))`        `E=F - Y`

`Y` est le vecteur des observations cibles,
`F`
est le vecteur des prédictions,
`E`
est le vecteur des erreurs de prédictions,
`X`
est la matrice des observations avec comme première colone la constante `1`,
`veca`
est le vecteur des paramètres.

Comme on a ajouter la composante `x_0=1`, c'est pourquoi l'indices `j` commence à zéro, `j in {0,1,2,3,...,n}`

La somme `sum_j` signifie `sum_(j=0)^(j=n)`

La somme `sum_i` signifie `sum_(i=1)^(i=N)`

L'estimation des paramètres `a_0, a_1, a_2 ,..., a_n` dans la regression linéaire se fait souvent par la méthode des moindres carrés ordinaires (MCO), qui consiste à minimiser la somme des carrés des erreurs noté `J= E^2` :

`J= E^2`

`J= E"·"E`

`J= E^⊤E`

`J = sum_i(epsilon_i^2)`

On développe `J` qui doit être minimale pour les valeurs recherchées de `veca`.

`J = (F-Y)"·"(F-Y)`

`J = (Xveca-Y)"·"(Xveca-Y)`

`J = (Xveca-Y)^⊤(Xveca-Y)`

La solution analytique au problème de minimisation est obtenue en dérivant la fonction de coût `J` par rapport à `veca`, puis en résolvant pour zéro :

`(dJ)/(veca) = 2X^⊤(Xveca-Y) = 0`

`X^⊤Xveca=X^⊤Y`

Lorsque `X^⊤X` est inversible, la solution est :

`veca = (X^⊤X)^-1X^⊤Y`

(Notez que le terme `p_0` avec la variable `x _0` peuvent être enlevé si l'on centre préalablement chaque variable).

3) Calcul de `X^⊤X` et de `X^⊤Y`

Les variables statistiques présentes sont `y, x_1,x_2,x_3,....,x_n`. Leur moyenne se note : `bar y`, `bar(x_1)`, `bar(x_2)`, `bar(x_3)`, ...., `bar(x_n)`. Et on note la moyenne du produit `x_jx_k` comme suit `bar(x_jx_k)`. L'indice `i in {1,2,...,N}` désigne le numéro de l'observation et fait office de temps discret. L'indice `j in {0,1,2,...,n}` et l'indice `k in {0,1,2,...,n}` désigne la `j`-ième composante et la `k`-ième composante d'une observation. La variablevariable `x_0=1` est constante. Nous avons par convention :

`sum_i = sum_(i=1)^N`                   `sum_j= sum_(j=0)^n`                   `sum_k= sum_(k=0)^n`

`bar (x_j) = 1/Nsum_jx_(i,j)`

`bar (x_jx_k) = 1/Nsumx_(i,j)x_(i,k)`

La matrice des produits croisées `X^TX` est une matrice carré `(n"+"1)"×"(n"+"1)` symétrique et le vecteur `X^⊤Y` est de dimension `n"+"1`, et s'exprime en fonction des moyennes :

`1/NX^⊤X = 1/N(sum_i x_(i,j) x_(i,k))_j^k = ((1,bar(x_1),bar(x_2),bar(x_3),...,bar(x_n)) ,(bar(x_1),bar(x_1^2), bar(x_1x_2), bar(x_1x_3),...,bar(x_1x_n)) , (bar(x_2),bar(x_2,x_1), bar(x_2^2), bar(x_2x_3),..., bar(x_2x_n)), (bar(x_3),bar(x_3x_1), bar(x_3x_2), bar(x_3^2),..., bar(x_3x_n)),(⫶,⫶,⫶,⫶,⋱,⫶),(bar(x_n), bar(x_n x_1), bar(x_n x_2), bar(x_n x_3),..., bar(x_n^2)))`

`1/NX^⊤Y = 1/N(sum_i x_(i,j) y_(i))_j = ((bar y),(bar(x_1y_i)),(bar(x_2y_i)),(bar(x_3y_i)),(⫶),(bar(x_ny_i)))`

L'apprentissage se fait petit à petit en ajoutant dans cette matrice symétrique `X^⊤X` et ce vecteur `X^⊤Y` à chaque observation `vecx,y` , les produits croisés. À la fin, si `X^⊤X` est inversible, alors la solution est :

`A = (X^⊤X)^-1X^⊤Y`

La méthode de la régression linéaire devient trop consommatrice en temps de calcul lorsque le nombre de variables `n` devient très grand, car elle nécessite d'inverser une matrice `n"×"n`. Si on ne souhaite pas procéder à cette inversion, on peut alors utiliser une autre méthode plus légère qu'est la descente de gradient.

4) Le surapprentissage

Les données de test servent à mesurer le taux d'erreur auquel on peut s'attendre en production sur les futures observations. Elles ne doivent pas faire parties des données d'entrainement. C'est un principe issu du principe de séparation des pouvoirs assez simple à comprendre. Sans cela, le test perd sa valeur de test.

Un modèle est en situation de surapprentissage lorsque ses performances sont très satisfaisantes sur les données d'entrainements, mais médiocre sur les données de test.

La validation croisée tente de mesurer ce niveau de surapprentissage. La méthode de base "Hold Out" sépare les données d'entrainements et les données de test, et compare les performances sur les deux groupes. La méthode "k-fold" consiste à partitionner les données en k jeux de données, puis à entrainer le modèle sur tous les jeux de données sauf un et de mesurer la performance des prédictions sur ce jeu de données, puis de refaire toute l'opération ainsi pour chaque jeux de données et de faire la moyenne des performances. La méthode "Leave One" consiste à entrainer le modèle sur toutes les données sauf une et de mesurer la performance de la prédiction sur cette donnée, puis de refaire toute l'opération ainsi pour chaque données et de faire la moyenne des performances.

Les hyperparamètres sont fixes lors d'un apprentissage et détermine l'évolution des paramètres lors de la phase d'apprentissage. Ils ne sont pas utilisés pour calculer la prédiction, qui est calculé à l'aide des seuls paramètres. Si on souhaite ajuster les hyperparamètres, alors selon un même principe de séparation des pouvoirs, il faut prévoir 3 jeux séparés de données ; un jeux de données d'entrainement, un jeux de données de validation, et un jeux de données de test. Les données d'entrainement permettent l'ajustement des paramètres du modèle. Les données de validation permettent de tester la performance de cet apprentissage pour un jeux d'hyperparamètres donné, et donc permettent l'ajustement des hyperparamètres du modèle. Et enfin les paramètres de teste servent a mesurer la performance finale sur les données de production.

Accueil
Suivant

 

 


Dominique Mabboux-Stromberg
décembre 2025

 

.