Masjienleer - Lineêre regressie
Regressie
Die term regressie word gebruik wanneer jy probeer om die verband tussen veranderlikes te vind.
In Masjienleer, en in statistiese modellering, word daardie verhouding gebruik om die uitkoms van toekomstige gebeure te voorspel.
Lineêre regressie
Lineêre regressie gebruik die verwantskap tussen die datapunte om 'n reguit lyn deur almal te trek.
Hierdie lyn kan gebruik word om toekomstige waardes te voorspel.
In Masjienleer is die voorspelling van die toekoms baie belangrik.
Hoe werk dit?
Python het metodes om 'n verband tussen datapunte te vind en om 'n lyn van lineêre regressie 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 stel die x-as ouderdom voor, en die y-as verteenwoordig spoed. Ons het die ouderdom en spoed van 13 motors geregistreer terwyl hulle by 'n tolstasie verbygery het. Kom ons kyk of die data wat ons ingesamel het in 'n lineêre regressie gebruik kan word:
Voorbeeld
Begin deur 'n spreidingsdiagram te teken:
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()
Resultaat:
Voorbeeld
Voer scipy
in en trek die lyn van lineêre regressie:
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()
Resultaat:
Voorbeeld Verduidelik
Voer die modules in wat jy benodig.
Jy kan meer oor die Matplotlib-module leer in ons Matplotlib-tutoriaal .
Jy kan meer oor die SciPy-module leer in ons SciPy-tutoriaal .
import matplotlib.pyplot as plt
from scipy
import stats
Skep die skikkings wat die waardes van die x- en y-as verteenwoordig:
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]
Voer 'n metode uit wat 'n paar belangrike sleutelwaardes van lineêre regressie terugstuur:
slope, intercept, r,
p, std_err = stats.linregress(x, y)
Skep 'n funksie wat die slope
en
intercept
waardes gebruik om 'n nuwe waarde terug te gee. Hierdie nuwe waarde verteenwoordig waar op die y-as die ooreenstemmende x-waarde geplaas sal word:
def myfunc(x):
return slope * x + intercept
Begin elke waarde van die x-skikking deur die funksie. Dit sal lei tot 'n nuwe skikking met nuwe waardes vir die y-as:
mymodel = list(map(myfunc, x))
Teken die oorspronklike verstrooiingsplot:
plt.scatter(x, y)
Trek die lyn van lineêre regressie:
plt.plot(x, mymodel)
Vertoon die diagram:
plt.show()
R vir Verhouding
Dit is belangrik om te weet hoe die verhouding tussen die waardes van die x-as en die waardes van die y-as is, as daar geen verband is nie, kan die lineêre regressie nie gebruik word om enigiets te voorspel nie.
Hierdie verwantskap - die korrelasiekoëffisiënt - word genoem
r
.
Die r
waarde wissel van -1 tot 1, waar 0 geen verband beteken nie, en 1 (en -1) 100% verwant beteken.
Python en die Scipy-module sal hierdie waarde vir jou bereken, al wat jy hoef te doen is om dit met die x- en y-waardes te voer.
Voorbeeld
Hoe goed pas my data in 'n lineêre regressie?
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)
Let wel: Die resultaat -0.76 toon dat daar 'n verwantskap is, nie perfek nie, maar dit dui aan dat ons lineêre regressie in toekomstige voorspellings kan 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 10 jaar oue motor te voorspel.
Om dit te doen, benodig ons dieselfde myfunc()
funksie van die voorbeeld hierbo:
def myfunc(x):
return slope * x + intercept
Voorbeeld
Voorspel die spoed van 'n 10 jaar oue motor:
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)
Die voorbeeld het 'n spoed van 85.6 voorspel, wat ons ook uit die diagram kon lees:
Slegte fiksheid?
Kom ons skep 'n voorbeeld waar lineêre regressie 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 lineêre regressie tot gevolg te hê:
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()
Resultaat:
En die r
vir verhouding?
Voorbeeld
Jy behoort 'n baie lae r
waarde te kry.
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)
Die resultaat: 0.013 dui op 'n baie slegte verwantskap, en sê vir ons dat hierdie datastel nie geskik is vir lineêre regressie nie.