Maskinlæring - lineær regression

Regression

Når du forsøger at finde forholdet mellem variabler, bruges terminen 'regression' (tilbagegang).

I maskinlæring og statistisk modellering bruges dette forhold til at forudsige resultaterne af fremtidige begivenheder.

Lineær regression

Lineær regression tegner en linje gennem datapunkternes relationer mellem alle datapunkter.

Denne linje kan bruges til at forudsige fremtidige værdier.


I maskinlæring er det vigtigt at forudsige fremtiden.

Arbejdsprincippet

Python tilbyder nogle metoder til at finde forholdet mellem datapunkter og tegne lineær regression linje. Vi vil vise dig, hvordan du bruger disse metoder i stedet for gennem matematiske formler.

I det følgende eksempel repræsenterer x-akslen bilens alder, og y-akslen hastigheden. Vi har registreret alderen og hastigheden for 13 biler, der har passet gennem en betalingsstation. Lad os se, om de indsamlede data kan bruges til lineær regression:

Eksempel

Tegn først punktplot:

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

Resultat:


Kør Eksempel

Eksempel

importér scipy og tegn lineær regression linje:

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

Resultat:


Kør Eksempel

Eksempel Forklaring

Importér de nødvendige moduler:

import matplotlib.pyplot as plt
from scipy import stats

Opret et array, der repræsenterer værdierne på x- og y-akslen:

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]

Udfør en metode, der returnerer nogle vigtige nøgleværdier for lineær regression:

slope, intercept, r, p, std_err = stats.linregress(x, y)

Opret en, der bruger slope og intercept Værdifunktionen returnerer nye værdier. Denne nye værdi repræsenterer placeringen af den tilsvarende x-værdi på y-akslen:

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

Kør hver værdi i x-værdiarrangementet gennem funktionen. Dette vil skabe et nyt array, hvor y-akslen har nye værdier:

mymodel = list(map(myfunc, x))

Tegn den oprindelige punktplot:

plt.scatter(x, y)

Tegn en lineær regression linje:

plt.plot(x, mymodel)

Vis diagram:

plt.show()

R-Squared

Det er vigtigt at vide, hvor godt værdierne på x-akslen og y-akslen er relateret til hinanden, for uden relation kan lineær regression ikke bruges til at forudsige noget.

Forholdet måles ved en værdi kaldet r-square (r-kvadrat).

R-square værdien varierer fra 0 til 1, hvor 0 betyder ikke relateret, mens 1 betyder 100% relateret.

Python og Scipy-modulerne vil beregne denne værdi for dig, og du skal blot levere x- og y-værdierne til dem:

Eksempel

Hvordan passer mine data til i lineær regression?

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)

Kør Eksempel

Kommentarer:Resultatet -0.76 indikerer, at der er en vis relation, men ikke en perfekt relation, men det indikerer, at vi kan bruge lineær regression i fremtidige forudsigelser.

Forudsige fremtidige værdier

Nu kan vi bruge den indsamlede information til at forudsige fremtidige værdier.

For eksempel: Lad os prøve at forudsige hastigheden for en bil med 10 års alder.

Derfor har vi brug for det samme som i det tidligere eksempel myfunc() Funktion:

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

Eksempel

Forudsæt en bil med 10 års alder for hastighed:

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)

Kør Eksempel

Forudsigelseshastigheden er 85.6, og vi kan også læse det af diagrammet:


Dårlig pasform?

Lad os oprette et eksempel, hvor lineær regression ikke er den bedste metode til at forudsige fremtidige værdier.

Eksempel

Disse værdier for x- og y-aksen vil føre til en meget dårlig tilpasning af lineær 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()

Resultat:


Kør Eksempel

og r-squared værdien?

Eksempel

Du bør have fået en meget lav r-squared værdi.

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)

Kør Eksempel

Resultat: 0.013 betyder dårlig relation og fortæller os, at datamængden ikke er egnet til lineær regression.