# początek jak zwykle
library(mlbench)
data(HouseVotes84)
data(Glass)

      # podzielmy dane na trenujące i testowe losowo w stosunku ok. 2:1
rhv <- runif(nrow(HouseVotes84))
hv.train <- HouseVotes84[rhv>=0.33,]
hv.test <- HouseVotes84[rhv<0.33,]
rg <- runif(nrow(Glass))
g.train <- Glass[rg>=0.33,]
g.test <- Glass[rg<0.33,]

      # pakiet rpart zawiera implementację indukcji drzew decyzyjnych
library(rpart)

      # drzewa dla HouseVotes84
      # pierwsze -- domyślne ustawienia
hv.tree1 <- rpart(Class ~ ., hv.train)
      # obejrzyjmy
hv.tree1
plot(hv.tree1)
text(hv.tree1)
      # błąd na zbiorze testowym
sum(hv.test$Class!=predict(hv.tree1, hv.test,
type="c"))/nrow(hv.test)


      # drugie -- podział wg entropii
hv.tree2 <- rpart(Class ~ ., hv.train,
parms=list(split="information"))
      # obejrzyjmy
hv.tree2
plot(hv.tree2)
text(hv.tree2)
      # błąd na zbiorze testowym
sum(hv.test$Class!=predict(hv.tree2, hv.test,
type="c"))/nrow(hv.test)

      # trzecie -- złagodzone kryterium stopu (większe drzewo)
hv.tree3 <- rpart(Class ~ ., hv.train,
control=rpart.control(minsplit=10))
      # obejrzyjmy
hv.tree3
plot(hv.tree3)
text(hv.tree3)
      # błąd na zbiorze testowym
sum(hv.test$Class!=predict(hv.tree3, hv.test,
type="c"))/nrow(hv.test)

      # czwarte -- bez używania atrybutu V4
hv.tree4 <- rpart(Class ~
V1+V2+V3+V5+V6+V7+V8+V9+V10+V11+V12+V13+V14+V15+V16,
hv.train)
      # obejrzyjmy
hv.tree4
plot(hv.tree4)
text(hv.tree4)
      # błąd na zbiorze testowym
sum(hv.test$Class!=predict(hv.tree4, hv.test,
type="c"))/nrow(hv.test)

      # drzewa dla Glass
      # pierwsze -- domyślne ustawienia
g.tree1 <- rpart(Type ~ ., g.train)
      # obejrzyjmy
g.tree1
plot(g.tree1)
text(g.tree1)
      # błąd na zbiorze testowym
sum(g.test$Type!=predict(g.tree1, g.test, type="c"))/nrow(g.test)

      # drugie -- podział wg entropii
g.tree2 <- rpart(Type ~ ., g.train, parms=list(split="information"))
      # obejrzyjmy
g.tree2
plot(g.tree2)
text(g.tree2)
      # błąd na zbiorze testowym
sum(g.test$Type!=predict(g.tree2, g.test, type="c"))/nrow(g.test)

      # trzecie-- zaostrzone kryterium stopu (mniejsze drzewo)
g.tree3 <- rpart(Type ~ ., g.train,
control=rpart.control(minsplit=50))
      # obejrzyjmy
g.tree3
plot(g.tree3)
text(g.tree3)
      # błąd na zbiorze testowym
sum(g.test$Type!=predict(g.tree3, g.test, type="c"))/nrow(g.test)