top of page

 

LINEARNE I POLINOMSKE REGRESIJE

Regresioni logaritmi, u oblastima veštačke inteligencije, se koriste za predvidjanje konstantnih vrednosti, koji se formiraju u odnosu na već postojeće vrednosti koje korisnik definiše. U materijalu postavljenom na sajtu, radiće se dva različita tipa regresija. Te regresije su:

  • Linearne Regresije 

  • Polinomska Regresije

Kako bi se ovi logaritmi realizovali u python-u, potrebno je koristiti posebne biblioteke koje se moraju instalirati unutar samog python projekta. Instalacija se izvršava unošenjem komande u terminalu PyCharm aplikacije.

Python biblioteke sa kojima se realizuju ove regresije su:

  • NumPy: To je matematička biblioteka za rad sa n-dimenzionalnim nizovima u Python-u, koja nam omogućava da efikasno vršimo proračune. Kod za terminal sa kojim instaliramo biblioteku je:

    •  pip install numpy 

  • Matplotlib: To je paket za crtanje I kreiranje 2D I 3D grafika. Biblioteku koristimo kako bismo u kordinatnom sistemu ispisali sve vrednosti za realizovanje regresija. Kod za terminal sa kojim instaliramo biblioteku je:

    •  pip install matplotlib 

  • Scikit-learn: To je biblioteka koja sadrži algoritame za klasifikaciju, regresiju i grupisanje. Kod za terminal sa kojim instaliramo biblioteku je:

    •  pip install scikit-learn 

  • Pandas: To je Python paket koji obezbeđuje brze, fleksibilne i ekspresivne strukture podataka. Kod za terminal sa kojim instaliramo biblioteku je:

    •  pip install pandas 

Linearna regresija je statistički pristup koji modelira odnos između ulaznih karakteristika i izlaza. Naš cilj ovde je da predvidimo vrednost izlaza na osnovu ulaznih karakteristika množenjem sa njegovim optimalnim koeficijentima. Korišćenjem matplotlib biblioteke kao i tabele koju učitavamo u CSV formatu, formiramo koordinatni sistem sa svim vrednostima iz te tabele i odredjujemo kako funkcioniše linearna regresija za zadate ulazne vrednosti. Primer kako bi izgledao koordinatni sistem sa svim ulaznim podacima je sledeći:

1.PNG

Koordinatni sistem je formiran sa podacima koji su u excel tabeli zapisane na sledeći način:

Capture2.PNG

Nakon popunjavanja samog koordinatnog sistema sa podacima iz tabele, formiramo pravu liniju (zato što pronalazimo linearnu regresiju) i dodajemo je na sam grafik. Linija se automatski dodaje, po uglu takvom da prilikom ispitivanja jedne vrednosti ( nebitno da li se nalazi na X ili Y osi) možemo predvideti drugu vrednosti, korišćenjem te same linije. Podrazumeva se da sa više vrednosti imaćemo što preciznije rezultate za predvidjanje.

Kod u Python-u i Objašnjenje Koda:

Za početak, dodajemo sve biblioteke koje su nam potrebne kako bismo formirali regresiju (komanda za instalaciju biblioteka se nalazi na početku stranice, sa crnom pozadinom teksta). Potrebne biblioteke su pandas, matplotlib i scikit-learn. To radimo na sledeći način:

Reč 'as' nam ukazuje to, da kada koristimo biblioteku, kako bi pozvali neku funkciju koju biblioteka definiše, pozivamo je pomoću reči kojom tu biblioteku definišemo (ako gledamo prvi red, umesto da pozovemo funkciju kao pandas.funkcija, rekli bi pd.funkcija, čisto kako bismo skratili samu reč i napravili kod preglednijim).

Od ovih 3 biblioteka, pandas nam omogućuje da dodamo tabelu sa podacimo koje želimo da raspodelimo na koordinatnom sistemu. Matplotlib nam vizuelno kreira koordinatni sistem kako bi korisnik mogao da vidi kako izgleda raspored svih vrednosti u koordinatnom sistemu. Scikit-learn (sklearn) nam generiše linearnu regresiju pomoću koje možemo vršiti predvidjanja na vrednostima koje korisnik želi.

U ovom delu koda formiramo vizuelni koordinatni sistem. Korišćenjem reči pd kao biblioteku pandas i funkcije read_csv(), učitavamo sve podatke (fajl sa ekstenzijom .csv čuvamo iz excel tabele tako što, prilikom čuvanja fajla, odaberemo 'save as' sa opcijom 'CSV (comma delimited)' i čuvamo u projektnom folderu u kome nam se nalazi python kod).

