régression linéaire

Régression linéaire : fonctionnement et exemple avec Python

Le problème le plus simple et le plus ancien en machine learning est la régression linéaire. Après avoir expliquer le principe théorique, on verra comment faire de la régression en pratique avec Python. Vous verrez c’est très simple. Je ne sais même pas si on peut parler de machine learning, mais bon ça fait plus stylé 😎

Régression linéaire : fonctionnement et exemple avec Python

Mais attention ! Malgré sa simplicité le modèle de régression est encore très utilisé pour des applications concrètes. C’est pour cela que c’est l’un des premiers modèles que l’on apprend en statistiques.

Fonctionnement de la régression linéaire

Le principe de la régression linéaire est très simple. On a un ensemble de points et on cherche la droite qui correspond le mieux à ce nuage de points. C’est donc simplement un travail d’optimisation que l’on doit faire.

En dimension 2, le problème de régression linéaire a l’avantage d’être facilement visualisable. Voilà ce que ça donne.

Illustration de la régression linéaire en dimension 2
Illustration de la régression linéaire en dimension 2 (Source : Towards data science)

La régression linéaire est souvent utiliser comme un moyen de détecter une éventuelle dépendance linéaire entre deux variables. Elle sert aussi souvent lorsqu’il s’agit de faire des prédictions.

Et oui ! Je vous ai dit de ne pas sous-estimer cette méthode !

Régression linéaire : fonctionnement et exemple avec Python

Notion d’erreur quadratique moyenne

Pour évaluer la précision d’une droite d’estimation, nous devons introduire une métrique de l’erreur. Pour cela on utilise souvent l’erreur quadratique moyenne (ou mean squared error).

L’erreur quadratique moyenne est la moyenne des carrées des différences entre les valeurs prédites et les vraies valeurs. Bon peut être que ce n’est pas assez clair dit de cette manière. Voici la formule.

Régression linéaire : fonctionnement et exemple avec Python
Formule de l’erreur quadratique moyenne (Source : Data Vedas)

Par exemple si vos valeurs sont les suivantes :

y = [1,1.5,1.2,0.9,1]

Et que les valeurs prédites par votre modèle sont les suivantes :

y_pred = [1.1,1.2,1.2,1.3,1.2]

L’erreur quadratique moyenne vaudra alors :

MSE = (1/5)*((1-1.1)²+(1.5-1.2)²+(1.2-1.2)²+(0.9-1.3)²+(1-1.2)²)
    = 0.012 = 1.2%

Avec Python, le calcul grâce à Numpy est simple :

MSE = np.mean((y - y_pred)**2)

Au delà de la régression linéaire, l’erreur quadratique moyenne est vraiment primordiale en machine learning. C’est souvent la métrique d’erreur qui est utilisée (c’est ce qu’on appelle la loss function). Il y a plusieurs raisons à ça.

Sans entrer dans les détails théoriques sous-jacents, il se trouve que la régularité de l’erreur quadratique moyenne est très utile pour l’optimisation. L’optimisation en mathématiques est la branche qui s’intéresse à la minimisation des fonctions. Et il se trouve que les fonctions régulières (convexes, continues, dérivables, etc.) sont plus faciles à optimiser.

Pour les plus matheux, cet article sur Towards data science compare les résultats obtenus pour plusieurs mesures d’erreurs. Vous aurez une explication beaucoup plus détaillée.

Trouver l’erreur minimale avec une descente de gradient

En pratique on cherchera à exprimer l’erreur quadratique moyenne en fonction des paramètres de notre droite. En dimension 2 par exemple, l’erreur sera exprimée simplement en fonction du coefficient directeur et de l’ordonnée à l’origine.

Une fois qu’on a cette expression, il s’agit de trouver le minimum de cette fonction. C’est à dire la droite qui minimise l’erreur.

Pour cela on utilise souvent la descente de gradient, mais de nombreuses méthodes d’optimisation existent. Cette question est détaillée dans un de mes articles.

Régression linéaire avec scikit learn

Maintenant que l’on a compris le fonctionnement de la régression linéaire, voyons comment implémenter ça avec Python.

Scikit learn est la caverne d’Alibaba du data scientist. Quasiment tout y est ! Voici comment implémenter un modèle de régression linéaire avec scikit learn.

scikit learn pour la régression linéaire

Pour résoudre ce problème, j’ai récupéré des données sur Kaggle sur l’évolution du salaire en fonction du nombre d’années d’expérience.

Dans le cadre d’un vrai problème on aurait séparé nos données en une base d’entraînement et une base de test. Mais n’ayant que 35 observations, je préfère qu’on utilise tout pour l’entraînement.

On commence par importer les modules que l’on va utiliser :

import pandas as pd # Pour importer le tableau
import matplotlib.pyplot as plt # Pour tracer des graphiques
import numpy as np # Pour le calcul numérique

from sklearn.linear_model import LinearRegression 
# le module scikit

On importe maintenant les données. Vous pouvez télécharger le fichier csv ici.

data = pd.read_csv('Salary.csv')

# On transforme les colonnes en array
x = np.array(data['YearsExperience'])
y = np.array(data['Salary'])

# On doit transformer la forme des vecteurs pour qu'ils puissent être
# utilisés par Scikit learn

x = x.reshape(-1,1)
y = y.reshape(-1,1)

On a deux colonnes, Years of experience le nombre d’années d’expérience et Salary qui donne le salaire.

D’abord, on peut commencer par tracer la première variable en fonction de l’autre. On remarque bien la relation de linéarité entre les deux variables.

plt.scatter(x,y)

La fonction plt.scatter permet de tracer un nuage de points.

Le résultat est le suivant :

régression linéaire du salaire en fonction de l'expérience
Evolution du salaire en fonction du nombre d’années d’expérience (Source : Kaggle)

Il est temps de construire le modèle :

reg = LinearRegression(normalize=True)
reg.fit(x,y)

Je rappelle que l’on souhaite trouver la droite f(x)=ax+b qui minimise l’erreur.

Pour accéder à ces valeurs on peut écrire :

a = reg.coef_
b = reg.intercept_

Traçons la courbe de prédictions :

ordonne = np.linspace(0,15,1000)

plt.scatter(x,y)
plt.plot(ordonne,a*ordonne+b,color='r')

On obtient le résultat suivant :

régression linéaire avec scikit learn
Résultat de la régression avec Scikit learn

Voilà ! Notre droite de régression linéaire est construite. Maintenant si vous connaissez l’expérience d’un salarié vous pouvez prédire son salaire en calculant :

salaire = a*experience+b

Tous les codes sont disponibles sur Google Colab à cette adresse.