---
title: "Caso 05: Classificador de digitos - Support Vector Machine"
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:
+ Caret (https://cran.r-project.org/web/packages/caret/index.html)
+ KlaR (https://cran.r-project.org/web/packages/klaR/index.html)
+ E1071 (https://cran.r-project.org/web/packages/e1071/index.html)
+ Ggplot2 (<https://cran.r-project.org/web/packages/ggplot2/index.html>)

```{r include = TRUE, message=FALSE, warning=FALSE}
library(caret)
library(klaR)
library(e1071)
library(ggplot2)
```


***  
  
### Etapa 1: Selecao dos dados  
  
```{r include = TRUE}
load(file="df_classificador.Rdata")
str(DADOS)
```
  
  
***  

### Etapa 2: Pre-processamento (ja realizado nos casos anteriores)  
  

***  

### Etapa 3: Transformacao dos dados  
  

#### Divisao dos dados em amostras de treinamento e de teste do modelo:  
  
  Nesta etapa os dados serao divididos de forma a ficar 60% para treinamento do modelo e 40% para teste do modelo. Assim:

  
```{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)
```

***  

### Etapa 4: Mineracao dos dados  
  

  Na etapa de mineracao de dados vamos criar modelos de classificacao utilizando Support Vector Machine (SVM) considerando 3 tipos de kernel (linear, radial e sigmoid) com *tunagem* dos parametros, ou seja, selecionando o melhor valor para o parametro Custo (SVM linear) e Custo e Sigma (SVM Radial). Estes serao avaliados por meio de uma validacao cruzada do tipo 5-fold.  

  
---

#### SVM Linear:
  
  
```{r include = TRUE}
set.seed(456)
fit.SVML = train(y ~ .,method ='svmLinear',
               trControl=trainControl(method='cv',number=5),
               metric     = "Accuracy",
               tuneGrid = expand.grid(C=c(0.25,0.5,1.0,2.0)),
               data       = treino,  
               preProcess = c("center","scale"))
fit.SVML
plot(fit.SVML, main="SVM Linear")
message('');message('N# support vectors: ',fit.SVML$finalModel@nSV)
```

- Para obter o hiperplano de separacao faz-se:  

```{r include = TRUE}
message('Intercepto: ');fit.SVML$finalModel@b[[1]]
coefs <- fit.SVML$finalModel@coef[[1]]
mat <- fit.SVML$finalModel@xmatrix[[1]]
message('');message('Coeficientes: '); coefs %*% mat
```

---

#### SVM Radial:


```{r include = TRUE}
set.seed(456)
fit.SVMR = train(y ~ .,method ='svmRadial',
               trControl=trainControl(method='cv',number=5),
               metric     = "Accuracy",
               tuneLength = 4,
               data       = treino,  
               preProcess = c("center","scale"))
fit.SVMR
plot(fit.SVMR, main="SVM Radial")
message('');message('N# support vectors: ',fit.SVMR$finalModel@nSV)
```

- Comparacao do desempenho (validação cruzada):

```{r include = TRUE}
resultados <- resamples(list(SVM.L=fit.SVML,SVM.R=fit.SVMR))
dotplot(resultados)
```
  
  
  Verifica-se, a partir dos resultados obtidos, que o modelo com melhor desempenho foi o com kernel radial.Para avaliar se está ocorrendo *overfitting*, vamos comparar a performance da validação cruzada com a do conjunto de teste.      

- Performance consolidada, no conjunto treino:  
  
```{r}
Prev.treino <- predict(fit.SVMR,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.SVMR,newdata = z)
plot(z,col=unclass(P.CLASS.knn))
```
   
---

#### Performance no conjunto de teste:
  

```{r include = TRUE}
Prev.teste <- predict(fit.SVMR,newdata = teste)
confusionMatrix(teste$y,Prev.teste)
```
  
Pelos resultados obtidos e' possivel afirmar que o modelo obtido não apresenta *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.SVMR,nova.observacao)
```
  
Portanto, será da classe 2.

***  


