Apprentissage automatique - Régression linéaire
Régression
Le terme régression est utilisé lorsque vous essayez de trouver la relation entre des variables.
Dans l'apprentissage automatique et dans la modélisation statistique, cette relation est utilisée pour prédire le résultat d'événements futurs.
Régression linéaire
La régression linéaire utilise la relation entre les points de données pour tracer une ligne droite à travers eux.
Cette ligne peut être utilisée pour prédire les valeurs futures.
En Machine Learning, prédire l'avenir est très important.
Comment ça marche?
Python a des méthodes pour trouver une relation entre les points de données et pour tracer une ligne de régression linéaire. Nous allons vous montrer comment utiliser ces méthodes au lieu de passer par la formule mathématique.
Dans l'exemple ci-dessous, l'axe des x représente l'âge et l'axe des y représente la vitesse. Nous avons enregistré l'âge et la vitesse de 13 voitures alors qu'elles passaient devant un poste de péage. Voyons si les données que nous avons collectées pourraient être utilisées dans une régression linéaire :
Exemple
Commencez par dessiner un nuage de points :
import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()
Résultat:
Exemple
Importez scipy
et tracez la ligne de régression linéaire :
import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
Résultat:
Exemple expliqué
Importez les modules dont vous avez besoin.
Vous pouvez en savoir plus sur le module Matplotlib dans notre Tutoriel Matplotlib .
Vous pouvez en savoir plus sur le module SciPy dans notre didacticiel SciPy .
import matplotlib.pyplot as plt
from scipy
import stats
Créez les tableaux qui représentent les valeurs des axes x et y :
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
Exécutez une méthode qui renvoie certaines valeurs clés importantes de la régression linéaire :
slope, intercept, r,
p, std_err = stats.linregress(x, y)
Créez une fonction qui utilise les valeurs slope
et
intercept
pour renvoyer une nouvelle valeur. Cette nouvelle valeur représente où sur l'axe y la valeur x correspondante sera placée :
def myfunc(x):
return slope * x + intercept
Exécutez chaque valeur du tableau x via la fonction. Cela se traduira par un nouveau tableau avec de nouvelles valeurs pour l'axe des ordonnées :
mymodel = list(map(myfunc, x))
Dessinez le nuage de points d'origine :
plt.scatter(x, y)
Tracez la droite de régression linéaire :
plt.plot(x, mymodel)
Affichez le diagramme :
plt.show()
R pour Relation
Il est important de savoir quelle est la relation entre les valeurs de l'axe des x et les valeurs de l'axe des y, s'il n'y a pas de relation, la régression linéaire ne peut pas être utilisée pour prédire quoi que ce soit.
Cette relation - le coefficient de corrélation - est appelée
r
.
La r
valeur est comprise entre -1 et 1, où 0 signifie aucune relation et 1 (et -1) signifie 100 % lié.
Python et le module Scipy calculeront cette valeur pour vous, tout ce que vous avez à faire est de l'alimenter avec les valeurs x et y.
Exemple
Dans quelle mesure mes données s'intègrent-elles dans une régression linéaire ?
from scipy import stats
x =
[5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
print(r)
Remarque : Le résultat -0,76 montre qu'il existe une relation, non parfaite, mais il indique que nous pourrions utiliser la régression linéaire dans les prédictions futures.
Prédire les valeurs futures
Nous pouvons maintenant utiliser les informations que nous avons recueillies pour prédire les valeurs futures.
Exemple : Essayons de prédire la vitesse d'une voiture de 10 ans.
Pour ce faire, nous avons besoin de la même myfunc()
fonction de l'exemple ci-dessus :
def myfunc(x):
return slope * x + intercept
Exemple
Prédire la vitesse d'une voiture de 10 ans :
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
speed = myfunc(10)
print(speed)
L'exemple prévoyait une vitesse à 85,6, que nous pouvions également lire sur le diagramme :
Mauvais ajustement ?
Créons un exemple où la régression linéaire ne serait pas la meilleure méthode pour prédire les valeurs futures.
Exemple
Ces valeurs pour les axes x et y devraient entraîner un très mauvais ajustement pour la régression linéaire :
import matplotlib.pyplot as plt
from scipy import stats
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y =
[21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
slope,
intercept, r, p, std_err = stats.linregress(x, y)
def
myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc,
x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
Résultat:
Et la r
relation?
Exemple
Vous devriez obtenir une r
valeur très faible.
import numpy
from scipy import stats
x =
[89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y =
[21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
print(r)
Le résultat : 0,013 indique une très mauvaise relation et nous indique que cet ensemble de données n'est pas adapté à la régression linéaire.