Régression linéaire avec les Équations Normales

Vous démarrez dans le Machine Learning ? Alors cet article est votre meilleur point de départ. 100% Garanti.

Vous allez y apprendre certains des mécanismes fondamentaux de tout le Machine Learning à travers l’exemple le plus simple qui existe : la régression linéaire. En plus, vous allez immédiatement passer à l’action en écrivant votre premier programme de Data Scientist (vous êtes libre de recevoir le code à la fin de l’article)

En Bonus, je vais vous raconter l’histoire incroyable qui se cache derrière la méthode que vous allez apprendre. N’hésitez pas à vous munir d’un crayon et d’une feuille, pour être encore plus efficace lors de cette lecture. C’est parti !

La moitié de vos problèmes sont des problèmes de régression. Savez-vous les résoudre ?

Il existe deux types de variables : Les variables continues, qui peuvent prendre une infinité de valeurs, et les variables discrètes, qui prennent seulement certaines valeurs.

Résoudre un problème de régression consiste à développer un modèle qui a pour objectif de prédire la valeur d’une variable continue en fonction de certains facteurs.

Par exemple, prédire:

  • Le prix d’un appartement en fonction de sa surface habitable, sa localisation géographique, etc.
  • La température qu’il fait à Paris en fonction de la pression atmosphérique, du mois de l’année, etc.
  • La valeur d’une action boursière en fonction de la valeur d’autres actions, de l’actualité business, etc.
  • La distance d’arrêt d’une voiture en fonction de sa vitesse, de l’état des pneus, l’état de la route, etc.
  • Le chiffre d’affaire d’un magasin en fonction du mois de l’année, de sa localisation, etc.

Il existe de nombreuses méthodes pour résoudre tous ces problèmes, et nous allons apprendre l’une des plus simples, pourtant des plus efficaces: la méthode des Équations Normales de Carl Gauss

Les Équations Normales :  LA technique à connaitre

Les Équations Normales découlent directement de la célèbre méthode des moindres carrés. Et non, cette méthode ne sert pas qu’à calculer la hausse du prix du croissant à la boulangerie. En 1801, un astronome allemand l’utilisa pour déterminer avec précision la trajectoire d’un astéroïde, là où tous les autres physiciens de l’époque échouèrent en utilisant des calculs bien plus complexes (on en reparle en Bonus à la fin de l’article)

Comme le montre cet exemple, la méthode des Équations Normales est réellement puissante, simple et élégante. Trêve de bavardage, apprenons-la tout de suite.

Trouver les Équations Normales en 3 étapes

Etape 1: Créer un modèle linéaire à partir de data

Imaginez : Vous visitez 5 appartements et notez dans un tableau le prix de chaque appartement (y) et sa surface habitable (x). Vous avez alors un tableau de données (x, y), qu’on appelle dans le jargon un Dataset.

En visualisant les données, il semble que y varie de façon linéaire par rapport à x, et on peut ainsi ‘caser’ une droite dans ce nuage de points. Cette droite est notre modèle linéaire f, que l’on définit par une fonction affine f(x) = ax + b, où a et b sont les paramètres du modèle.

Comme notre droite ne peut passer par tous les points, elle nous donne une erreur \epsilon par rapport à chacun des exemples y dont nous disposons. Pour exprimer cette erreur, on mesure la différence entre la prédiction f(x) et l’exemple y et on met le tout au carré.

On appelle ça la norme euclidienne : \epsilon = (y-f(x))^2.

Note : La norme euclidienne donne la distance directe entre deux points en géométrie classique (géométrie euclidienne)

Allons droit au but. Avoir un bon modèle f signifie faire de petites erreurs entre les prédictions f(x) et les réelles valeurs y. Il faut donc trouver les paramètres a et b qui minimisent ces erreurs. Le Machine Learning tout entier repose sur ce principe. Pour y parvenir, rien de tel que la méthode des moindres carrés, qui minimise la somme des carrés des erreurs. Voyons cela tout de suite.

Etape 2: Le cœur du Machine Learning, minimiser une fonction coût

Ok maintenant voici LA phrase à retenir :

Un des mécanismes fondamentaux du Machine Learning est de laisser la machine apprendre le modèle f qui minimise les erreurs \epsilon.

