---
title: "Caso S09: SVR, CART e Ensembles em Regressão"
output:
  html_document:
    df_print: paged
---

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

### Pacotes do R utilizados:

```{r, message=FALSE, warning=FALSE, include = FALSE}
library(readxl)
library(ggplot2)
library(dplyr)
library(caret)
library(rpart)
library(partykit)
```

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

### 1. Seleção dos dados:

```{r include = TRUE}
df_RG = read_excel("Df_ProdEnerg.xlsx")
df_RG = data.frame(df_RG)
str(df_RG)
```

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

### 2. Transformação dos dados

#### Divisao dos dados em amostras de treinamento e de teste do modelo:

Nesta etapa os dados serao divididos de forma a ficar 80% para treinamento do modelo e 20% para teste do modelo. Assim:


```{r}
set.seed(136)
Index <- createDataPartition(y = df_RG$PE,p = 0.8, list = FALSE)
treino <- df_RG[Index,]
teste <- df_RG[-Index,]
```


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

### 4. Mineracao dos dados:

___

#### Support Vector Regression:   
  
##### Caso linear:
   
```{r}
set.seed(326)
fit.SVRL = train(PE ~ .,method ='svmLinear',
                 trControl=trainControl(method='cv',number=10),
                 metric = "RMSE",
                 tuneGrid = expand.grid(C=c(0.25,0.5,1.0,2.0)),
                 data = treino)
fit.SVRL
plot(fit.SVRL, main="SVR Linear")
```
  
- Parâmetros do modelo:  
  
```{r}
svp = fit.SVRL$finalModel
x = model.matrix(data=treino, PE ~ .)
w <- colSums(svp@coef * x[unlist(svp@alphaindex),])
b <- svp@b
w
b
```
  
- Desempenho no conjunto de teste:  
  
```{r}
Prev.teste.SVRL <- predict(fit.SVRL,newdata = teste)
predVals <- extractPrediction(list(fit.SVRL), 
                              testX = teste[,1:4], 
                              testY = teste[,5])
plotObsVsPred(predVals)
postResample(pred = Prev.teste.SVRL, obs = teste$PE)
```
  
  
##### Caso polinomial:
   
```{r}
# Cuidado: muito demorado pois são testadas todas as combinações de grau, escala e C.
set.seed(326)
fit.SVRP = train(PE ~ .,method ='svmPoly',
                 trControl=trainControl(method='cv',number=10),
                 metric     = "RMSE",
                 tuneGrid=expand.grid(.degree=(2:3), .scale=.1, 
                                      .C=c(0.5,1,2)),
                 data       = treino)
fit.SVRP
plot(fit.SVRP, main="SVR Polinomial")
```
  
- Desempenho no conjunto de teste:  
  
```{r}
Prev.teste.SVRP <- predict(fit.SVRP,newdata = teste)
predVals <- extractPrediction(list(fit.SVRP), 
                              testX = teste[,1:4], 
                              testY = teste[,5])
plotObsVsPred(predVals)
postResample(pred = Prev.teste.SVRP, obs = teste$PE)
```
  
___

#### CART:
  

```{r}
set.seed(326)
fit.CART = train(PE ~ .,method ='rpart',
                 trControl=trainControl(method='cv',number=10),
                 metric     = "RMSE",
                 tuneLength = 9,
                 data       = treino)
fit.CART
plot(fit.CART)
```
  
- Árvore de regressão obtida:  
  
```{r, fig.width=12}
plot(as.party(fit.CART$finalModel), type="extended",use.n=F)
```
  
- Desempenho no conjunto de teste:  
  
```{r}
Prev.teste.CART <- predict(fit.CART,newdata = teste)
predVals <- extractPrediction(list(fit.CART), 
                              testX = teste[,1:4], 
                              testY = teste[,5])
plotObsVsPred(predVals)
postResample(pred = Prev.teste.CART, obs = teste$PE)
```
  
___

#### Ensembles:  
  
  
##### Bagging:    
  
- Número ideal de arvores:
  
```{r}
modellist <- list()
set.seed(326)
for (ntree in c(50,100,150,200,250,300)){
#  set.seed(647)
  fit.BAG <- train(PE ~ ., method='treebag', 
                   trControl=trainControl(method="cv",number=10),
                   metric = 'RMSE',
                   data       = treino,
                   ntree = ntree)
  key <- toString(ntree)
  modellist[[key]] <- fit.BAG
}
resultados <- resamples(modellist); summary(resultados)
dotplot(resultados)
```
  
```{r}
set.seed(326)
fit.BAG = train(PE ~ .,method ='treebag',
                trControl=trainControl(method="cv",number=10,
                                       allowParallel = TRUE),
                metric     = "RMSE",
                data       = treino,
                ntree = 100,
                importance=TRUE)
fit.BAG
plot(varImp(fit.BAG))
```
  

- Desempenho no conjunto de teste:   
   
```{r}
Prev.teste.BAG <- predict(fit.BAG,newdata = teste)
predVals <- extractPrediction(list(fit.BAG), 
                              testX = teste[,1:4], 
                              testY = teste[,5])
plotObsVsPred(predVals)
postResample(pred = Prev.teste.BAG, obs = teste$PE)
```   
   
  
##### Random Forest:   
  
```{r}
set.seed(326)
fit.RF = train(PE ~ .,method ='rf',
               trControl=trainControl(method="cv",number=10),
               metric     = "RMSE",
               data       = treino,
               importance=TRUE,
               tuneGrid = expand.grid(mtry = 1:3),
               ntree = 50)
fit.RF
plot(fit.RF)
plot(varImp(fit.RF))
```


- Desempenho no conjunto de teste:   
   
```{r}
Prev.teste.RF <- predict(fit.RF,newdata = teste)
predVals <- extractPrediction(list(fit.RF), 
                              testX = teste[,1:4], 
                              testY = teste[,5])
plotObsVsPred(predVals)
postResample(pred = Prev.teste.RF, obs = teste$PE)
```

  
  
##### Gradient boosting:   
  
```{r, warning=FALSE}
set.seed(326)
fit.GB = train(PE ~ .,method ='gbm', 
               # OBS: para extreme gradient boosting -> 'xgbTree' 
               trControl=trainControl(method="cv",number=10),
               metric     = "RMSE",
               data       = treino)
fit.GB
plot(fit.GB)
```     
  
- Desempenho no conjunto de teste:   
   
```{r}
Prev.teste.GB <- predict(fit.GB,newdata = teste)
predVals <- extractPrediction(list(fit.GB), 
                              testX = teste[,1:4], 
                              testY = teste[,5])
plotObsVsPred(predVals)
postResample(pred = Prev.teste.GB, obs = teste$PE)
```  
___

### Comparação dos desempenhos:

```{r}
resultados <- resamples(list(SVMPoly = fit.SVRP, CART = fit.CART, BAGGing=fit.BAG,
                             RForest = fit.RF, GBM = fit.GB))
summary(resultados)
dotplot(resultados)
message("Desempenho no conjunto de teste:")
message("SVM Poly:");postResample(pred = Prev.teste.SVRP, obs = teste$PE)
message("CART:");postResample(pred = Prev.teste.CART, obs = teste$PE)
message("Bagging:");postResample(pred = Prev.teste.BAG, obs = teste$PE)
message("RForest:");postResample(pred = Prev.teste.RF, obs = teste$PE)
message("GBoosting:");postResample(pred = Prev.teste.GB, obs = teste$PE)
```


