Masjienleer - Polinoomregressie
Polinoomregressie
As jou datapunte duidelik nie 'n lineêre regressie sal pas nie ('n reguit lyn deur alle datapunte), kan dit ideaal wees vir polinoomregressie.
Polinomiale regressie, soos lineêre regressie, gebruik die verwantskap tussen die veranderlikes x en y om die beste manier te vind om 'n lyn deur die datapunte te trek.
Hoe werk dit?
Python het metodes om 'n verband tussen datapunte te vind en om 'n lyn van polinoomregressie te trek. Ons sal jou wys hoe om hierdie metodes te gebruik in plaas daarvan om deur die wiskundige formule te gaan.
In die voorbeeld hieronder het ons 18 motors geregistreer terwyl hulle by 'n sekere tolhuis verby is.
Ons het die motor se spoed geregistreer, en die tyd van die dag (uur) wat die verbyry plaasgevind het.
Die x-as verteenwoordig die ure van die dag en die y-as verteenwoordig die spoed:
Voorbeeld
Begin deur 'n spreidingsdiagram te teken:
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
Voer numpy
in en
matplotlib
trek dan die lyn van polinoomregressie:
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 Verduidelik
Voer die modules in wat jy benodig.
Jy kan meer oor die NumPy-module leer in ons NumPy-tutoriaal .
Jy kan meer oor die SciPy-module leer in ons SciPy-tutoriaal .
import numpy
import matplotlib.pyplot as plt
Skep die skikkings wat die waardes van die x- en y-as verteenwoordig:
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 het 'n metode waarmee ons 'n polinoommodel kan maak:
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
Spesifiseer dan hoe die lyn sal vertoon, ons begin by posisie 1, en eindig by posisie 22:
myline = numpy.linspace(1, 22, 100)
Teken die oorspronklike verspreidingsgrafiek:
plt.scatter(x, y)
Trek die lyn van polinoomregressie:
plt.plot(myline, mymodel(myline))
Vertoon die diagram:
plt.show()
R-kwadraat
Dit is belangrik om te weet hoe goed die verwantskap tussen die waardes van die x- en y-as is, as daar geen verwantskap is nie, kan die polinoomregressie nie gebruik word om enigiets te voorspel nie.
Die verwantskap word gemeet met 'n waarde wat die r-kwadraat genoem word.
Die r-kwadraatwaarde wissel van 0 tot 1, waar 0 geen verwantskap beteken nie, en 1 beteken 100% verwant.
Python en die Sklearn-module sal hierdie waarde vir jou bereken, al wat jy hoef te doen is om dit met die x- en y-skikkings te voer:
Voorbeeld
Hoe goed pas my data in 'n polinoomregressie?
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)))
Let wel: Die resultaat 0.94 toon dat daar 'n baie goeie verwantskap is, en ons kan polinoomregressie in toekomstige voorspellings gebruik.
Voorspel toekomstige waardes
Nou kan ons die inligting wat ons ingesamel het gebruik om toekomstige waardes te voorspel.
Voorbeeld: Kom ons probeer om die spoed van 'n motor wat omstreeks 17:00 by die tolhuis verbyry, te voorspel:
Om dit te doen, benodig ons dieselfde mymodel
skikking van die voorbeeld hierbo:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Voorbeeld
Voorspel die spoed van 'n motor wat om 17:00 verbyry:
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)
Die voorbeeld het 'n spoed voorspel om 88.87 te wees, wat ons ook uit die diagram kon lees:
Slegte fiksheid?
Kom ons skep 'n voorbeeld waar polinoomregressie nie die beste metode sal wees om toekomstige waardes te voorspel nie.
Voorbeeld
Hierdie waardes vir die x- en y-as behoort 'n baie slegte passing vir polinoomregressie tot gevolg te hê:
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 die r-kwadraatwaarde?
Voorbeeld
Jy behoort 'n baie lae r-kwadraatwaarde te kry.
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)))
Die resultaat: 0,00995 dui op 'n baie slegte verwantskap, en sê vir ons dat hierdie datastel nie geskik is vir polinoomregressie nie.