plt.scatter() (funkcija iz biblioteke matplotlib) uzima vrednosti iz tabele i rasporedjuje u koordinatni sistem. Označavamo prvu kolonu (naziv kolone) kao vrednosti koje odgovaraju X osi, dok druga kolona odgovara Y osi.

 

plt.xlabel i plt.ylabel nam jednostavno obeležbava koje vrednosti se nalaze na X a koje na Y osi u vidu labele. plt.show() kreira prozor koji prikazuje koordinatni sistem.

Pokretanjem koda, sa csv fajlom koji je dodat ispod ovog teksta, prikazuje nam se sledeći grafik:

2.PNG

Nakon formiranja i upisivanja svih vrednosti, potrebno je formirati linearnu regresiju i napraviti prekiciju. To činimo na sledeći način:

Promenljiva reg definišemo kao model linearne regresije. Modelu preko funkcije fit, dodajemo vrednosti i preko funkcije plot iz matplotlib biblioteke, generišemo pravu liniju unutar koordinatnog sistema.

U .CSV fajlu imamo definisanu kolonu 1 za godinu koja se prati i kolonu 2 koja nam ukazuje koliko dolara ($) prosečno zaradjuje jedno domaćinstvo. Korišćenjem funkcije predict, predvidjamo kolika će biti prosečna zarada jednog domaćinstva 2020-te godine i tu vrednost pamtimo u promenljivoj predictPrice. Preostali korak je ispisati te vrednosti: 

Predikcija se računa pomoću sledeće formule:

price = k * year + b

Vrednost pomoću koje radimo predikciju je godina, što smo definisali kada smo generisali plt.plot. K nam predstavlja koeficijent dok B je intercept vrednost (ove vrednosti nam nisu korisne kako bi dobili rezultat koji pokušavamo da predvidimo, definisano je čisto kako bismo mogli lično proveriti). Rezultat koda nakon pokretanja je:

3.PNG

Dok koordinatni sistem koji je generisan sa plt.show() funkcijom izgleda ovako:

4.PNG

Kompletan kod je napisan na sledeći način:

Polinomske regresije se, za razliku od linearnih, ne izražavaju pravom linijom već zakrivljenom, koja u odnosu na sve vrednosti predstavljene u koordinatnom sistemu predstavljaju preciznije predvidjanje nekih vrednosti. Dok se linearne predstavljaju formulom y = x, polinomske regresije znače da se vrednost x može naći u drugom, trećem ili nekom drugom stepenu.

y1.PNG

U narednom primeru biće predstavljen kod jednog zadatka u kome se predvidja vrednost sa polinomskom regresijom u kojoj je x na drugom stepenu. Tema pretrage je vlažnost i pritisak vremena.

Kod za polinomnu regresiju, u odnosu na linearnu ima nekoliko razlika koje će sada biti objašnjene. Počevši od samog početka, sklearn.preprocessing u trećoj liniji koda nam omogućava kreiranje same polinomne regresije tako što definišemo stepen na kom se nalazi vrednost x. pre_process promenljiva koju smo definisali tako da kreira grupu dizajniranu na drugom stepenu nekog broja primenjujemo na vrednost x, koja u promenljivoj x_poly formira nove kolone koje se prate za 1, x i x na kvadrat.

Formiranjem polinomske regresije se u grafiku definiše kao veliki broj linearnih regresije ( lako se može primetiti po grafiku u rezultatu da linija ima uglove, umesto da je standardna kriva linija) i to se dešava oko formiranja promenljive pr_model koji definiše model koji će se prikazati kao konstantne linearne regresije od x_poly koji smo rekli da je skup kolona sa vrednostima 1, x, x^2 i naše vrednosti y.

Jedini preostali korak je da, pošto nam je cilj da formiramo neko predvidjanje, predvidimo kolika će biti vlažnost ako nam je pritisak 1007. Pokretanje koda dobijamo ispis u konzoli 'Predvidjena vlažnost za [ Pressure: 1007 ] je [0.7164631]'.

7.PNG

Primer polinomske regresije gde je y = x^3 (x na trećem stepenu) se radi na skoro identičan način, jedina razlika je ta što se kod definisanja opisa polinomske regresije definiše kao treći stepen umesto drugog. CSV fajl za ovaj primer i kod su sledeći:

Rezultat pokretanja koda u kome se vrši predikcija za broj 20, u konzoli ispisuje 'Predvidjena vrednost za [ broj : 20 ] je [6601.57575758]' dok bi koordinatni sistem izgledao ovako:

8.PNG

