Accueil Algorithme Machine Learning pour débutant : Régression linéaire avec une seule variable partie...

Machine Learning pour débutant : Régression linéaire avec une seule variable partie I

192
0

Prérequis

Pour suivre et comprendre cet article dans les meilleurs conditions, il est recommandé de :

Introduction

Cet article est la première partie des deux articles dans lesquels on traite de la régression linéaire avec une variable. La régression linéaire fait partie de la catégorie des techniques d’apprentissage supervisé. Dans cet article, nous commencerons par parler du dataset (le comprendre et l’explorer) avant de représenter notre modèle pour ainsi terminer par la l’implémentation de la fonction d’erreur.

Comprendre le dataset

Nous allons réaliser un modèle qui permet de prédire le profit d’un food-truck à partir du nombre d’habitants de la ville où il sera stationné. Pour ce faire, nous disposons d’un dataset qui contient les profits de plusieurs food-truck stationnés dans plusieurs villes.

Le dataset a été téléchargé depuis Coursera. Il s’agit d’un fichier csv(food-truck_profits.txt) qui contient deux champs qui portent sur les profits de différents food truck dans des villes. Chaque ligne représente un food truck dans une ville.

Les deux champs sont :

  • Le premier champ représente le nombre d’habitant de la ville.
  • Le deuxième champ représente le profit (en dollars) d’un food truck sur cette ville.
Maintenant, allons recupérer ces deux champs et voir à quoi ils ressemblent.

Ce qui nous donne le résultat suivant :

On a recupéré le nombre d’habitants des villes (X) et le profit des food truck correspondant (Y) qu’on a mis sur un tableau à deux colonnes qui se nomme “dataset”.

On nomme m le nombre d’exemples (de food trucks) dans le dataset.On obtient ainsi l’ensemble \(E_m = \{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),…,(x^{(m)},y^{(m)})\} \)

De ce fait \( (x^{(i)}, y^{(i)}) \) représente la i-ème ligne de la table “dataset” :  le nombre d’habitant \( x^{(i)} \) de la i-ème ville et le profits \( y^{(i)} \) de la i-ème food truck dans cette ville.

Si on visualise le dataset, on aura :

Resultat du code ci-dessus (crédit : Mar Mbengue – Tous droits réservés)

Représenter le modèle

Représentation du modèle

Nous avons maintenant notre dataset qui représente les profits des food truck en sachant le nombre d’habitants des villes qui les accueillent. Pour realiser le modele de régression linéaire, il nous faut trouver (apprendre) une fonction \( h_\Theta : X \rightarrow Y \)

Cette fonction est appelé \( h_\Theta \) par convention (h pour se reférer au mot “hypothese” et \( \Theta \) pour faire référence aux paramètres de la fonction).

Puisqu’il s’agit d’une regression linéaire, la fonction \( h_\Theta \) sera linéaire et elle sera représentée par :

\( h_\Theta (x) = \Theta_0 + \Theta_1 x \)

Pour que notre modèle soit pertinent, la condition suivante doit être vraie :

quelque soit \( (x^{(i)}, y^{(i)}) \in E_m \) , on a : \( h_\Theta (x^{(i)}) \approx y^{(i)} \).

Pour que la condition ci-dessus soit vraie, il nous faut trouver des valeurs adéquates pour les paramètres (\( \Theta_0 \) et \( \Theta_1 \)) de la fonction \( h_\Theta \).

Maintenant, la question qu’on peut se poser est “comment trouver les bonnes valeurs pour les paramètres \( \Theta_0 \) et \( \Theta_1 \) ?”. Nous allons y répondre dans la deuxième partie de cette article.

Implémentation vectorielle du modèle

Pour rendre notre fonction \( h_\Theta \). plus performante en temps de calcule, on peut le vectoriser. Selon wikipedia, “La vectorisation est le processus de conversion d’un programme informatique à partir d’une implémentation scalaire, qui traite une seule paire d’opérandes à la fois, à une implémentation vectorielle qui traite une opération sur plusieurs paires d’opérandes à la fois.”

Pour implémenter véctoriellement notre modèle :

  • On transforme d’abord les parametres \( \Theta_0 \) et \( \Theta_1 \) en vecteur \( \Theta = \begin{pmatrix}{\Theta_0}\\ {\Theta_1}\end{pmatrix} \).
  • Ensuite, on transforme x en vecteur \( x =\begin{pmatrix}{x_0}\\ {x_1}\end{pmatrix} \) avec \( x_0=1 \) et \( x_1= nombre \hspace{0.2cm} d’habitants \).

     

