Apprentissage automatique - Régression polynomiale

Régression polynomiale (Polynomial Regression)

Si vos points de données ne conviennent clairement pas à la régression linéaire (une ligne passant entre les points de données), la régression polynomiale pourrait être une bonne option.

Comme la régression linéaire, la régression polynomiale utilise la relation entre les variables x et y pour trouver la meilleure méthode pour tracer la ligne des points de données.


Principe de fonctionnement

Python a plusieurs méthodes pour trouver la relation entre les points de données et tracer la ligne de régression polynomiale. Nous vous montrerons comment utiliser ces méthodes plutôt que par des formules mathématiques.

Dans l'exemple suivant, nous avons enregistré 18 véhicules passant par un péage spécifique.

Nous avons enregistré la vitesse des véhicules et le temps de passage (heures).

L'axe des abscisses représente l'heure d'une journée, l'axe des ordonnées représente la vitesse :

Exemple

Tout d'abord, tracez le graphique des points dispersés :

import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
plt.scatter(x, y)
plt.show()

Résultat :


Exécution de l'exemple

Exemple

importer numpy et matplotlibensuite, tracez la ligne de régression polynomiale :

import numpy
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

Résultat :


Exécution de l'exemple

Explication de l'exemple

Importer les modules nécessaires :

import numpy
import matplotlib.pyplot as plt

Créer un tableau représentant les valeurs de l'axe x et de l'axe y :

x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]

NumPy a une méthode pour nous permettre de construire un modèle polynomial :

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Ensuite, spécifiez la manière d'afficher les lignes, nous commençons à la position 1 et finissons à la position 22 :

myline = numpy.linspace(1, 22, 100)

tracer le graphique des points dispersés d'origine :

plt.scatter(x, y)

tracer la ligne de régression polynomiale :

plt.plot(myline, mymodel(myline))

Afficher le graphique :

plt.show()

R-Squared

Il est important de savoir combien bien les valeurs de l'axe x et de l'axe y sont liées, car sans relation, la régression polynomiale 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 corrélation (r²).

La plage de la valeur de l'adjus té de la régression (R²) est de 0 à 1, où 0 signifie pas de corrélation, et 1 signifie 100% de corrélation.

Python et le module Sklearn calculeront cette valeur pour vous, tout ce que vous avez à faire est d'entrer les tableaux x et y :

Exemple

Comment mon ajustement de données s'effectue-t-il en régression polynomiale ?

import numpy
from sklearn.metrics import r2_score
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))

Exécution de l'exemple

Remarque :Le résultat 0,94 indique une bonne relation, nous pouvons utiliser la régression polynomiale 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 des véhicules passant par le péage à environ 17 heures le soir :

Pour cela, nous avons besoin des mêmes exemples que ceux ci-dessus mymodel Tableau :

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Exemple

Prédire la vitesse du passage du véhicule à 17 heures l'après-midi :

import numpy
from sklearn.metrics import r2_score
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
speed = mymodel(17)
print(speed)

Exécution de l'exemple

La vitesse de prédiction de cet exemple est de 88,87, et nous pouvons également le voir sur le graphique :


Mauvaise ajustement ?

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

Exemple

Ces valeurs sur les axes x et y entraîneront une mauvaise adéquation de la régression polynomiale :

import numpy
import matplotlib.pyplot as plt
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]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(2, 95, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

Résultat :


Exécution de l'exemple

Qu'est-ce que la valeur de r-squared ?

Exemple

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

import numpy
from sklearn.metrics import r2_score
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]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))

Exécution de l'exemple

Résultat : 0.00995 indique une mauvaise relation et nous dit que ce jeu de données n'est pas adapté à la régression polynomiale.