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
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.
Elimine os atributos não desejados para o treinamento: "PassengerId" "Name" "Parch" "Ticket" "Cabin" (por quê?)
Elimine os valores nulos remanescentes (
titanic = na.omit(titanic)
)Empregue exatamente 1/3 dos dados para teste.
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