Machine Learning - Lineaire Regressie

Regression

When you try to find the relationship between variables, the term 'regression' is used.

In machine learning and statistical modeling, this relationship is used to predict the results of future events.

Lineaire regressie

Lineaire regressie tekent een rechte lijn tussen alle datapunten op basis van de relatie tussen de datapunten.

Deze lijn kan worden gebruikt om toekomstige waarden te voorspellen.


In machine learning is het voorspellen van de toekomst erg belangrijk.

Werkingsprincipe

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

In het volgende voorbeeld staat de x-as voor de leeftijd van de auto en de y-as voor de snelheid. We hebben de leeftijd en snelheid van 13 auto's geregistreerd die door de tolpoort zijn gegaan. Laten we zien of de verzamelde gegevens kunnen worden gebruikt voor lineaire regressie:

Example

Teken eerst het scatterplot:

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

Result:


Run Instance

Example

importeren scipy en teken de lineaire regressielijn:

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

Result:


Run Instance

Voorbeeld uitleg

Importeer de benodigde modules:

import matplotlib.pyplot as plt
from scipy import stats

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

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 gebruik van slope en intercept De waarde van de functie retourneert nieuwe waarden. Deze nieuwe waarde geeft de positie aan waarop de bijbehorende x-waarde op de y-as zal worden geplaatst:

def myfunc(x):
  return slope * x + intercept

Loop elke waarde van het x-array door de functie. Dit zal een nieuwe array opleveren waarvan de y-as nieuwe waarden heeft:

mymodel = list(map(myfunc, x))

Teken de oorspronkelijke scatterplot:

plt.scatter(x, y)

Teken de lineaire regressielijn:

plt.plot(x, mymodel)

Toon diagram:

plt.show()

R-Squared

Het is belangrijk om te weten hoe goed de waarden op de x-as en y-as met elkaar in relatie staan, want zonder relatie kan lineaire regressie niets voorspellen.

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

De range 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 Scipy-module zullen deze waarde voor u berekenen, u hoeft alleen de x- en y-waarden te leveren:

Example

Hoe goed past mijn data in 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)

Run Instance

Opmerking:Het resultaat -0.76 laat zien dat er een bepaalde relatie is, maar geen perfecte relatie, maar het laat zien dat we lineaire regressie kunnen gebruiken in toekomstige voorspellingen.

Voorspel toekomstige waarden

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

Bijvoorbeeld: laten we proberen de snelheid van een auto met een leeftijd van 10 jaar te voorspellen.

Daarom hebben we hetzelfde nodig als in het vorige voorbeeld: myfunc() Functie:

def myfunc(x):
  return slope * x + intercept

Example

Voorspel de snelheid van een auto met een leeftijd van 10 jaar:

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)

Run Instance

De voorspellingsnelheid is 85.6, we kunnen dit ook aflezen uit het diagram:


Slechte fit?

Laten we een voorbeeld maken waarin lineaire regressie niet de beste methode is om toekomstige waarden te voorspellen.

Example

These values for the x and y axes will result in a very poor fit for linear regression:

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

Result:


Run Instance

and r-squared value?

Example

You should have obtained a very low r-squared value.

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)

Run Instance

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