Linearna regresija

Uvod - matematičke osnove

Linearna funkcija y=ax+b

Linearna regresija u Pythonu korišćenjem NumPy biblioteke

Python ima metode za pronalaženje odnosa između tačaka podataka i za crtanje linije linearne regresije. Ispod će kroz primer biti objašnjeno kako koristiti ove metode bez objašnjenja matematičkih formula tj. kako se matematičkim putem dolazi do koeficijenata a i b u linearnoj regresiji.

Započećemo sa crtanjem raštrkanih tačka na ravni, koje su definisane listom x koordinata i listom y koordinata.

In [1]:
import numpy as np
import matplotlib.pyplot as plt

x = np.array(range(1,14))
y = np.array([2,8,8,18,25,21,32,44,32,48,61,45,62])

plt.scatter (x,y)

plt.show()

Sada ćemo odrediti liniju linearne regresije koja je najbolje uklopljena i koja se približno poklapa sa određenim tačkama podataka.

Sigurno ste već primetili da u ovom primeru koristimo NumPy nizove koji su korisniji od Python listi jer se mogu tretirati kao vektori nad kojima se mogu izvršiti operacije (npr. sabiranje vektora, množenje vektora i skalara itd.) koje će značajno da pojednostave izračunavanja.

In [2]:
import numpy as np
import matplotlib.pyplot as plt

x = np.array(range(1,14))
y = np.array([2,8,8,18,25,21,32,44,32,48,61,45,62])

[a,b]=np.polyfit(x,y,1)
print(a)
print(b)

plt.scatter (x,y)
plt.plot ([0,15],[b,a*15+b])
plt.show()
4.857142857142857
-2.76923076923075

Tačnost modela

Određivanje koeficijenta determinacije $\ R^2 $
$\ R^2 $ - je vrednost u rasponu od 0 do 1, što je bliže 1 to je vaš model linearne regresije tačniji.

In [3]:
# Koliko se moji podaci uklapaju u linearnu regresiju?
from sklearn.metrics import r2_score
import numpy as np
from numpy import mean

x = np.array(range(1,14))
y = np.array([2,8,8,18,25,21,32,44,32,48,61,45,62])
[a,b]=np.polyfit(x,y,1)

r2_score(y, a*x+b)
Out[3]:
0.9096259323754272

Predviđanje vrednosti pomoću linearne regresije

In [4]:
import matplotlib.pyplot as plt

plt.scatter (x,y)
plt.scatter (20, a*20+b, color ='red')
plt.plot ([0,25],[b,25*a+b])
plt.title('Grafik prikazuje predviđenu vrednost upotrebom linearne regresije')
plt.show ()

print (a*20+b)
94.3736263736264