datahacker.rs@gmail.com

#006 Linearna regresija

#006 Linearna regresija

Linearna regresija

Napravićemo malu pauzu sa klasifikacijom. Podsetimo se, šta smo zapravo želeli kod klasifikacije? Cilj klasifikacije je da se pronađe funkcija koja će na optimalan način podeliti podatke iz dva ili više skupova. U zavisnosti od toga sa koje “strane” ove funkcije se podaci nalaze, definiše se pripadnost odgovarajućoj klasi. U slučaju regresije potrebno je takođe odrediti funkciju, tj. njen matematički oblik. U ovom slučaju dobijenu funkciju ćemo koristiti da odredimo koju će vrednost ova funkcija imati za neko x iz test skupa koji želimo da analiziramo.

Primena linearne regresije

Primena linearne regresije

Zamislimo, da želimo da nađemo zavisnost potrošnje benzina (litar/100km) za novo vozilo koje je tek proizvedeno. Zbog vremena i ekonomičnosti testiranja, ne možemo da testiramo vozilo za svaku brzinu, već možemo ispitati samo jedan konačni skup brzina (promenljiva x). Za svaku od tih brzina x  moramo da vozimo automobil na predefinisanoj konstantnoj brzini u dužini od 100 km i da očitamo koliko smo goriva potrošili (vrednost y). Uzmimo da smo u našem eksperimentu uzimali brzine u koracima od 10 km/h (npr. 40, 50, 60, 70 … 120, 130 [km/h]). Pitanje na koje regresija treba da nam da odgovor jeste kolika je potrošnja za sve ostale brzine za koje nemamo precizna merenja? Dakle, potrebno je definisati funkciju f(x) na trening skupu koja će nam za nove vrednosti x (test vrednosti) dati što je moguće verodostojniju vrednost. 

Funkciju f(x) možemo napraviti na puno načina. Kod klasifikacije linearno separabilnih klasa funkcija je mogla da bude veoma jednostavna (npr. prava linija). Takođe, kod regresije možemo definisati jednostavan linearni model ukoliko je zavisnost funkcije f(x) linearna od promenljive x. Matematički, ovo možemo zapisati na sledeći način:

\(f(x)= kx + n\)

S obzirom na to da u praksi nikada ne možemo dobiti ovako preciznu jednačinu tj. da je za svaki par (x i y) ispunjena jednakost, uvešćemo mogućnost greške kroz dodatnu promenljivu e:

\(y = kx+n+e\)

U matematici se za promenljivu e uzima da predstavlja element normalne (Gausove) raspodele sa odgovarajućom srednjom vrednošću i standardnim odstupanjem. O promenljivoj e može se razmišljati kao o veličini koja nastaje usled nepreciznosti naših mernih instrumenata.

Sledeći kod ilustruje ono o čemu smo govorili:

Naš primer jasno odslikava linearnu zavisnost između promenljivih x i y. Zadatak regresije je da za 100 parova (x i y) odredi koeficijente k i n. Odnosno, kroz “oblak tačaka” potrebno je definisati funkciju f(x) tako da je zbir odstupanja vrednosti f(x) i y na trening skupu što je moguće manji. Naravno, ovo želimo i za test skup. Ovde možemo da razjasnimo razliku između y i f(x). Vektor y predstavlja merenja koja su dobijena za odgovarajuće vrednosti x. Dakle, to su parovi koji su prikazani na slici tačkama. Funkciju f(x) potrebno je odrediti, a ona će nam onda modelovati ponašanje procesa koji analiziramo za bilo koju vrednost tačke x (ili barem za vrednosti koje pokriva odgovarajući interval od interesa, ovde je to [0, 10]). 

Novi blok koda prikazuje određivanje samih parametara k i n. Kao i kod klasifikacije, stvara se odgovarajući objekat klase  (LinearRegression), a on će imati metode .fit(x, y) i .predict(x_fit).

Uvodimo indeksiranje sa prametrom [:, np.newaxis], a ovo koristimo da bi se inicijalni niz pretvorio u matricu. Ovo nije od prevelike važnosti za sada, ali možete izvršiti sledeće naredbe (np.ndim(x[:, np.newaxis])=2, dok je np.ndim(x)=1; .ndim() – dimenzija ndarray-a).

Da bismo primenili naredbu .predict() važno je da je primenimo na test elemente. Jedan od načina da to uradimo je da iscrtamo samu funkciju f(x). Neka je interval od [0, 10] izdeljen na podeoke sa korakom 0.01. Za ove vrednosti (x_fit) izračunaćemo vrednosti f(x_fit) korišćenjem naredbe .predict(x_fit).

Dobili smo konаčno rezultat linearne regresije predstavljen crvenom linijom. Intuitivno je jasno da ovo zaista jeste željena prava koja rešava naš problem. U samoj Python instanci “model”, možemo pronaći i izračunate koeficijente k (model.coef_[0]) i n (model.intercept_). Vidimo da se ove vrednosti neznatno razlikuju od naše originalne postavke.

Dakle, da još jednom ponovimo šta smo uradili. Napravili smo parove (x, y) koje smo generisali poznatom linearnom funkcijom. Nadalje, koristeći se samo parovima (x i y) uspeli smo da regresijom odredimo novu linearnu funkciju koja opisuje zavisnost x i y. U samom modelu, regresija je uspela da “nauči” ove koeficijente koje smo mi prethodno koristili.   

Napominjemo da ukoliko izvršite prikazan kod, vrednosti za k i n će verovatno biti neznatno drugačije. Ovo je stoga što su vrednosti x, a posle i y generisane kao elementi uniformne i normalne raspodele koje će za svako izvršavanje biti nešto drugačije. 

Pokušajte sami: U našem eksperimentu koristili smo ukupno 100 tačaka. Povećajte ovaj broj u kodu na primera radi 10000, pa i više. Posmatrajte kako se menjaju procene vrednosti k i n. Za mnoge statističke modele važi da sa većim trening skupom naše parametre možemo bolje i tačnije obučiti. 

 

Leave a Reply

Your email address will not be published. Required fields are marked *

three × 3 =