Rappelez-vous : Minimiser les erreurs revient à améliorer la Performance P (Apprenez en plus en lisant Comment fonctionne le Machine Learning).

Dans notre cas, il faut donc trouver les paramètres a et b qui minimisent les 5 erreurs:

min \epsilon^{(1)} = (y^{(1)} - f(x^{(1)}))^2
min \epsilon^{(2)}= (y^{(2)} - f(x^{(2)}))^2
min \epsilon^{(3)} = (y^{(3)} - f(x^{(3)}))^2
min \epsilon^{(3)} = (y^{(4)} - f(x^{(4)}))^2
min \epsilon^{(5)} = (y^{(5)} - f(x^{(5)}))^2

Mais plutôt que de minimiser 5 équations, on préfère minimiser 1 équation qui représente la somme de nos erreurs.

On définit ainsi la fonction coût \Delta =\sum (y - (ax +b))^2.

Pour résumer : notre but est de trouver le minimum de la fonction Coût \Delta. Comme cette fonction est une somme de carrés, Gauss a pu démontrer dans le théorème Gauss Markov qu’il existe un unique minima à \Delta. Ainsi il suffit de calculer la dérivée en zéro pour trouver le minimum de \Delta.

Si vous êtes un peu rouillé en maths (ça arrive à tout le monde) alors ce qui va suivre va vous aidez à y voir plus clair.

Evolution de la fonction coût d’une régression linéaire

Rappelez-vous : La dérivée d’une fonction représente l’inclinaison de la tangente à la courbe. Quand la dérivée vaut zéro, cela indique une tangente horizontale à notre courbe, autrement dit, soit un maxima, soit un minima, soit un plateau.

Observez maintenant l’évolution de \Delta en fonction du paramètre a.

Si a est petit, alors la distance entre notre modèle f_{a, b} et nos données y est très grande. Donc la somme des erreurs \Delta est grande quand a est petit. Plus la pente a augmente, plus nos erreurs vont diminuer. Mais passé un certain point, nos erreurs augmentent à nouveau…

On dirait bien qu’il n’existe qu’un minima (comme Gauss l’a démontré) ce qui signifie qu’il suffit de trouver l’unique couple (a,b) où la dérivée s’annule pour arriver au meilleur résultat (le modèle qui donne les plus petites erreurs).

Pour trouver le meilleur modèle f, il faut donc calculer deux dérivés en zéro:

\frac{\partial \Delta}{\partial a} =0

et \frac{\partial \Delta}{\partial b} =0

Calcul de la dérivée en zéro et solution finale