Svaki skup podataka će imati neke čudne ili nedostajuće delove ili neuravnotežene podatke. Implikacija je da se izvedeni model dobro uklapa u podatke modeliranja, ali da se ne generalizuje dovoljno na druge uzorke koji nisu uključeni u proces modeliranja. Postoji terminologija koja opisuje koliko dobro model mašinskog učenja uči i generalizuje nove podatke, ovo je overfitting i underfitting. Cilj dobrog modela mašinskog učenja je da se dobro generalizuje iz skupa podataka za obuku na bilo koji skup podataka iz domena problema. Ovo nam omogućava da napravimo predviđanja na osnovu skupa podataka koji model nikada nije video.

imgonlinecomuaresizeLOjqonkALC.jpg

Overfitting se odnosi na scenario gde model mašinskog učenja ne može da generalizuje ili da se dobro uklopi u nevidljiv skup podataka. Jasan znak preopterećenja mašinskog učenja je ako je njegova greška u skupu podataka za testiranje ili validaciju mnogo veća od greške u skupu podataka za obuku. To je termin koji se koristi u statistici koji se odnosi na grešku modeliranja koja se javlja kada funkcija previše odgovara skupu podataka. Kao rezultat toga, prekomerno prilagođavanje možda neće uspeti da uklopi dodatne podatke, a to može uticati na tačnost predviđanja budućih posmatranja.

Underfitting se odnosi na model koji ne može niti da modelira skup podataka za obuku niti da se generalizuje na novi skup podataka. Nedovoljan model mašinskog učenja nije prikladan model i biće očigledan jer će imati loše performanse na skupu podataka za obuku.

overfitting-and-underfitting-wrt-model-error-vs-complexity.png

Kada iterativno trenirate algoritam učenja, možete izmeriti koliko dobro svaka iteracija modela radi. Do određenog broja iteracija, nove iteracije poboljšavaju model. Međutim, nakon te tačke, sposobnost modela da generalizuje može oslabiti jer počne da se uklapa u podatke o obuci. Rano zaustavljanje se odnosi na zaustavljanje procesa obuke pre nego što učenik prođe tu tačku. Danas se ova tehnika uglavnom koristi u dubokom učenju (deep learning), dok se druge tehnike (npr. regularizacija) preferiraju za klasično mašinsko učenje.

Primer koji će biti objašnjen i na kome će biti predstavljen overfitting i underfitting počinjemo standardnim instaliranjem potrebnih biblioteka (numpy, matplotlib i scikit-learn). U ovom primeru, za razliku od vežbe 2 u kome se radile regresije, nećemo učitati CSV fajl sa podacima (možemo ako želimo, ali odradićemo primer na drugi način). Podaci sa kojima radimo, biće generisani nizom od 30 brojeva.

Kako bismo formirali veću preciznost, ali ne preveliku, moraćemo formirati regresije n-tog reda. U primeru, da bismo predstavili oblasti underfitting i overfitting, radićemo sa tri različita reda polinomske regresije. 

Primer koji će biti objašnjen i na kome će biti predstavljen overfitting i underfitting počinjemo standardnim instaliranjem potrebnih biblioteka (numpy, matplotlib i scikit-learn). U ovom primeru, za razliku od vežbe 2 u kome se radile regresije, nećemo učitati CSV fajl sa podacima (možemo ako želimo, ali odradićemo primer na drugi način). Podaci sa kojima radimo, biće generisani nizom od 30 brojeva.

Kako bismo formirali veću preciznost, ali ne preveliku, moraćemo formirati regresije n-tog reda. U primeru, da bismo predstavili oblasti underfitting i overfitting, radićemo sa tri različita reda polinomske regresije. 

U ovom delu koda se odrađuje sledeće:

  • np.random.seed(0) - predefiniše nasumične vrednosti koje ćemo koristiti da bismo popunili koordinatni sistem sa vrednostima

  • broj_vrednosti = 30 - definišemo prvih 30 vrednosti koje unosimo u koordinatni sistem

  • red_jednacine = [1, 4, 30] - definišemo sa koliko broja reda ćemo formirati koordinatni sisteme kako bismo testirali da li je overfitting ili underfitting.

  • funkcija koja nam X vrednost pretvara u Y tako što je pomnoži sa 3.14 (pi) i 1.5 pa je pretvori u kosinus.

