default student balance income
No :9667 No :7056 Min. : 0.0 Min. : 772
Yes: 333 Yes:2944 1st Qu.: 481.7 1st Qu.:21340
Median : 823.6 Median :34553
Mean : 835.4 Mean :33517
3rd Qu.:1166.3 3rd Qu.:43808
Max. :2654.3 Max. :73554
default student balance income
1 No No 729.5265 44361.625
2 No Yes 817.1804 12106.135
3 No No 1073.5492 31767.139
4 No No 529.2506 35704.494
5 No No 785.6559 38463.496
6 No Yes 919.5885 7491.559
Manipulando os dados
credito <-tibble(Default)summary(credito)
default student balance income
No :9667 No :7056 Min. : 0.0 Min. : 772
Yes: 333 Yes:2944 1st Qu.: 481.7 1st Qu.:21340
Median : 823.6 Median :34553
Mean : 835.4 Mean :33517
3rd Qu.:1166.3 3rd Qu.:43808
Max. :2654.3 Max. :73554
inadimplente estudante balanco receita
Nao:9667 Min. :0.0000 Min. : 0.0 Min. : 772
Sim: 333 1st Qu.:0.0000 1st Qu.: 481.7 1st Qu.:21340
Median :0.0000 Median : 823.6 Median :34553
Mean :0.2944 Mean : 835.4 Mean :33517
3rd Qu.:1.0000 3rd Qu.:1166.3 3rd Qu.:43808
Max. :1.0000 Max. :2654.3 Max. :73554
Treino e Teste
library(caret)set.seed(21)y <- credito$inadimplenteindice_teste <-createDataPartition(y, times =1, p =0.2, list =FALSE)conj_treino <- credito %>%slice(-indice_teste)conj_teste <- credito %>%slice(indice_teste)summary(conj_treino)
inadimplente estudante balanco receita
Nao:7733 Min. :0.0000 Min. : 0.0 Min. : 772
Sim: 266 1st Qu.:0.0000 1st Qu.: 481.3 1st Qu.:21339
Median :0.0000 Median : 819.1 Median :34541
Mean :0.2953 Mean : 832.7 Mean :33541
3rd Qu.:1.0000 3rd Qu.:1167.1 3rd Qu.:43840
Max. :1.0000 Max. :2654.3 Max. :73554
summary(conj_teste)
inadimplente estudante balanco receita
Nao:1934 Min. :0.0000 Min. : 0.0 Min. : 4755
Sim: 67 1st Qu.:0.0000 1st Qu.: 483.5 1st Qu.:21371
Median :0.0000 Median : 836.6 Median :34591
Mean :0.2909 Mean : 846.2 Mean :33423
3rd Qu.:1.0000 3rd Qu.:1163.1 3rd Qu.:43646
Max. :1.0000 Max. :2461.5 Max. :71239
Arvore de Classificação
Na biblioteca rpart as arvores de classificação são obtidas usando o método class. Existem alguns controles que podem ser feitos nos parametros da arvore.
Neste exemplo só definimos o menor conjunto de dados numa partição (minsplit) e o parametro de complexidade cp. Posteriormente vamos ampliar este controle. Um valor de cp muito pequeno ocasiona overfitting e um valor muito grande resulta numa arvore muito pequena (underfitting). Nos dois casos se diminui o desempenho do modelo.
##Usando rpart para desenvolver a arvore library(rpart)arvcl <-rpart(inadimplente ~ ., data=conj_treino,method="class", #para arvore de classificaçãocontrol=rpart.control(minsplit=30,cp=0.02))plot(arvcl)text(arvcl,pretty=0)
Confusion Matrix and Statistics
Reference
Prediction Nao Sim
Nao 1922 36
Sim 12 31
Accuracy : 0.976
95% CI : (0.9683, 0.9823)
No Information Rate : 0.9665
P-Value [Acc > NIR] : 0.0083176
Kappa : 0.5519
Mcnemar's Test P-Value : 0.0009009
Sensitivity : 0.46269
Specificity : 0.99380
Pos Pred Value : 0.72093
Neg Pred Value : 0.98161
Prevalence : 0.03348
Detection Rate : 0.01549
Detection Prevalence : 0.02149
Balanced Accuracy : 0.72824
'Positive' Class : Sim
Arvore de Classificação no caret
##Usando rpart para desenvolver a arvore library(rpart)set.seed(21)## Otimizamos o valor de cp usando um 10-fold cv# O parametro tuneLength diz para o algoritmo escolher diferentes valores para cp# O parametro tuneGrid permite decidir que valores cp deve assumir enquanto que o# tuneLength somente limita o número default de parametros que se usa.tgrid <-expand.grid(cp =seq(0.01,0.10,0.001))ctrl <-trainControl(method ="cv", classProbs=TRUE)arvclass <-train(inadimplente ~ . , data = conj_treino, method ="rpart",trControl = ctrl,tuneGrid = tgrid )# Mostra a acurácia vs cp (parametro de complexidade)plot(arvclass)
## Indica o melhor valor de cparvclass$bestTune
cp
53 0.062
Uma forma melhor de ver a Árvore
## melhorando apresentação da árvorelibrary(rattle)library(rpart.plot)library(RColorBrewer)fancyRpartPlot(arvclass$finalModel, caption =NULL)
##Usando rpart para desenvolver a arvore library(rpart)arvcl <-rpart(inadimplente ~ ., data=conj_treino,method="class", #para arvore de classificaçãocontrol=rpart.control(minsplit=30,cp=0.02))
hiper_grid <-expand.grid(shrinkage =c(.001, .01, .1),interaction.depth =c(1, 3, 5),n.minobsinnode =c(5, 10, 15),bag.fraction =c(.65, 1),optimal_trees =0, # um lugar para guardar resultadosmin_erro =0# um lugar para guardar resultados )# número total de combinaçõesnrow(hiper_grid)
[1] 54
Avaliando o grid de parametros
library(gbm)conj_treino$inadimplente <-as.numeric(conj_treino$inadimplente)conj_treino <-transform(conj_treino, inadimplente=inadimplente -1)#Busca no gridfor(i in1:nrow(hiper_grid)) {#set.seed(21)# treina o modelo gbm.tune <-gbm(formula = inadimplente ~ .,distribution ="bernoulli",data = conj_treino,n.trees =2000,interaction.depth = hiper_grid$interaction.depth[i],shrinkage = hiper_grid$shrinkage[i],n.minobsinnode = hiper_grid$n.minobsinnode[i],bag.fraction = hiper_grid$bag.fraction[i],train.fraction = .75,n.cores =NULL,verbose =FALSE )# adiciona os erros de treino e arvores ao grid hiper_grid$optimal_trees[i] <-which.min(gbm.tune$valid.error) hiper_grid$min_erro[i] <-min(gbm.tune$valid.error)}hiper_grid %>% dplyr::arrange(min_erro) %>%head(10)