{{indexmenu_n>5}} Obsah této stránky bude přístupný od 9. 11. 2017. Test: https://goo.gl/forms/ZAVeyFwDV2hnWXhJ2 **TEST 04** - (0.5b) //Asociační pravidla//. Definujte podporu (support) množiny položek. - (0.5b) Uvažujte dva body $x=(1;2)$ a $y=(4;6)$. Spočítejte jejich Eukleidovskou i Manhattanskou vzdálenost. ====== Cvičení 5 - Rozhodovací stromy ====== V dnešním cvičení využijeme několik souborů s daty - všechny jsou v následujícím souboru {{courses:a6m33dvz:cviceni:cviceni3_stromy.zip|cviceni_stromy.zip}} ==== Konstrukce rozhodovacího stromu ==== * Jak funguje algoritmus ID3? * Jaké znáte metody pro nalezení nejinformovanějšího atributu? * Jak se spočítá entropie pro jeden atribut? **Příklad:** Hráči chodí hrát tenis, ale hrají pouze za příznivého počasí. Příklady jejich rozhodnutí jsou v následující tabulce. Atributy jsou ''"outlook"'', ''"temperature"'', ''"humidity"'', ''"windy"'' a rozhodnutí je ve sloupečku ''"play"''. Nalezněte podle čeho se hráči rozhodují, zda půjdou hrát. ^ outlook ^ temperature ^ humidity ^ windy ^ play ^ | sunny | hot | high | false | no | | sunny | hot | high | true | no | | overcast| hot | high | false | yes | | rainy | mild | high | false | yes | | rainy | cool | normal | false | yes | | rainy | cool | normal | true | no | | overcast| cool | normal | true | yes | | sunny | mild | high | false | no | | sunny | cool | normal | false | yes | | rainy | mild | normal | false | yes | | sunny | mild | normal | true | yes | | overcast| mild | high | true | yes | | overcast| hot | normal | false | yes | | rainy | mild | high | true | no | **Úkol:** Nalezněte nejinformovanější atribut podle kritéria entropie {{courses:a6m33dvz:cviceni:cviceni2resenikriterium.pdf|Řešení příkladu}} ==== Rozhodovací stromy v R ==== library(C50) library(rpart) library(rpart.plot) data(iris) ind <- sample(nrow(iris),0.7*nrow(iris)) iris_train <- iris[ind,] iris_test <- iris[-ind,] tree_rpart <- rpart(Species ~ .,data=iris_train,control=rpart.control(minsplit=10,cp=0),parms=list(split='information')) summary(tree_rpart) prp(tree_rpart, type=2, extra=101, nn=TRUE, fallen.leaves=TRUE, faclen=0, varlen=0, shadow.col="grey", branch.lty=3) # ověření na testovacích datech table(predict(tree_rpart,newdata=iris_test,type="class"),iris_test$Species) #konstrukce stromu pomocí algoritmu C5.0 tree_c50 <- C5.0(Species ~ ., data=iris_train) summary(tree_c50) table(predict(tree_c50,newdata=iris_test,type="class"), iris_test$Species) **Úkol:** * Data o tenistech jsou součástí souboru dat pod názvem //weather.csv//. * Vytvořte rozhodovací strom v R pomocí ''C5.0''. * Který atribut je kořenem stromu? * Půjdou tenisté hrát v následujících podmínkách [outlook=sunny, temperature=cool, huminity=normal, windy=true]? Použijte příkaz //predict//. weather_test <- data.frame(outlook='sunny',temperature='cool',humidity='normal',windy='TRUE') ==== Demonstrace fungování rozhodovacího stromu ==== * Naimportujte do R data //mensivetsi.csv// ze souboru dat. * Jak vypadají data? Existuje nějaký jednoduchý popis dat? * Nastavte v ''rpart.control'' parametr ''maxdepth=2'', nakreslete, jak se konstruuje rozhodovací strom pro tato data. * Ilustraci toho, jakým způsobem strom klasifikuje, můžete shlédnout, aplikujete-li natrénovaný strom na data #class musí být typu factor mv$class<-factor(mv$class) #konstrukce modelu model <- rpart(class ~ a + b, data = mv, control = rpart.control(maxdepth=2)) #vizualizace stromu prp(model, type=2, extra=101, nn=TRUE, fallen.leaves=TRUE, faclen=0, varlen=0, shadow.col="grey", branch.lty=3) #vizualizace predikce stromem plot(mv$a, mv$b, col=predict(model,type="class")) * Postupně zvětšujte parametr ''maxdepth=[1,...,5]''. Je rozhodovací strom vhodný klasifikátor pro tento typ dat? Proč? ==== Další vlastnost rozhodovacího stromu - demontrace XOR ==== Demonstrace vlastností ID3 na algorithmu C5.0 (vylepšený ID3 algoritmus) [[http://en.wikipedia.org/wiki/C4.5_algorithm|C4.5 algorithm]] * Do R postupně naimportujte soubory dat //kruh1.csv// až //kruh4.csv// kruh1 <- read.csv('kruh1.csv',header=T,sep=';') kruh2 <- read.csv('kruh2.csv',header=T,sep=';') kruh3 <- read.csv('kruh3.csv',header=T,sep=';') kruh4 <- read.csv('kruh4.csv',header=T,sep=';') kruhy <- rbind(kruh1,kruh2,kruh3,kruh4) plot(kruhy$a,kruhy$b,col=kruhy$class) kruhy$class <- factor(kruhy$class) #packages library(C50) model2 <- C5.0(x = kruhy[,1:2], y=kruhy$class) summary(model2) plot(kruhy$a,kruhy$b,col=predict(model2,type='class')) table(predict(model2,newdata=kruhy,type='class')) plot(kruhy$a,kruhy$b,col=predict(model2,newdata=kruhy,type='class')) * Zkonstruujte rozhodovací strom. Lze ho z těchto dat zkonstruovat a proč? * Změňte velikost vzorku //kruh1// a //kruh4// na 30%. Co se stane? sample.kruh <- sample(2, nrow(kruh1), replace=TRUE, prob=c(0.7, 0.3)) kruh1.sample <- kruh1[sample.kruh==2,] * Zkonstruujte rozhodovací strom. Lze ho nyní z těchto dat zkonstruovat a proč?