rozw. zadania 11 (1 i 2).docx

(11 KB) Pobierz

#żeby każde uruchomienie dało to samo (gen liczb losowych)
set.seed(2011)

raty = read.csv2("Raty.csv")

#Przekształćmy raty na 0/1
(raty$Raty = c(raty$Raty)-1)

#tu wyodrenienie zbiorów uczącego i testowego
ucz = sample(127,100, rep = F)

raty_ucz = raty[ucz,]
raty_test = raty[-ucz,]

#wykres (por. wykład 11)
plot(raty$Dochody, raty$Wydatek, col = raty$Raty+1)
#widać, że będą błędy w klasyfikacji

#teraz fragment wykładu 8:

attach(raty_ucz)

#regresja logistyczna od dwóch zmiennych
regl2 = glm(Raty ~ Wydatek+Dochody, family = "binomial")
summary(regl2)

#a może lepiej rzut na wykres dwuwymiarowy?
logit = predict(regl2)
plot(logit, Raty)

x = seq(min(logit), max(logit), length = 300)
y = 1/(1+exp(-x))
lines(x, y, lwd = 2, col = "blue2")
#widać, że model jest niezły
detach(raty_ucz)

#klasyfikator:
#wartość funkci logit > 0 <-> przewidujemy Raty=1

#działanie na zbiorze uczącym (mnożenie przez 1, żeby były zera i jedynki)
(raty_pred = 1*(predict(regl2) > 0))

#wykres dla zbioru uczącego
#kolor - prognoza, litera - decyzja

plot(raty$Dochody, raty$Wydatek, col = "white")
text(raty_ucz$Dochody, raty_ucz$Wydatek, c("N", "T")[raty_ucz$Raty+1], col = raty_pred+1)

#dodaję zbiór testowy
(raty_pred2 = 1*c(predict(regl2, raty_test) > 0))

text(raty_test$Dochody, raty_test$Wydatek, c("N", "T")[raty_test$Raty+1], col = raty_pred2+1, font = 2)

#ocena klasyfikacji
(tabela_ucz = table(decyzja = raty_ucz$Raty, progn = raty_pred))
print("Błąd na zbiorze uczącym:", quote = F)
1-sum(diag(tabela_ucz))/sum(tabela_ucz)

#na zbiorze testowym
(tabela_test = table(decyzja = raty_test$Raty, progn = raty_pred2))
print("Błąd na zbiorze testowym:", quote = F)
1-sum(diag(tabela_test))/sum(tabela_test)

#linia rozgraniczająca do wykresu (można dorysować) - zadanie dla czytających

#klasyfikator liniowy powinien dać (mniej więcej) to samo
library(MASS)
klas1 = lda(Raty~Dochody+Wydatek, data = raty_ucz)

klas1.pred = predict(klas1)

raty_pred
klas1.pred$class
#wynik dokładnie ten sam - wszędzie 0
raty_pred - c(klas1.pred$class)+1

#na zbiorze testowym też to samo
predict(klas1, raty_test)$class
raty_pred2

#wynik dokładnie ten sam - wszędzie 0
raty_pred2 - c(predict(klas1, raty_test)$class)+1

#czyżby były takie same? spróbuję narysować wykres
library(klaR)

drawparti(raty_ucz$Raty, raty_ucz$Dochody, raty_ucz$Wydatek, prec = 200,
          xlab = "Dochody", ylab = "Wydatek")

#linia, która rozgranicza klasyfikację logistyczną:
regl2$coeff

#ma postać: regl2$coeff[1]+Wyd*regl2$coeff[2]+Doch*regl2$coeff[3] = 0

doch = c(min(raty$Dochody), max(raty$Dochody))
wyd = -(regl2$coeff[1]+doch*regl2$coeff[3])/regl2$coeff[2]
lines(doch, wyd, lwd = 2)
#czyli jednak trochę się różnią

Zgłoś jeśli naruszono regulamin