Machine learning - polynomiale regressie
Polynomiale regressie
Als uw gegevenspunten duidelijk niet passen in een lineaire regressie (een rechte lijn door alle gegevenspunten), kan dit ideaal zijn voor polynomiale regressie.
Polynomiale regressie gebruikt, net als lineaire regressie, de relatie tussen de variabelen x en y om de beste manier te vinden om een lijn door de gegevenspunten te trekken.
Hoe werkt het?
Python heeft methoden om een relatie tussen datapunten te vinden en om een lijn van polynomiale regressie te tekenen. We laten u zien hoe u deze methoden kunt gebruiken in plaats van de wiskundige formule te doorlopen.
In het onderstaande voorbeeld hebben we 18 auto's geregistreerd terwijl ze een bepaald tolhuisje passeerden.
We hebben de snelheid van de auto geregistreerd en het tijdstip (uur) waarop het passeren plaatsvond.
De x-as vertegenwoordigt de uren van de dag en de y-as vertegenwoordigt de snelheid:
Voorbeeld
Begin met het tekenen van een spreidingsplot:
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()
Resultaat:
Voorbeeld
Importeer numpy
en
matplotlib
teken vervolgens de lijn van polynomiale regressie:
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()
Resultaat:
Voorbeeld uitgelegd
Importeer de modules die je nodig hebt.
U kunt meer te weten komen over de NumPy-module in onze NumPy-zelfstudie .
U kunt meer te weten komen over de SciPy-module in onze SciPy-zelfstudie .
import numpy
import matplotlib.pyplot as plt
Maak de arrays die de waarden van de x- en y-as vertegenwoordigen:
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 heeft een methode waarmee we een polynoommodel kunnen maken:
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
Geef vervolgens op hoe de regel wordt weergegeven, we beginnen op positie 1 en eindigen op positie 22:
myline = numpy.linspace(1, 22, 100)
Teken de originele scatterplot:
plt.scatter(x, y)
Teken de lijn van polynomiale regressie:
plt.plot(myline, mymodel(myline))
Geef het diagram weer:
plt.show()
R-kwadraat
Het is belangrijk om te weten hoe goed de relatie tussen de waarden van de x- en y-as is, als er geen relatie is kan de polynomiale regressie niet gebruikt worden om iets te voorspellen.
De relatie wordt gemeten met een waarde die het r-kwadraat wordt genoemd.
De r-kwadraatwaarde varieert van 0 tot 1, waarbij 0 betekent dat er geen relatie is en 1 100% gerelateerd is.
Python en de Sklearn-module zullen deze waarde voor u berekenen, het enige wat u hoeft te doen is deze te voeden met de x- en y-arrays:
Voorbeeld
Hoe goed passen mijn gegevens in een polynomiale regressie?
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)))
Opmerking: het resultaat 0,94 laat zien dat er een zeer goede relatie is, en we kunnen polynomiale regressie gebruiken in toekomstige voorspellingen.
Toekomstige waarden voorspellen
Nu kunnen we de informatie die we hebben verzameld gebruiken om toekomstige waarden te voorspellen.
Voorbeeld: Laten we proberen de snelheid te voorspellen van een auto die rond 17 uur de tolpoort passeert:
Om dit te doen, hebben we dezelfde mymodel
array nodig uit het bovenstaande voorbeeld:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Voorbeeld
Voorspel de snelheid van een passerende auto om 17.00 uur:
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)
Het voorbeeld voorspelde een snelheid van 88,87, wat we ook uit het diagram konden aflezen:
Slechte pasvorm?
Laten we een voorbeeld maken waarin polynomiale regressie niet de beste methode zou zijn om toekomstige waarden te voorspellen.
Voorbeeld
Deze waarden voor de x- en y-as zouden moeten resulteren in een zeer slechte pasvorm voor polynomiale regressie:
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()
Resultaat:
En de r-kwadraat waarde?
Voorbeeld
U zou een zeer lage r-kwadraatwaarde moeten krijgen.
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)))
Het resultaat: 0,00995 geeft een zeer slechte relatie aan en vertelt ons dat deze dataset niet geschikt is voor polynomiale regressie.