Apprentissage automatique - Régression linéaire

Régression

Lorsque vous essayez de trouver des relations entre les variables, le terme "régression" est utilisé.

Dans le domaine de l'apprentissage automatique et du modélisation statistique, cette relation est utilisée pour prédire les résultats futurs des événements.

Régression linéaire

La régression linéaire trace une ligne droite entre les points de données en utilisant les relations entre les points de données.

Cette ligne peut être utilisée pour prédire les valeurs futures.


Dans l'apprentissage automatique, la prédiction future est très importante.

Principe de fonctionnement

Python fournit des méthodes pour trouver des relations entre les points de données et dessiner des lignes de régression linéaire. Nous vous montrerons comment utiliser ces méthodes plutôt que par des formules mathématiques.

Dans l'exemple suivant, l'axe des abscisses représente l'âge du véhicule, et l'axe des ordonnées représente la vitesse. Nous avons enregistré l'âge et la vitesse de 13 voitures passant par le péage. Voyons si les données que nous avons collectées peuvent être utilisées pour la régression linéaire :

Exemple

Dessinez d'abord le graphique en 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 :


Exécuter l'exemple

Exemple

importer 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 :


Exécuter l'exemple

Explication de l'exemple

Importer les modules nécessaires :

import matplotlib.pyplot as plt
from scipy import stats

Créer un tableau représentant les valeurs de l'axe des abscisses et des ordonnées :

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écuter une méthode qui retourne des valeurs clés importantes de la régression linéaire :

slope, intercept, r, p, std_err = stats.linregress(x, y)

Créer un utilisant pente et intercept La fonction de valeur retourne de nouvelles valeurs. Cette nouvelle valeur représente la position de l'axe des ordonnées où se trouvera la valeur correspondante de l'axe des abscisses :

def myfunc(x):
  return slope * x + intercept

Exécuter chaque valeur de l'array x par la fonction. Cela produira un nouveau tableau, où l'axe des ordonnées aura de nouvelles valeurs :

mymodel = list(map(myfunc, x))

tracer le graphique en nuage de points original :

plt.scatter(x, y)

tracer la ligne de régression linéaire :

plt.plot(x, mymodel)

Afficher le graphique :

plt.show()

R-Squared

Il est important de savoir combien bien les valeurs de l'axe des abscisses et les valeurs de l'axe des ordonnées sont liées. Si 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 est mesurée par une valeur appelée le coefficient de détermination (r-squared).

La valeur de r carré (r-squared) varie de 0 à 1, où 0 signifie pas de corrélation, et 1 signifie 100% de corrélation.

Le module Python et Scipy vous calculeront cette valeur, vous n'avez qu'à fournir les valeurs x et y :

Exemple

Comment mes données s'ajustent-elles en 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)

Exécuter l'exemple

Remarque :Le résultat -0,76 indique qu'il existe une certaine relation, mais pas une relation parfaite, mais cela indique que nous pouvons utiliser la régression linéaire pour les prédictions futures.

Prédire les valeurs futures

Maintenant, nous pouvons utiliser les informations collectées pour prédire les valeurs futures.

Par exemple : essayons de prédire la vitesse d'une voiture ayant 10 ans d'âge.

Pour cela, nous avons besoin des mêmes données que dans l'exemple précédent myfunc() Fonction :

def myfunc(x):
  return slope * x + intercept

Exemple

Prédire la vitesse d'une voiture ayant 10 ans d'âge :

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)

Exécuter l'exemple

La vitesse de prédiction de cet exemple est de 85,6, et nous pouvons également la lire à partir du graphique :


Mauvaise ajustement ?

Laissons-nous créer un exemple où la régression linéaire n'est pas la meilleure méthode pour prédire les valeurs futures.

Exemple

Ces valeurs pour les axes x et y entraîneront une très mauvaise adéquation de 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 :


Exécuter l'exemple

et la valeur de r-squared ?

Exemple

Vous devriez obtenir une valeur très basse de r-squared.

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)

Exécuter l'exemple

Résultat : 0,013 indique une mauvaise relation et nous indique que ce jeu de données n'est pas adapté à la régression linéaire.