---
title: "Caso 01: Classificador de digitos - KNN"
output:
  html_document: default
  pdf_document: default
---

## autor: *Rodrigo A. Scarpel*

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

------------------------------------------------------------------------

## No R:

### Pacotes do R utilizados:

-   Dplyr (<https://cran.r-project.org/web/packages/dplyr/index.html>)
-   Caret (<https://cran.r-project.org/web/packages/caret/index.html>)

```{r include = TRUE, message=FALSE, warning=FALSE}
library(dplyr)
library(caret)
```

------------------------------------------------------------------------

### Etapa 1: Selecao dos dados

```{r include = TRUE}
load(file="df_classificador.Rdata")
str(DADOS)
```

------------------------------------------------------------------------

### Etapa 2: Pre-processamento

-   Media, desvio-padrao, CV e distribuicao das variaveis disponiveis:

```{r include = TRUE}
DADOS %>% summarise(media.FREQ=mean(x_1),dpadrao.FREQ=sd(x_1),cv.FREQ=sd(x_1)/mean(x_1))
DADOS %>% summarise(media.PRF=mean(x_2),dpadrao.PRF=sd(x_2),cv.FREQ=sd(x_2)/mean(x_2))
par (mfrow=c(1,2))
hist(DADOS[,2],breaks=10, col = "red3", main="x_1")
hist(DADOS[,3],breaks=10, col = "blue1", main="x_2")
boxplot(DADOS[,2],breaks=10, col = "red3", main="x_1")
boxplot(DADOS[,3],breaks=10, col = "blue1", main="x_2")
par (mfrow=c(1,1))
plot(DADOS[,2:3],col=factor(DADOS[,1]),pch=19)
```

Como a escala das variaveis nao e' diferente, nao teremos que fazer a normalizacao (ou padronizacao) das variaveis (o metodo KNN faz uso da distancia Euclidiana entre as observacoes).

------------------------------------------------------------------------

### Etapa 3: Transformacao dos dados

Nesta etapa os dados serão divididos de forma a ficar 60% para treinamento do modelo e 40% para teste do modelo. Assim:

```{r include = TRUE}
set.seed(101)  
amostra <- sample.int(n = nrow(DADOS), size = floor(.60*nrow(DADOS)), replace = F)
treino <- DADOS[amostra, ]
teste  <- DADOS[-amostra, ]
message('Distribuicao das classes na base de treino:');table(factor(treino$y))
message('')
message('Distribuicao das classes na base de teste:');table(factor(teste$y))
```

------------------------------------------------------------------------

### Etapas 4 e 5: Mineracao dos dados e avaliacao dos resultados

Para o KNN, na etapa de mineracao de dados o primeiro passo e' determinar o numero ideal de vizinhos. Para isso, foi testado de 1 a 50 vizinhos empregando um 5-fold CV. Assim:

```{r include = TRUE}
trControl <- trainControl(method  = "cv",number  = 5)
set.seed(108)
fit.knn <- train(factor(y) ~ .,
             method     = "knn",
             tuneGrid   = expand.grid(k = 1:50),
             trControl  = trControl,
#             preProcess = c("center","scale"),
             metric     = "Accuracy",
             data       = treino)
fit.knn
plot(fit.knn)
```

A partir dos resultados apresentados, verifica-se o numero ideal de vizinhos.

- Performance consolidada no treino:

```{r include = TRUE}
Prev.treino <- predict(fit.knn,newdata = treino)
confusionMatrix(factor(Prev.treino), factor(treino$y))
```
   
- Resultado do classificador:   
   
```{r}
x_1 = seq(0,0.5,0.001)
x_2 = seq(0,0.6,0.001)
z = data.frame(expand.grid(x_1,x_2))
colnames(z) = c("x_1","x_2")
P.CLASS.knn <- predict(fit.knn,newdata = z)
plot(z,col=unclass(P.CLASS.knn))
```
   

-   Conjunto de teste:

```{r include = TRUE}
Prev.teste <- predict(fit.knn,newdata = teste)
confusionMatrix(factor(Prev.teste), factor(teste$y))
```

Dessa forma, verifica-se, a partir dos resultados, que ha uma grande diferenca entre as taxas de acerto no conjunto treino e no conjunto de teste, indicando problemas de *overfitting*.

------------------------------------------------------------------------

#### Aplicacao da regra de classificacao:

Qual sera a classificacao de um digito com:\
- x_1: 0.1253\
- x_2: 0.2714

```{r include = TRUE}
nova.observacao = data.frame(
  x_1 = 0.1253,
  x_2 = 0.2714)
predict(fit.knn,nova.observacao)
predict(fit.knn,nova.observacao,type="prob")
```

Portanto, e' classificado como "2".

------------------------------------------------------------------------
