1 Aula 9 - Árvore de regressão
1.1 Arvores de regressão
Dados utilizados: iris; pacote tree, função tree
Vamos dividir o conjunto de dados em dois: treinamento e teste
set.seed(100)
alpha <- 0.7 # porcentagem do conjunto de treinamento
inTrain <- sample(1:nrow(iris), alpha * nrow(iris))
train.set <- iris[inTrain,]
test.set <- iris[-inTrain,]library(rpart)
library(rpart.plot)
arv1=rpart(Species~., data=train.set)
arv1## n= 105
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 105 68 versicolor (0.29524 0.35238 0.35238)
## 2) Petal.Length< 2.45 31 0 setosa (1.00000 0.00000 0.00000) *
## 3) Petal.Length>=2.45 74 37 versicolor (0.00000 0.50000 0.50000)
## 6) Petal.Length< 4.85 35 1 versicolor (0.00000 0.97143 0.02857) *
## 7) Petal.Length>=4.85 39 3 virginica (0.00000 0.07692 0.92308) *
summary(arv1)## Call:
## rpart(formula = Species ~ ., data = train.set)
## n= 105
##
## CP nsplit rel error xerror xstd
## 1 0.4706 0 1.00000 1.2353 0.06028
## 2 0.0100 2 0.05882 0.1471 0.04423
##
## Variable importance
## Petal.Length Petal.Width Sepal.Length Sepal.Width
## 35 32 21 13
##
## Node number 1: 105 observations, complexity param=0.4706
## predicted class=versicolor expected loss=0.6476 P(node) =1
## class counts: 31 37 37
## probabilities: 0.295 0.352 0.352
## left son=2 (31 obs) right son=3 (74 obs)
## Primary splits:
## Petal.Length < 2.45 to the left, improve=32.77, (0 missing)
## Petal.Width < 0.75 to the left, improve=32.77, (0 missing)
## Sepal.Length < 5.45 to the left, improve=20.94, (0 missing)
## Sepal.Width < 3.35 to the right, improve=12.78, (0 missing)
## Surrogate splits:
## Petal.Width < 0.75 to the left, agree=1.000, adj=1.000, (0 split)
## Sepal.Length < 5.45 to the left, agree=0.914, adj=0.710, (0 split)
## Sepal.Width < 3.35 to the right, agree=0.848, adj=0.484, (0 split)
##
## Node number 2: 31 observations
## predicted class=setosa expected loss=0 P(node) =0.2952
## class counts: 31 0 0
## probabilities: 1.000 0.000 0.000
##
## Node number 3: 74 observations, complexity param=0.4706
## predicted class=versicolor expected loss=0.5 P(node) =0.7048
## class counts: 0 37 37
## probabilities: 0.000 0.500 0.500
## left son=6 (35 obs) right son=7 (39 obs)
## Primary splits:
## Petal.Length < 4.85 to the left, improve=29.520, (0 missing)
## Petal.Width < 1.75 to the left, improve=29.520, (0 missing)
## Sepal.Length < 6.15 to the left, improve= 8.022, (0 missing)
## Sepal.Width < 2.45 to the left, improve= 2.523, (0 missing)
## Surrogate splits:
## Petal.Width < 1.65 to the left, agree=0.905, adj=0.800, (0 split)
## Sepal.Length < 6.25 to the left, agree=0.743, adj=0.457, (0 split)
## Sepal.Width < 2.65 to the left, agree=0.635, adj=0.229, (0 split)
##
## Node number 6: 35 observations
## predicted class=versicolor expected loss=0.02857 P(node) =0.3333
## class counts: 0 34 1
## probabilities: 0.000 0.971 0.029
##
## Node number 7: 39 observations
## predicted class=virginica expected loss=0.07692 P(node) =0.3714
## class counts: 0 3 36
## probabilities: 0.000 0.077 0.923
rpart.plot(arv1)Outro pacote: tree, diferencial: fornece uma visualização de acordo com a partição
library(tree)
arv2 <- tree(Species ~ ., data=train.set)
arv2## node), split, n, deviance, yval, (yprob)
## * denotes terminal node
##
## 1) root 105 200 versicolor ( 0.30 0.35 0.35 )
## 2) Petal.Length < 2.45 31 0 setosa ( 1.00 0.00 0.00 ) *
## 3) Petal.Length > 2.45 74 100 versicolor ( 0.00 0.50 0.50 )
## 6) Petal.Length < 4.85 35 9 versicolor ( 0.00 0.97 0.03 )
## 12) Petal.Length < 4.65 29 0 versicolor ( 0.00 1.00 0.00 ) *
## 13) Petal.Length > 4.65 6 5 versicolor ( 0.00 0.83 0.17 ) *
## 7) Petal.Length > 4.85 39 20 virginica ( 0.00 0.08 0.92 )
## 14) Petal.Width < 1.75 6 8 virginica ( 0.00 0.50 0.50 ) *
## 15) Petal.Width > 1.75 33 0 virginica ( 0.00 0.00 1.00 ) *
plot(arv2)
text(arv2, cex=0.6)Outra forma de visualizar a árvore:
plot(iris$Petal.Length,iris$Petal.Width, pch=19, col=as.numeric(iris$Species))
partition.tree(arv2, label="Species", add=TRUE)
legend("topright",legend=unique(iris$Species), col=unique(as.numeric(iris$Species)), pch=19)2 Exercício
Compare os modelos obtidos utilizando a matriz de confusão, monte uma tabela com os modelos e as medidas de acurácia, sensibilidade e especificidade.
3 Trabalho para avaliação
Organize um banco de dados e aplique a técnica de árvore de regressão. Descreva o contexto, qual o objetivo da classificação e os resultados. Apresentar na aula do dia 11/10.
4 Aula 10 Validação Cruzada
Com CV
tree.model1 <- cv.tree(arv2)
tree.model1## $size
## [1] 5 4 3 2 1
##
## $dev
## [1] 66.25 63.40 60.03 103.21 233.55
##
## $k
## [1] -Inf 3.675 12.835 72.351 127.423
##
## $method
## [1] "deviance"
##
## attr(,"class")
## [1] "prune" "tree.sequence"
prune.tree(arv2, best = tree.model1$size[which.min(tree.model1$dev)])## node), split, n, deviance, yval, (yprob)
## * denotes terminal node
##
## 1) root 105 200 versicolor ( 0.30 0.35 0.35 )
## 2) Petal.Length < 2.45 31 0 setosa ( 1.00 0.00 0.00 ) *
## 3) Petal.Length > 2.45 74 100 versicolor ( 0.00 0.50 0.50 )
## 6) Petal.Length < 4.85 35 9 versicolor ( 0.00 0.97 0.03 ) *
## 7) Petal.Length > 4.85 39 20 virginica ( 0.00 0.08 0.92 ) *
plot(prune.tree(arv2, best = tree.model1$size[which.min(tree.model1$dev)]))
text(arv2, cex=0.6)4.1 Arvores de inferência condicional
As árvores de inferência condicional estimam um relacionamento de regressão por particionamento recursivo binário em uma estrutura de inferência condicional. Aproximadamente, o algoritmo funciona da seguinte maneira: 1) Teste a hipótese nula global de independência entre qualquer uma das variáveis de entrada e a resposta (que também pode ser multivariada). Pare se essa hipótese não puder ser rejeitada. Caso contrário, selecione a variável de entrada com a associação mais forte à ressonância. Essa associação é medida por um valor p correspondente a um teste para a hipótese nula parcial de uma única variável de entrada e a resposta. 2) Implemente uma divisão binária na variável de entrada selecionada. 3) Repita recursivamente as etapas 1) e 2) - arquivo de ajuda do pacote party
library(party)
#Vamos dividir o conjunto de dados em dois: treinamento e teste
set.seed(100)
alpha <- 0.7 # porcentagem do conjunto de treinamento
inTrain <- sample(1:nrow(iris), alpha * nrow(iris))
train.set <- iris[inTrain,]
test.set <- iris[-inTrain,]
iris.model <- ctree(Species ~ . , data = train.set)
plot(iris.model)4.2 Referências
http://www.leg.ufpr.br/lib/exe/fetch.php/projetos:modeltrees:tesecesartaconeli.pdf
https://www.statmethods.net/advstats/cart.html
https://data-flair.training/blogs/r-decision-trees/
https://cran.r-project.org/web/packages/rpart/vignettes/longintro.pdf
print(sessionInfo(), locale = FALSE)## R version 3.4.3 (2017-11-30)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 17134)
##
## Matrix products: default
##
## attached base packages:
## [1] stats4 grid stats graphics grDevices utils datasets
## [8] methods base
##
## other attached packages:
## [1] party_1.3-0 strucchange_1.5-1 sandwich_2.4-0 zoo_1.8-1
## [5] modeltools_0.2-21 mvtnorm_1.0-7 tree_1.0-39 rpart.plot_3.0.3
## [9] rpart_4.1-11
##
## loaded via a namespace (and not attached):
## [1] Rcpp_0.12.17 knitr_1.20 magrittr_1.5 MASS_7.3-50
## [5] splines_3.4.3 lattice_0.20-35 multcomp_1.4-8 stringr_1.3.1
## [9] tools_3.4.3 TH.data_1.0-8 htmltools_0.3.6 survival_2.41-3
## [13] yaml_2.1.18 rprojroot_1.3-2 digest_0.6.15 Matrix_1.2-14
## [17] codetools_0.2-15 prettydoc_0.2.1 evaluate_0.10.1 coin_1.2-2
## [21] rmarkdown_1.10 stringi_1.1.7 compiler_3.4.3 backports_1.1.2