Machine Learning - Polynomial Regression

Polynoomregressie (Polynomial Regression)

Als uw data-punten duidelijk niet geschikt zijn voor lineaire regressie (een lijn die door de data-punten gaat), dan kan polynoomregressie een ideaal alternatief zijn.

Net als lineaire regressie gebruikt polynoomregressie de relatie tussen de variabelen x en y om de beste methode te vinden om de lijn van de datapunten te tekenen.


Werkingsprincipe

Python biedt enkele methoden om de relatie tussen datapunten te vinden en een polynoomregressielijn te tekenen. We zullen u laten zien hoe u deze methoden kunt gebruiken in plaats van door middel van wiskundige formules.

In onderstaand voorbeeld hebben we 18 auto's geregistreerd die een specifieke tolboog zijn gepasseerd.

We hebben de snelheid en de doorrijtijd (uren) van auto's geregistreerd.

De x-as vertegenwoordigt de uren van de dag, de y-as vertegenwoordigt de snelheid:

Example

Teken eerst het scatterplot:

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()

Result:


Run Example

Example

importeren numpy en matplotliben teken vervolgens de polynoomregressielijn:

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()

Result:


Run Example

Voorbeeld uitleg

Importeer de benodigde modules:

import numpy
import matplotlib.pyplot as plt

Maak een array die de waarden van de x- en y-as vertegenwoordigt:

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 biedt een methode om een polynoommodel te bouwen:

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

Specificeer vervolgens de weergave van de lijn, we beginnen bij positie 1 en eindigen bij positie 22:

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

Teken de oorspronkelijke scatterplot:

plt.scatter(x, y)

Teken de polynoomregressielijn:

plt.plot(myline, mymodel(myline))

Toon grafiek:

plt.show()

R-Squared

Het is belangrijk om te weten hoe goed de waarden van de x- en y-as met elkaar in relatie staan, want zonder relatie kan polynoomregressie niet gebruikt worden om iets te voorspellen.

De relatie wordt gemeten met de waarde van r-kwadraat (r-squared).

De bereik van de r-kwadraatwaarde is van 0 tot 1, waarbij 0 betekent dat er geen relatie is en 1 betekent dat er een 100% relatie is.

Python en de Sklearn-module zullen deze waarde voor u berekenen, u hoeft alleen maar de x- en y-arrays in te voeren:

Example

Hoe goed past mijn data aan in polynoomregressie?

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)))

Run Example

Opmerking:Het resultaat van 0.94 geeft aan dat er een goede relatie bestaat, en we kunnen polynoomregressie gebruiken in toekomstige voorspellingen.

Voorspellen van toekomstige waarden

Nu kunnen we gebruik maken van de verzamelde informatie om toekomstige waarden te voorspellen.

Bijvoorbeeld: laten we proberen de snelheid van auto's die omstreeks 17 uur 's avonds door een tolstation rijden te voorspellen:

Daarom hebben we dezelfde voorbeeld zoals hierboven nodig: mymodel Array:

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

Example

Voorspel de snelheid van auto's om 17 uur 's avonds:

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)

Run Example

De voorspellingsnelheid van dit voorbeeld is 88.87, wat we ook kunnen zien in de grafiek:


Slechte aanpassing?

Laat ons een voorbeeld maken waarin polynoomregressie niet de beste methode is om toekomstige waarden te voorspellen.

Example

These values for the x and y axes will cause the fit of polynomial regression to be very poor:

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()

Result:


Run Example

What about the r-squared value?

Example

You should get a very low r-squared value.

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)))

Run Example

Result: 0.00995 indicates a very poor relationship and tells us that the dataset is not suitable for polynomial regression.