---
title: "Caso 07: Avaliação de classificadores e balanceamento / ponderação"
output:
  html_document: default
  pdf_document: default
---
## autor: *Rodrigo A. Scarpel*

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
  
___
  
### Pacotes do R utilizados:
+ Ggplot2 (https://cran.r-project.org/web/packages/ggplot2/index.html)
+ Dplyr (https://cran.r-project.org/web/packages/dplyr/index.html)
+ Caret (https://cran.r-project.org/web/packages/caret/index.html)
+ ROSE (https://cran.r-project.org/web/packages/ROSE/index.html)
+ PROC (https://cran.r-project.org/web/packages/pROC/index.html)


```{r include = TRUE}
library(ggplot2)
library(dplyr)
library(caret)
library(ROSE)
library(pROC)
```
   
___  

## Avaliação de classificadores:  
  

### Etapa 1: Seleção dos dados  
  
```{r include = TRUE}
load(file="df_classificador.Rdata")
str(DADOS)
```
  
  
```{r include = TRUE}
set.seed(326)
Treino.Index <- createDataPartition(y = DADOS$y, p = 0.6, 
                                    times = 1,list = FALSE)
treino <- DADOS[Treino.Index,]
teste <- DADOS[-Treino.Index,]
message('Distribuicao das classes na base de treino:');table(treino$y)
message('')
message('Distribuicao das classes na base de teste:');table(teste$y)
```

#### Pacote Caret:

- Informacoes:  

```{r include = TRUE}
names(getModelInfo())
```


- Construção e avaliação dos modelos:  

```{r include = TRUE}
set.seed(7)
Control <- trainControl(method = "cv",number = 5) #5-fold CV
fit.qda <- train(y~., data=treino, method="qda", metric="Accuracy", 
                 trControl=Control)
fit.lda <- train(y~., data=treino, method="lda", metric="Accuracy", 
                 trControl=Control)
fit.cart <- train(y~., data=treino, method="rpart", metric="Accuracy", 
                  trControl=Control)
fit.knn <- train(y~., data=treino, method="knn", metric="Accuracy", 
                 trControl=Control)
fit.svm <- train(y~., data=treino, method="svmRadial", metric="Accuracy", 
                 trControl=Control)
fit.rf <- train(y~., data=treino, method="rf", metric="Accuracy", 
                trControl=Control)
results <- resamples(list(QDA=fit.qda,LDA=fit.lda,CART=fit.cart,
                          KNN=fit.knn,SVM=fit.svm,RF=fit.rf))
summary(results)
dotplot(results)
```
  
  
- Descrição do modelo com melhor resultado:
  
```{r include = TRUE}
print(fit.svm)
```
  
  
- Avaliação nos conjuntos de treino e teste:  
  
```{r include = TRUE}
message("Performance no conjunto de treino: ")
predict.treino <- predict(fit.svm,treino)
confusionMatrix(factor(treino$y),predict.treino)
message("Performance no conjunto de teste: ")
predict.teste <- predict(fit.svm,teste)
confusionMatrix(factor(teste$y),predict.teste)
```
  
  
- Curva ROC: KNN x QDA (treino)  
  

```{r include = TRUE}
predict.prob.knn <- predict(fit.knn,treino,"prob")
rocobj.KNN <- plot.roc(factor(treino$y),predict.prob.knn[,1],
                        main="Curva ROC - KNN (treino)",
                        percent=TRUE, xlim=c(100,0),col="#1c61b6",
                        print.auc = TRUE)
predict.prob.qda <- predict(fit.qda,treino,"prob")
rocobj.QDA <- plot.roc(factor(treino$y),predict.prob.qda[,1],
                        main="Curva ROC - QDA (treino)",
                        percent=TRUE, xlim=c(100,0),col="#1c61b6",
                        print.auc = TRUE)
rocobj.COMP <- plot.roc(factor(treino$y), predict.prob.knn[,1],
                        main="KNN x QDA (treino)",
                        percent=TRUE,xlim=c(100,0),
                        col="#1c61b6")
rocobj.QDA2 <- lines.roc(factor(treino$y), predict.prob.qda[,1], 
                        percent=TRUE,col="#008600")
legend("bottomright", legend = c("KNN", "QDA"),col = c("#1c61b6","#008600"),lwd = 2)
```
   
  
- Curva ROC: KNN x QDA (teste)  
  

```{r include = TRUE}
predict.prob.knn <- predict(fit.knn,teste,"prob")
rocobj.KNN <- plot.roc(factor(teste$y),predict.prob.knn[,1],
                        main="Curva ROC - KNN (teste)",
                        percent=TRUE, xlim=c(100,0),col="#1c61b6",
                        print.auc = TRUE)
predict.prob.qda <- predict(fit.qda,teste,"prob")
rocobj.QDA <- plot.roc(factor(teste$y),predict.prob.qda[,1],
                        main="Curva ROC - QDA (teste)",
                        percent=TRUE, xlim=c(100,0),col="#1c61b6",
                        print.auc = TRUE)
rocobj.COMP <- plot.roc(factor(teste$y), predict.prob.knn[,1],
                        main="KNN x QDA (teste)",
                        percent=TRUE,xlim=c(100,0),
                        col="#1c61b6")
rocobj.QDA2 <- lines.roc(factor(teste$y), predict.prob.qda[,1], 
                        percent=TRUE,col="#008600")
legend("bottomright", legend = c("KNN", "QDA"),col = c("#1c61b6","#008600"),lwd = 2)
```
___
  

### Balanceamento dos dados / ponderação    
  
___
  

#### a.Classificação com balanceamento dos dados:
   
```{r include = TRUE}
AMOSTRA.BALANC <- ovun.sample(y ~ ., data = treino, method = "under", 
                              N = 291*2, seed = 349)$data
message("Amostra apos balancear: ");table(AMOSTRA.BALANC$y)
set.seed(123)
fit.QDA = train(y ~ .,
               method ='qda',
               trControl=trainControl(method="cv",number=2),
               metric     = "Accuracy",
               data       = AMOSTRA.BALANC)
fit.QDA
predict.classe <- predict(fit.QDA,teste)
predict.prob <- predict(fit.QDA,teste,"prob")
confusionMatrix(factor(teste$y),predict.classe)
rocobj.QDA <- plot.roc(factor(teste$y),predict.prob[,1],
                        main="Curva ROC",
                        percent=TRUE, xlim=c(100,0),col="#1c61b6",
                        print.auc = TRUE)
```
  

___  
  

#### b.Classificação com ponderação:
   
   
```{r include = TRUE}
ponderacao <- ifelse(treino$y == "2", 
                     (1/table(treino$y)[1]) * 0.5,
                     (1/table(treino$y)[2]) * 0.5)
set.seed(123)
fit.QDA = train(y ~ .,
               method ='qda',
               trControl=trainControl(method="cv",number=2),
               metric     = "Accuracy",
               data       = treino,
               weights = ponderacao)
fit.QDA
predict.classe <- predict(fit.QDA,teste)
predict.prob <- predict(fit.QDA,teste,"prob")
confusionMatrix(factor(teste$y),predict.classe)
rocobj.QDA <- plot.roc(factor(teste$y),predict.prob[,1],
                        main="Curva ROC",
                        percent=TRUE, xlim=c(100,0),col="#1c61b6",
                        print.auc = TRUE)
```
  
  
___
