Maskininlärning - linjär regression

Regression

När du försöker hitta relationer mellan variabler används termer som 'regression' (återgång).

I maskininlärning och statistisk modellering används detta förhållande för att förutsäga resultatet av framtida händelser.

Linjär regression

Linjär regression ritar en linje genom att använda förhållandet mellan datapunkterna mellan alla datapunkter.

Denna linje kan användas för att förutsäga framtida värden.


I maskinlärning är det viktigt att förutsäga framtida värden.

Arbetsprincip

Python erbjuder några metoder för att hitta förhållanden mellan datapunkter och rita linjär regressionlinjer. Vi kommer att visa hur du använder dessa metoder istället för matematiska formler.

I följande exempel representerar x-axeln åldern på bilen och y-axeln hastigheten. Vi har registrerat åldern och hastigheten för 13 bilar som passerat en betalstation. Låt oss se om de insamlade data kan användas för linjär regression:

Exempel

Först rita punktserien:

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 Exempel

Exempel

importera scipy och rita linjär regressionlinjen:

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 Exempel

Exempel på förklaring

Importera nödvändiga moduler:

import matplotlib.pyplot as plt
from scipy import stats

Skapa en array som representerar värden på x- och y-axeln:

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]

Utför en metod som returnerar några viktiga nyckelvärden för linjär regression:

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

Skapa en som använder slope och intercept Funktionen för värden returnerar nya värden. Dessa nya värden representerar varje x-värde som kommer att placeras på y-axeln:

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

Kör varje värde i x-arrays med funktionen. Detta skapar en ny array där y-axeln har nya värden:

mymodel = list(map(myfunc, x))

Rita den ursprungliga punktserien:

plt.scatter(x, y)

Rita linjär regressionlinjen:

plt.plot(x, mymodel)

Visa graf:

plt.show()

R-Squared

Det är viktigt att veta hur bra värdena på x-axeln och y-axeln är relaterade, om det inte finns något förhållande kan linjär regression inte användas för att förutsäga något.

Förhållandet mäts med hjälp av ett värde som kallas r-kvadrat (r-squared).

R-kvadratets intervall är 0 till 1, där 0 innebär ingen korrelation och 1 innebär 100% korrelation.

Python och Scipy-modulen kommer att beräkna detta värde för dig, allt du behöver göra är att tillhandahålla x- och y-värdena för den:

Exempel

Hur passar min data i linjä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 Exempel

Kommentar:Resultatet -0.76 indikerar att det finns ett visst förhållande, men inte ett perfekt förhållande, men det visar att vi kan använda linjär regression i framtida förutsägelser.

Förutsäga framtida värden

Nu kan vi använda den information vi har samlat in för att förutsäga framtida värden.

Till exempel: låt oss försöka förutsäga hastigheten för en bil med 10 års historia.

För detta behöver vi samma som i föregående exempel myfunc() Funktion:

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

Exempel

Förutsäga hastigheten för en bil med 10 års ålder:

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 Exempel

Prediktionshastigheten är 85.6, och vi kan också läsa det från grafen:


Dålig passform?

Låt oss skapa ett exempel där linjär regression inte är den bästa metoden för att förutsäga framtida värden.

Exempel

Dessa värden för x- och y-axeln kommer att leda till mycket dålig passform för linjä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 Exempel

och r-squared-värdet?

Exempel

Du bör ha fått ett mycket lågt r-squared värde.

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 Exempel

Resultat: 0.013 indikerar mycket dålig relation och talar för att denna datamängd inte är lämplig för linjär regression.