Chapter 6 Modelos Supervisionados II - Arvores de Decisao

6.1 Árvores de Decisão

Uma Árvore de Decisão permite fazer classificações por particionamentos sucessivos dos dados. É uma estrutura que traduz uma tabela de decisão.

6.2 Algoritmo de Hunt

Vejamos um exemplo. http://meusite.mackenzie.br/rogerio/TIC/comics.csv

6.3 Ganho de Informação

Como você viu diferentes Árvores de Decisão podem ser construídas. A decisão dos Algoritmos para a decisão de que atributos empregar como Raiz e Nós na construção de uma Árvore são feitos com base em medidas do Ganho de Informação.

Para o cálculo do Ganho de Informação de um atributo existem 3 valores comumente empregados.

6.3.1 Entropia.

\[ Entropia(s) = - \sum_i p_i log p_i \]

Exemplos:

\[ Entropia(CONSTANTE) = 0 \] \[ Entropia(bit) = 1 \]

6.3.2 Índice Gini.

\[ Gini(s) = 1 - \sum_i p_i \]

6.3.3 Classification Error

\[ ClassificationError = 1 - max p_i \]

O ganho de informação é então obtido como:

\[ IG(a) = D(T) - \sum_i p_i D(T | a_i) \]

Onde \(D()\) é uma das medidas de Entropia, índice Gini ou Classification Error.

Você pode ver um exemplo completo em http://meusite.mackenzie.br/rogerio/TIC/comics.csv ou ainda consultar https://www.saedsayad.com/data_mining_map.htm para uma apresentação gentil do tema.

6.4 Prós e Limitações do Modelo

6.4.1 Prós

  • Não é um modelo black-box
  • É eficiente
  • Permite trabalhar diretamente com valores categóricos

6.4.2 Limitações

  • Tem um alto custo de treinamento
  • É sensível a sobreajuste(*)

(*) Para minimizar esse efeito pode-se fazer a poda de níveis da Árvore ou emprego de Random Forests, entendidas como uma média de Árvores de Decisão.

6.5 Recurso adicional

https://ml-playground.com/

6.6 Um exemplo em R

library(rpart)

set.seed(1984)
RNGversion("3.5.2")

L = sample(1:nrow(iris),round(nrow(iris)/3))  

test = iris[L,]
train = iris[-L,]

fit = rpart(Species ~  .,data=train)

plot(fit) # print tree

pred = predict(fit,test,type = "class")
print(pred)
##         63         67         85         23         69         98        137 
## versicolor versicolor versicolor     setosa versicolor versicolor  virginica 
##         81         86        117        141        130         22         94 
## versicolor versicolor  virginica  virginica versicolor     setosa versicolor 
##        110         89         83         97         61         27         28 
##  virginica versicolor versicolor versicolor versicolor     setosa     setosa 
##         62        147        150        148         60         87          2 
## versicolor  virginica  virginica  virginica versicolor versicolor     setosa 
##        136         11        112        143         26         36         48 
##  virginica     setosa  virginica  virginica     setosa     setosa     setosa 
##         33         79         95         38          5         88        113 
##     setosa versicolor versicolor     setosa     setosa versicolor  virginica 
##         12        146         16         18         10        135         31 
##     setosa  virginica     setosa     setosa     setosa versicolor     setosa 
##          9 
##     setosa 
## Levels: setosa versicolor virginica
M = table(iris[L,]$Species, pred)
print(M)
##             pred
##              setosa versicolor virginica
##   setosa         18          0         0
##   versicolor      0         18         0
##   virginica       0          2        12
cat( "Acuracidade: ", sum(diag(M))/sum(M))
## Acuracidade:  0.96

Você ainda pode empregar o atributo 'prob', predict(fit,test,type = "prob"), no lugar do 'class', para obter a probabilidade de cada classe.

6.7 Exercício.

Empregue o dataset titanic_train.csv. Aplique o modelo rpart para classificação e em seguida responda as perguntas.

library(rpart)
RNGversion("3.5.2")
set.seed(1984) 

titanic = read.csv("http://meusite.mackenzie.br/rogerio/ML/titanic_train.csv")

Dicas: 1. Empregue RNGversion("3.5.2") e set.seed(1984) para garantir suas respostas.

  1. Elimine os atributos não desejados para o treinamento: "PassengerId" "Name" "Parch" "Ticket" "Cabin" (por quê?)

  2. Elimine os valores nulos remanescentes (titanic = na.omit(titanic))

  3. Empregue exatamente 1/3 dos dados para teste.

  4. Atenção: a partir de versões de 2020 do R e rpart o atributo classe precisa ser um factor: titanic$Survived = as.factor(titanic$Survived) de outro modo você receberá a mensagem: Error in predict.rpart(fit, test, type = "class") : Invalid prediction for "rpart" object