#### Primjer iz ISLR, Poglavlje 8.3.1 ### ### library(tree) ### library(ISLR2) ?Carseats head(Carseats) summary(Carseats) attach(Carseats) ### Y ce biti binarni odziv: High <- factor(ifelse(Sales <= 8, "No", "Yes")) ### Carseats <- data.frame(Carseats, High) ### tree.carseats <- tree(High ~ . - Sales, Carseats) ?tree ### default je split=deviance ## koristi entropiju kao mjeru necistoce ## u slucaju klasifikacije ?tree.control ### summary(tree.carseats) ### Residual mean deviance je "trosak" C(T) iz (8.13) ## ali pomnozen s n/(n-broj listova) plot(tree.carseats) text(tree.carseats, pretty=0, cex=0.4) ### prva podjela je shelveLoc= Bad ili Medium, ## te ShelveLoc=Good ### Yes/No je predikcija u pojedinom listu ("majority vote") ### npr. na lijevoj strani imamo podjelu koja rezultira ## s dva lista koji daju istu predikciju. ## Zasto smo je onda radili? ### mozemo dobiti i detalje o podjelama tree.carseats ## pod 18) i 19) vidimo da iako nakon podjele predikcija u ## u oba lista ostaje ista, poedjela rezultira jednim cvorom ## (Population >207.5) koji ima 20 podataka od kojih je cak ## 95% koji imaju odziv "Yes" ("čist čvor") ## dakle, kada bi za neku novu kombinaciju kovarijata dospjeli ## u takva cvor, poprilicno smo sigurni da nasa predikcija treba ## biti "Yes" ## kada bismo koristi 0-1 gubitak kao mjeru necistoce tu podjelu ## ne bismo napravili jer se "nečistoća" (tj. greška) ne mijenja ### testna greska set.seed(2) train <- sample(1:nrow(Carseats), 200) Carseats.test <- Carseats[-train, ] High.test <- High[-train] tree.carseats <- tree(High ~ . - Sales, Carseats, subset = train) tree.pred <- predict(tree.carseats, Carseats.test, type = "class") table(tree.pred, High.test) (104 + 50) / 200 ## [1] 0.77 ### ovo je 1- testna greska ### set.seed smo koristili jer, ukoliko postoje listovi ## koji imaju jednak broj "Yes" i "No" podataka u skupu ## za trening, slucajno odabiremo predikciju za svaki novi ## podatak koji upadne u takav list tree.carseats ### cvor 30 je jedan takav list ### obrezivanje stabla set.seed(7) cv.carseats <- cv.tree(tree.carseats, FUN = prune.misclass) # za obrezivanje koristimo # 0-1 mjeru necistoce ("prune.misclass") cv.carseats ### dev je sada ukupan broj primjera ## koji su bili krivo klasificirani u CV metodi plot(cv.carseats, type="b") ### po cv procjeni, najbolja se cini stablo s 9 listova prune.carseats <- prune.misclass(tree.carseats, best = 9) plot(prune.carseats) text(prune.carseats, pretty = 0, cex=0.5) ### tree.pred <- predict(prune.carseats, Carseats.test, type = "class") table(tree.pred, High.test) (97 + 58) / 200 ## [1] 0.775 ### nije veliko povecanje u preciznosti, ## ali dobili smo manje (dakle, intepretabilnije) stablo ### za dodatan primjer klasifikacijskih stabala vidjeti ## Poglavlje 9.2.5 u ESL (spam klasifikaciji) gdje se ## diskutira i upotreba tzv. ROC krivulja vezanih uz ## "sensitivity" u "specificity"