U ovom delu koda se odrađuje sledeće:

  • X = np.sort(np.random.rand(broj_vrednosti))  - generišemo vrednosti koje ćemo uneti u X osu koordinatnog sistema. Dobijamo je tako što od generišemo 30 (broj_vrednosti) nasuminih brojeva, sortiramo ih, i pamtimo kao vrednosti za X

  • Y = funkcija(X) + np.random.randn(broj_vrednosti) * 0.1  - od X vrednosti formiramo Y vrednost, kako bismo formirali odgovarajući raspored vrednosti koordinatnog sistema.

Umesto ovakvog kreiranja vrednosti X i Y niza, učitavanje kolona sa bibliotekom pandas je bio takođe prihvatljiv način dobijanja vrednosti za popunjavanje osa.

U ovom delu koda se odrađuje sledeće:

  • plt.figure(figsize=(15, 5))  - ovom funkcijom definišemo dužinu i širinu prozora u kome nam se predstavlja koordinatni sistem. S obzirom da ćemo imati tri koordinatna sistema (za 1. 4. i 30. red polinomske regresije) postavićemo da je dužina prozora 15 a visina 5.

  • for i in range(len(red_jednacine)): - for petlja sa kojom formiramo sva tri koordinatna sistema zato što len nam vraća dužinu niza, koja sadrži tri elemenata.

  • plt.show() - funkcija koja pokreće prozor na kome vidimo koordinatne sisteme. Ovu funkciju dodajemo na samom kraju van for petlje.

For petlja nam se sastoji od sledećih delova:

U prva dva reda koda definišemo to, da želimo da imamo tri koordinatna sistema na jednom prozoru. Kroz svaku iteraciju (3 ukupno) definišemo lokacije na mestima 1,2,3. 

U trećem redu koda kreiramo regresiju koju koristimo u datom koordinatnom sistemu i gde određujemo red polinomske funkcije (degree) koju smo definisali nizom nazvanom red_jednacine.

U narednom delu koristimo Pipeline koja pripada Scikit-learn biblioteci. Svrha pipeline biblioteke je da sklopi nekoliko koraka koji se mogu unakrsno proveriti zajedno dok se postavljaju različiti parametri. Omogućava nam da kroz korišćenje for petlje proveravamo koji red polinomske regresije se koristi i kako će ona biti formirana ( prvi red kao linearna, bilo koja nakon toga kao polinomska).

Sada testiramo kod za stepen=1 (linearni model), stepen=4 (regresija polinoma 4. reda) i stepen=30 (prilagođavanje polinoma 30. visokog reda). Grafikoni pokazuju predviđene vrednosti i za različite vrednosti stepena. Jasno je primećeno da stepen=1 dovodi do nedovoljnog prilagođavanja (underfitting kao sinusna funkcija), dok stepen=30 dovodi do preteranog prilagođavanja (overfitting kao kosinusna funkcija). np.newaxis nam uvećava dimenziju nekog niza, što je potrebno iskoristiti u fit funkciji za vrednost X kako bi se popunio dvodimenzionalan koordinatni sistem. Vrednost Y popunjavamo unutar X-a, tako da nije potrebno povećati dimenziju vrednosti Y, ali bi kod funkcionisao identično ako bi to uradili.

U ovom drugom delu for petlje popunjavamo vrednosti u koordinatnim sistemima kao i linije koje ukazuju na regresiju. Prvi deo plt.plot popunjava regresijom u odnosu na red polinomske regresije. Drugi plt.plot popunjava regresiju u zavisnosti od vrednosti koje su unesene u koordinatni sistem. Plt.scatter popunjava tačkama koordinatni sistem iz vrednosti X i Y. 

plt.xlabel i plt.ylabel definiše naziv X i Y ose dok plt.xlim i plt.ylim definiše od koje do koje vrednosti se prikazuje koordinatni sistem (vrednosti sa kojima se radi u ovom primeru su uglavnom u decimalnom zapisu od nule do jedinice).  Plt.title ispisuje naziv iznad koordinatnog sistema koji je red polinomske regresije.

Kompletan kod primera sa rezultatima je ispisan ispod teksta.

33.PNG

Napraviti polinomsku regresiju drugog stepena sa CSV fajlom koji sadrži samo kolonu X sa vrednostima od -10 do 10. Napisati funkciju koja formira vrednost Y dobijenu funkcijom Y = 3X^2 + 6. Vrednosti koje se unose u koordinatni sistem obeležiti velikim slovom X zelenom bojom, dok regresiju obeležiti žutom bojom. Na prozoru dodati još jedan koordinatni sistem na kome je prikazan underfitting. Primer kako rezultat treba da izgleda nakon pokretanja koda je sledeći:

2.PNG

Rešenje 1 (korišćenjem Pipeline metode):

Rešenje 2 (posebno određivanje oba stepena):

bottom of page