Pour correctement dériver la fonction Coût \Delta =\sum (y - (ax +b))^2, Il faut dériver une fonction composée : (g\circ f)' = f' \times (g'\circ f) avec:

f = y - (ax + b)

g = (f)^{2}

On obtient ainsi la dérivé \frac{\partial \Delta}{\partial a} = \sum  -2x (y - (ax+b))

Et on cherche où est ce que cette dérivé s’annule : \frac{\partial \Delta}{\partial a} =0

on a \sum  -2x (y - (ax+b)) = 0
ie \sum  x (y - (ax+b)) = 0
ie \sum  xy - \sum ax^2 -\sum bx = 0
ie \sum  xy = \sum ax^2 +\sum bx (1)

Ce qui nous donne 1 équation à 2 inconnues a et b. Ça ne suffit pas pour trouver nos paramètres a et b. Nous avons besoin d’une seconde équation. Donc on calcul la dérivé par rapport à b: \frac{\partial \Delta}{\partial b} = \sum  -2 (y - (ax+b))

Et on cherche où est ce que cette dérivé s’annule : \frac{\partial \Delta}{\partial b} =0

on a \sum  -2 (y - (ax+b)) = 0
ie \sum  (y - (ax+b)) = 0
ie \sum  y - \sum ax -\sum b = 0
ie \sum  y = \sum ax +\sum b (2)

Résultat des courses: On a 2 équations à 2 inconnues, ce qui permet de trouver les paramètres a et b:

On a: \left\{\begin{matrix} \sum  xy = \sum ax^2 +\sum bx  (1) \\\sum  x = \sum ax +\sum b  (2) \end{matrix}\right


et donc: \left\{\begin{matrix} a = \frac{Cov(x, y)}{Var(x^2)} \\ b = \overline{y} - a \overline{x}  \end{matrix}\right (il y a une erreur sur mon dessin, désolé)

Et voila ! Vous connaissez maintenant la formule pour trouver a et b, donnant ainsi le modèle f optimal en suivant la méthode des moindres carrés.

Mais… et les Équations Normales dans tout ça ? Ne vous en faites pas, c’est maintenant qu’elles rentrent en jeu…

Etape 3: Trouver les Équations Normales grâce aux matrices

Je suis un escroc… ou pas !

Je vais jouer carte sur table avec vous : vous pouvez oublier les calculs que nous avons fait. On ne les utilise jamais pour faire une régression linéaire, car il existe une façon bien plus simple de trouver a et b.

Cependant, vous n’avez pas perdu votre temps car je voulais vous expliquer le cheminement du Machine Learning. Je vous recommande de bien retenir le concept de fonction coût qu’il faut minimiser, car il est essentiel en Machine Learning, et les Équations Normales reposent sur ce principe même.

Équations Normales: transformer notre Dataset en matrices

Revenons quelques pas en arrière : tout démarre d’un Dataset (x, y) qui contient nos données. Pour trouver les Équations Normales, il faut transformer ce Dataset en matrices.

  • On peut ainsi regrouper les prix des appartements y en un vecteur à 5 lignes: Y=\begin{bmatrix}y^{(1)}\\ y^{(2)} \\...\\ y^{(5)}\end{bmatrix}
  • Et les surfaces x dans une matrice (5 lignes, 2 colonnes): X =\begin{bmatrix}1 & x^{(1)})\\ ... & ...\\ 1 & x^{(5)} \end{bmatrix} (vous allez comprendre pourquoi on rajoute une colonne de 1 dans un instant)
  • Pour finir on définit un vecteur \theta qui contient les paramètres a et b à apprendre: \theta=\begin{bmatrix} b\\ a \end{bmatrix}

On obtient ainsi le système linéaire Y = X \theta qui ressemble au modèle linéaire f que l’on cherche à développer.

Note: Ce système n’a pas de solution, car le modèle linéaire f ne peut passer par tous les points. Mais ce n’est qu’un détail et nous le savons déjà. Ce qui nous intéresse c’est trouver les paramètres a et b qui donnent la plus petite erreur (fonction coût).

À ce stade, on pourrait se dire qu’il suffit de passer X de l’autre côté de notre équation pour trouver \theta=\begin{bmatrix} a\\ b \end{bmatrix}, et donc trouver les paramètres a et b. Autrement dit, inverser par X de chaque côté pour obtenir :  \theta  = X^{-1}Y

Le couac, c’est qu’on ne peut pas inverser une matrice non carrée. (car matrice non carrée = fonction non bijective = peut pas inverser). Or la matrice X n’est carrée que dans le cas où elle contient 2 points, ce qui ne nous avance pas trop parce qu’une droite passe toujours par 2 points dans la géométrie classique (géométrie euclidienne). En l’occurrence, X contient 5 points.

Heureusement, il y a une astuce toute simple : multiplier X par sa transposée X^{T} ce qui donne la matrice carrée X^{T}X de dimension (2,2) que l’on peut donc inverser.

Ainsi on a Y = X\theta

donc X^{T}Y = X^{T}X\theta


Et voici donc la formule tant attendue des Équations Normales \theta =(X^{T}X)^{-1} X^{T}Y

Cette formule permet de trouver les paramètres a et b en une équation (a et b sont contenus dans \theta). La formule peut sembler intimidante, mais rappelez-vous que X et Y sont juste vos data insérées dans des matrices.

Note: la formule \theta =(X^{T}X)^{-1} X^{T}Y ressemble étrangement à celles que nous avons développé avec les dérivés en zero: \sum  xy = \sum ax^2 +\sum bx (1). Tout est lié… serait-ce un complot?

Maintenant, tout ce qu’il suffit de faire, c’est d’entrer la formule \theta =(X^{T}X)^{-1} X^{T}Y dans un programme et vous pourrez prédire le cours de la bourse, l’évolution démographique, le réchauffement climatique etc.

Adieu Excel, bonjour Python. Vous voila Data Scientist !

Comment Installer Anaconda

À l’heure de l’intelligence artificielle et du Big Data, 99.9% des gens utilise encore Excel pour manipuler leur Data, ici notre Dataset (x, y). C’est une aberration.

Je suis fier de vous annoncer que vous faites désormais parti des 0.1% meilleurs qui disent “adieu Excel, bonjour Python”, afin de développer des modèles de Machine Learning.

Pour commencer, je vous invite à télécharger Anaconda (meilleure plateforme de Data Science au monde) depuis le lien officiel. Pensez à bien télécharger la version 3.7 de Python (ou supérieure). Une fois téléchargé, procédez à l’installation.

Une fois Anaconda installé. lancer le programme Jupyter depuis votre ordinateur. Une fenêtre dans votre navigateur Internet va s’ouvrir.

En haut à droite, cliquer sur new / Python 3 et vous voila parti, vous pouvez commencer à écrire votre programme.

1. Implémenter les Équations Normales avec Numpy

Numpy est la bibliothèque scientifique fondamentale de Python. Elle permet principalement de créer et manipuler des matrices, juste ce qu’il faut pour les Équations Normales.

Nous commençons donc par importer la librairie Numpy, ainsi que la librairie matplotlib.pyplot qui nous permet de visualiser nos résultats, et une fonction ‘make_regression’ pour générer des données aléatoires (pour cet exercice)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression

Maintenant que nos trois modules sont importés, nous pouvons utiliser les fonctionnalités qu’ils contiennent. Commençons par utiliser la fonctionnalité make_regression de sklearn pour générer simplement un nuage de points. Pour cet exemple, créons 100 points sur un axe x, y.

np.random.seed(23) #note: on ecrit cette ligne pour maitriser l'aleatoire.
x, y = make_regression(n_samples=100, n_features=1, noise=5)
plt.scatter(x, y) #on affiche nos données

À ce stade, nous avons un vecteur x et un vecteur y, chacun ayant 100 lignes. Nous avons vu que pour utiliser les Équations Normales, il faut rajouter une colonne de 1 dans le vecteur x. Voici le code à écrire pour effectuer cette modification.

X = np.hstack((np.ones(x.shape), x))

Tout est en place pour l’instant magique ! En écrivant l’équation
\theta =(X^{T}X)^{-1} X^{T}Y grâce aux fonctionnalités de Numpy, on trouve instantanément le paramètre θ de notre modèle linéaire.

theta = np.linalg.pinv(X.T.dot(X)).dot(X.T).dot(y)

Nous pouvons visualiser les paramètres a, b

print('b=',theta[0], 'a=', theta[1])
b= -0.3268698941630696 a= 19.41624016849785

Maintenant que nous avons trouver les paramètres de notre modèle, observons les résultats sur les données dont nous disposons.

predictions = X.dot(theta)
plt.scatter(X[:,1], y)
plt.plot(X[:,1], predictions, c='r')

Faisons honneur a Gauss et calculons le coefficient R2 que l’on apprend a l’école:

def rcarre(y, pred):
    u = ((y - pred)**2).sum() #residu de la somme des carres
    v = ((y - y.mean())**2).sum()# somme totale des carres
    return 1 - u/v

print('R2=', rcarre(y, predictions))

On obtient un coefficient de détermination R2 = 0.93. Pas mal.

2. Plus simple et plus rapide: Équations Normales avec SKLearn

Tous les calculs qui ont été réalisés au dessus sont en fait directement implémentés dans Sklearn, la bibliothèque Machine Learning de Python. Il suffit de charger le modèle LinearRegression et d’utiliser la fonction fit. Nous pouvons aussi utiliser la fonction score pour calculer le coefficient R2 (On retrouve bien le résultat d’avant)

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(x,y)
print('Coefficient R2:', model.score(x,y))

plt.scatter(x, y)
plt.plot(x, model.predict(x), c='r')

On trouve un coefficient de détermination Coefficient R2 = 0.93

Un grand bravo à vous ! Vous êtes libre de recevoir le code complet (avec plusieurs Bonus dedans !) en me laissant votre nom et votre adresse email. Vous pourrez ainsi utiliser ce code pour faire de vraies prédictions dans les domaines de l’immobilier, la bourse, la météo, et pleins d’autres !

Ce que vous devez retenir de cet article

Merci d’avoir lu cet article. Voici les informations les plus importantes à retenir:

Pour résoudre un problème de régression linéaire, on commence par définir un modèle linéaire f(x) = ax + b.

Ensuite, on définit une fonction coût qui représente la somme des erreurs avec le Dataset \Delta =\sum (y - (ax +b))^2.

Notre objectif: Trouver quel est le modèle linéaire f qui minimise la fonction coût

En utilisant la méthode des moindres carrés, il suffit de calculer les dérivés en zéro de la fonction coût pour trouver les meilleurs paramètres a et b.

La méthode des Équations Normales intègre le mécanisme de la méthode des moindres carrés sous forme de matrice: Il suffit de transformer notre Dataset en matrice et on obtient les paramètres a et b avec la formule
\theta =(X^{T}X)^{-1} X^{T}Y

le modèle linéaire est alors Y = X\theta

Laissez-moi votre avis, merci !

J’ai pour objectif de vous aider le mieux possible dans votre apprentissage du machine learning. Alors si vous avez trouver cet article trop long, trop court etc, merci de me donner votre feedback en commentaire. J’en tiendrais compte pour que votre prochaine lecture soit plus efficace ! Merci.

Bonus: L’histoire qui montre la puissance des Équations Normales

En 1801, un astronome italien a découvert l’astéroïde Céres en observant le ciel. Il réussi à suivre sa trace pendant plusieurs semaines, puis le perdit de vue. C’est alors une grande compétition qui démarre entre les physiciens du monde entier, chacun essayant de retrouver l’objet en utilisant des calculs complexes. Presque tous échouent, sauf un astronome allemand qui a utilisé la méthode des moindres carrés sur l’ensemble des données récoltés initialement. A l’époque Carl Gauss avait 24 ans mais il avait déjà développer les fondements de sa méthode à l’âge de 18 ans !

La méthode est tellement efficace qu’elle permit de prédire avec précision la position de l’astéroïde un an après sa disparition. Imaginez pouvoir prédire le future aussi loin ! C’est en fait possible avec la méthode des Équations Normales.

Cet article a 8 commentaires

  1. Thomas

    Bonjour,
    Tout d’abord, article très intéressant, merci :-))

    Je trouve vos graphiques super attractifs, avec quoi les réaliser vous? Quel logiciel ?
    J’aimerai aussi pouvoir faire le style surlignage pour mes fiches de révision, merci par avance !

    Thomas

    1. Guillaume Saint-Cirgue

      Merci beaucoup Thomas. Je fais mes graphiques sur tablette en dessinant au stylet dans l’application Bloc note d’Apple.

      1. Thomas

        D’accord, c’est la tablette qui fait tout le style en fait? Car Bloc note Apple est très simpliste si je dis pas de bêtise ^^

        Vous avez quelle tablette ? (j’en vois tellement :p)

        1. Guillaume Saint-Cirgue

          C’est un Ipad 6eme génération. En effet le bloc note est très simpliste mais avec un stylet on peut faire des graphiques sympas 🙂

  2. Malick NDIAYE

    Bonjour Guillaume,
    J’ai bien compris l’aspect mathématique et beaucoup de codes de modèle de régression linéaire à travers
    vos vidéos et je vous en remercie énormément. Cependant, j’aimerais également comprendre comment implémenter
    avec python, l’équation du modèle de machine learning.
    Je vous remercie encore une fois de plus.

    1. Guillaume Saint-Cirgue

      Bonjour, je vous conseille de suivre ma série de videos Python Machine Learning pour répondre a cette question

  3. Imane

    Bonjour,
    merci beaucoup pour le cours c est formidable
    je veux svp le code entier 🙂
    merci

  4. Esso

    Vous êtes au top Monsieur.
    Que Dieu vous garde pour les jeunes apprenants comme nous . Je vous souhaite tout le meilleur que vous désirez

Laisser un commentaire