La fonction \( h_\Theta \) devient alors :

 \( h_\Theta (x) = \Theta^T x \)

\(\Theta^T \) est le vecteur transposé de \( \Theta \)

Dans le reste de l’article et de la série, on implémentera toujours les modèles de manière vectorielle.

Si on représente vectoriellement tout le dataset, on aura :
Pour tous les \( x^{(i)} \in X \) on aura \( x^{(i)} =\begin{pmatrix}{x^{(i)}_0}\\{x^{(i)}_1}\end{pmatrix} \) avec \( x^{(i)}_0=1 \) et \( x^{(i)}_1=x_1 \)

L’ensemble X des nombres d’habitants des villes va devenir : \( X = \begin{pmatrix} 1 & x^{(1)}_1\\ 1 & x^{(2)}_1\\  .&. \\  .&. \\  .&. \\ 1 & x^{(n)}_1\end{pmatrix} \)

Quand on fait une régréssion linéaire; on ajoute toujours (par convention) au debut du dataset une colonne dont toutes les valeurs sont égales à 1.

on modifie la varable dataset afin d’ajouter une colonne (avec des 1) devant. ce qui va nous donner :

Le résultat va ressembler à :

On peut ainsi implémenter la fonction python qui correspond à \(h_\Theta \). Cette fonction prend en paramètres deux vecteurs :

  • x (ou une matrice mx2).
  • \(\Theta \) correspondant aux paramètres de notre modèle.

On définit la fonction python qui représente notre modèle de la manière suivante :

allons voir ce que donne la fonction h_theta sur des exemples :

résultat :

On voit que pour le premier exemple (food truck), la nombre d’habitants de la ville est 6.1101 et le profit est 17.592.

Quand on se sert de notre modèle h_theta pour estimer le profit de ce food truck on trouve 6.6101, ce qui veut dire que notre modèle n’est pas encore au point.

Pour qu’il soit au point il faudra l’entrainer avec notre dataset.

Fonction d’erreur

On a vu que notre modèle fait des erreurs dans l’estimation des profits des food truck. En prenant l’exemple du premier food truck de notre dataset qui est 17.592, notre modèle l’estime à 6.1101.

On peut definir l’erreur de notre modèle sur le premier food truck par : \( (h_\Theta (x^{(1)}) – y^{(1)})^2 = (6.1101 – 17.592)^2 =131.83 \)

Ce qui représente une grosse erreur car le profit estimé par notre modèle est trés loin du profit réel.

On peut ainsi définir la fonction d’erreur comme la moyene des erreurs de notre modèle sur le dataset E_m, Ce qui nous donne :

 

\( J(\Theta ) = \frac{1}{2m}\sum_{i=1}^{m}(h_\Theta (x^{(i)}) – y^{(i)})^2 \)

 

Cette fonction est aussi appelé erreur quadratique.

Par convension et pour faciliter le calcul du gradiant, on multiplie cette moyène par 1/2.

Lors de l’entrainement du modèle, c’est cette fonction \( J(\Theta )\) qu’on va essayé de minimiser. Ce qui revient à trouver un vecteur de paramèttre \( \Theta = \begin{pmatrix}{\Theta_0}\\ {\Theta_1}\end{pmatrix} \) pour lequel \( J(\Theta )\) serait le plus proche de 0.

On peut ainsi implémenter la fonction python qui correspond à la fonction d’erreur \( J(\Theta )\).

Cette fonction prend en parametre :

  • x (vecteur ou matrice mx2).
  • Un vecteur theta.
  • Un vecteur Y (ou un scalaire \(y_i\)).

et retourne la valeur de \( J(\Theta )\).

on peut calculer l’erreur :

résultat :

On voit que l’erreur est plus petite avec theta = (0.5, 1) qu’avec theta = (500, 1000), donc notre modèle est plus performant avec le parametre theta = (0.5, 1).

Conclusion

Aprés avoir définit la fonction d’erreurs, exploré le dataset et donner une représentation de notre modèle, on peut dire que notre modèle n’est pas encore performant car n’ayant pas les bons paramètres. Pour retrouver les bons paramètres, il faudra entrainer le modèle. D’ou l’objet de la deuxième partie de cet article qui va porter sur l’entrainement d’un modèle.

Crédit de l’image de couverture : Chire – CC BY-SA 3.0