Machine learning - lineaire regressie
regressie
De term regressie wordt gebruikt wanneer u de relatie tussen variabelen probeert te vinden.
In Machine Learning en in statistische modellering wordt die relatie gebruikt om de uitkomst van toekomstige gebeurtenissen te voorspellen.
Lineaire regressie
Lineaire regressie gebruikt de relatie tussen de datapunten om er een rechte lijn door te trekken.
Deze lijn kan worden gebruikt om toekomstige waarden te voorspellen.
Bij Machine Learning is het voorspellen van de toekomst erg belangrijk.
Hoe werkt het?
Python heeft methoden om een relatie tussen datapunten te vinden en om een lijn van lineaire 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 staat de x-as voor de leeftijd en de y-as voor de snelheid. We hebben de leeftijd en snelheid van 13 auto's geregistreerd toen ze een tolhuisje passeerden. Laten we eens kijken of de gegevens die we hebben verzameld, kunnen worden gebruikt in een lineaire regressie:
Voorbeeld
Begin met het tekenen van een spreidingsplot:
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
Importeer scipy
en teken de lijn van lineaire 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 uitgelegd
Importeer de modules die je nodig hebt.
U kunt meer te weten komen over de Matplotlib-module in onze Matplotlib-zelfstudie .
U kunt meer te weten komen over de SciPy-module in onze SciPy-zelfstudie .
import matplotlib.pyplot as plt
from scipy
import stats
Maak de arrays die de waarden van de x- en y-as vertegenwoordigen:
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 een methode uit die enkele belangrijke sleutelwaarden van lineaire regressie retourneert:
slope, intercept, r,
p, std_err = stats.linregress(x, y)
Maak een functie die de waarden slope
en
gebruikt intercept
om een nieuwe waarde te retourneren. Deze nieuwe waarde geeft aan waar op de y-as de corresponderende x-waarde wordt geplaatst:
def myfunc(x):
return slope * x + intercept
Voer elke waarde van de x-array door de functie. Dit resulteert in een nieuwe array met nieuwe waarden voor de y-as:
mymodel = list(map(myfunc, x))
Teken de originele scatterplot:
plt.scatter(x, y)
Teken de lijn van lineaire regressie:
plt.plot(x, mymodel)
Geef het diagram weer:
plt.show()
R voor Relatie
Het is belangrijk om te weten hoe de relatie tussen de waarden van de x-as en de waarden van de y-as is, als er geen relatie is kan de lineaire regressie niet gebruikt worden om iets te voorspellen.
Deze relatie - de correlatiecoëfficiënt - wordt genoemd
r
.
De r
waarde varieert van -1 tot 1, waarbij 0 betekent dat er geen verband is en 1 (en -1) 100% gerelateerd betekent.
Python en de Scipy-module zullen deze waarde voor je berekenen, het enige wat je hoeft te doen is hem te voeden met de x- en y-waarden.
Voorbeeld
Hoe goed passen mijn gegevens in een lineaire 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)
Opmerking: het resultaat -0,76 laat zien dat er een relatie is, niet perfect, maar het geeft aan dat we lineaire regressie kunnen 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 van een auto van 10 jaar oud te voorspellen.
Om dit te doen, hebben we dezelfde myfunc()
functie uit het bovenstaande voorbeeld nodig:
def myfunc(x):
return slope * x + intercept
Voorbeeld
Voorspel de snelheid van een auto van 10 jaar oud:
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)
Het voorbeeld voorspelde een snelheid van 85,6, wat we ook uit het diagram konden aflezen:
Slechte pasvorm?
Laten we een voorbeeld maken waarin lineaire 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 lineaire regressie:
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 de r
voor relatie?
Voorbeeld
Je zou een zeer lage r
waarde moeten krijgen.
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)
Het resultaat: 0,013 geeft een zeer slechte relatie aan en vertelt ons dat deze dataset niet geschikt is voor lineaire regressie.