# DRUGI CAS # --Logisticka regresija-- library(ISLR) library(MASS) ##### PROBLEM KLASIFIKACIJE # Linearna regresija je odlican alat kada imamo neprekidnu zavisnu promenljivu. A sta da radimo u slucaju kada je to ipak diskretna slucajna velicina # specijalno - koja uzima vrednosti 0 i 1? Tada moramo da pribegnemo idejama klasifikatora, jer linearna regresija vise ne moze kvalitetna da obavi trazeno. # Jedna od osnovnih metoda je naravno logisticka regresija. Naziv "klasifikacija" dolazi iz proste ideje sto je nama cilj da neki novu podatak prema nekim # vec poznatim vrednostima smestimo\klasifikujemo u neku od unapred odredjenih klasa. # Neki primeri kada je problem klasifikacije najbolji alat: # 1) Neka osoba dolazi do ambulante sa simptomima koji mogu # 3 bolesti da uzrokuju. Koju od te tri ima data osoba? # 2) Bankarski onlajn servis mora da "ume" da odredi da li je # transakcija bila validna na osnovu IP-adrese, prethodnim transakcijama itd. # I naravno slicno kao u regresiji zelimo da procena bude dobra, # tj ne samo da "dobro" odredi vec postojeci sistem, vec i da ume # da protumaci novodobijeni podatak na pravi nacin. # Jos jedan primer: # Potrebno je ucitati bazu koja se nalazi na datom linku: http://www.math.rs/p/files/1458635682-70-baza.txt , # zbog razlicitosti verzija RStudio-a, moze na razlicite nacine da se ucitava. # Baza sadrzi rezultate studenata na prijemnim ispitima na nekom fakultetu za upis na master studije (prve dve kolone) # dok treca je indikator da li je dati student upisao ili nije. # komanda attach() nam je potrebna da ne bismo svaki put navodili u kojoj bazi radimo. attach(Baza) ?read.csv Baza=read.csv("http://www.math.rs/p/files/1458635682-70-baza.txt", header=FALSE) attach(Baza) # glm(, family=binomial) je funkcija pomocu koje koristimo logisticku regresiju, uz obavezno navodjenje # argumenta "family=binomial" cime zadajemo da zelimo da R pokrene bas logisticku regresiju. model1=glm(V3~V1+V2, family=binomial) summary(model1) # Vidimo da su nam sve promenljive znacajne. #Probacemo da plotujemo da vidimo kako to izgleda: V4=V1+V2 # zbirna promemljiva rezultata prijemnog ispita plot(V3~V4) # Dodamo to sto dobili u logistickoj regresiji points(V4, fitted(model1), col="red",pch=20) # Dalje primenjujemo funkciji predict(), koja nam omogucava procenu da li uz date V1 i V3 student trebao da upise taj master program. w=data.frame(V1=20, V2=100) predict(model1, w,type="response") # dakle student sa 20 poena i 100 poena na drugom ispitu ima oko 0.3 da upise master. # Baza Smarket # Vraca nazive promenljivih. names(Smarket) # Neki opsti podaci baze Smarket. summary(Smarket) ?Smarket # help(Smarket) # Iscrtava sve moguce grafike rasprenosti promenljivih u datoj bazi. pairs(Smarket,col=Smarket$Direction) attach(Smarket) # Logisticka regresija, se pokrecu pomocu funkcije glm(), uz obavezno navodjenje argumenta family=binomial glm.fit=glm(Direction~Lag1+Lag2+Lag3+Lag4+Lag5+Volume,family=binomial) # Pozivamo opet summary, kao i za linearnu regresiju. summary(glm.fit) # Pri ovom pozivu predvidjanje se vrsi nad istim skupom vrednosti nad kojima je sagradjen model, da bi zadali neke nove vrednosti moramo: # predict(glm.fit, newdata, type="response"), gde je newdata=data.frame(Lag1=x1, Lag2=x3, ..., Volume=x6). glm.probs=predict(glm.fit,type="response") # Ispisujemo prvih 5 vrednosti. glm.probs[1:5] # Za one koji imaju verovatnocu >0.5 dodeljujemo Up, za preostale Down. glm.pred=ifelse(glm.probs>0.5,"Up","Down") attach(Smarket) # I proveravamo koliko dobro se uklopio model table(glm.pred,Direction) # I vidimo da nije nesto preterano dobro. mean(glm.pred==Direction) # Izdvojicemo skup za obucavanje i kontrolni skup na osnovu godine (do 2005 i 2005, respektivno). obucavanje = Year<2005 glm.fit=glm(Direction~Lag1+Lag2+Lag3+Lag4+Lag5+Volume, data=Smarket,family=binomial, subset=obucavanje) summary(glm.fit) # I pokrenucemo predvidjanje za podskup koji nismo koristili za ucenje i provericemo koliko je dobra ta ocena. glm.probs=predict(glm.fit,newdata=Smarket[!obucavanje,],type="response") glm.pred=ifelse(glm.probs >0.5,"Up","Down") Direction.2005=Smarket$Direction[!obucavanje] table(glm.pred,Direction.2005) mean(glm.pred==Direction.2005) # I nakon ovog poziva vidimo da i nije nesto dobro. Ali to i nije toliko neocekivano, jer zaista predvideti vrednost necega na berzi nije naivno, niti # jednostavno, akoi uopste uradivo. # Probacemo manji model da iskoristimo. glm.fit=glm(Direction~Lag1+Lag2, data=Smarket,family=binomial, subset=obucavanje) glm.probs=predict(glm.fit,newdata=Smarket[!obucavanje,],type="response") glm.pred=ifelse(glm.probs >0.5,"Up","Down") table(glm.pred,Direction.2005) # Ovde mozemo da vidimo da kad je predvidjanje da ce cena da opadne - imamo tacno 50% sansi za pogadjanje, dok u slucaju kada kaze da ce da poraste, oko 0.58. mean(glm.pred==Direction.2005) #install.packages("nnet") #library(nnet) #?multinom