knitr::opts_chunk$set(cache=F, echo = TRUE, set.seed(4151), message=FALSE, warning=FALSE)

Introdução

Dando continuidade ao nosso estudo de Regressão que foi iniciado no módulo anterior e está disponivel em: link . Responderemos mais 5 perguntas relacionados ao assunto de regressão. Contudo, nosso foco agora terá foco na predição. Os dados que serão usados serão os memos do documento anterior(ver link acima).

Inicio

O mesmo processo feito no inicio do documento anterior disponibilizado na introdução será feito nesta seção. Além disso, foi removido um dos deputados, pois o mesmo era um outlier. Algumas bibliografias recomendam não remover um outlier, a não ser que o valor seja um erro causado por medições erradas, por exemplo. O que não é o nosso caso. Remover um outlier pode retirar dados importantes e isso pode afetar de alguma maneira os resultados. Contudo, outras fontes já indicam que depende da situação. Dessa vez escolhemos a opção de remover um outlier. Aqui está um link explicando quando se deve remover um outlier.

Perguntas:

1) Usando todas as variáveis disponíveis, tune (usando validação cruzada): (i) um modelo de regressão Ridge, (ii) um modelo de regressão Lasso e (iii) um modelo KNN. Para os modelos de regressão linear, o parâmetro a ser tunado é o lambda (penalização dos coeficientes) e o KNN o número de vizinhos.

Para este experimento será utilizado validação cruzada 10-fold. Uma boa explicação sobre cross-validation se encontra aqui: link . De forma resumida, a ideia da validação cruzada é separar os dados de forma randomica em k sub-grupos(No nosso caso, 10. Por isso 10-fold) de mais ou menos mesmo tamanho e então é feito k rodadas de treinamento, usando k - 1 partes para treinamento dos dados e uma para teste.

Informações que explicam os modelos Ridge, Lasso e Knn de forma bastante clara podem ser encontradas na bibliografia no final do documento.

set.seed(4151)
fitControl <- trainControl(method = "cv", number = 10)

ridge.model.cv <- train(votos ~ ., 
                        data = eleicoes2014.train,
                        method = "ridge",
                        trControl = fitControl,
                        tuneLength = 10,
                        preProcess = c('scale', 'center'))

ridge.model.cv
## Ridge Regression 
## 
## 4151 samples
##   20 predictor
## 
## Pre-processing: scaled (83), centered (83) 
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 3735, 3735, 3737, 3737, 3736, 3736, ... 
## Resampling results across tuning parameters:
## 
##   lambda        RMSE      Rsquared   MAE     
##   0.0000000000  25677.22  0.5630299  12141.55
##   0.0001000000  25499.43  0.5684745  12091.12
##   0.0002371374  25496.04  0.5686267  12085.05
##   0.0005623413  25495.10  0.5687259  12083.24
##   0.0013335214  25498.09  0.5687349  12082.25
##   0.0031622777  25507.14  0.5685524  12081.46
##   0.0074989421  25520.81  0.5681257  12079.69
##   0.0177827941  25537.75  0.5675015  12089.34
##   0.0421696503  25574.21  0.5667648  12125.29
##   0.1000000000  25705.24  0.5660945  12214.09
## 
## RMSE was used to select the optimal model using  the smallest value.
## The final value used for the model was lambda = 0.0005623413.
set.seed(4151)
lasso.model.cv <- train(votos ~ ., 
                        data = eleicoes2014.train,
                        method = "lasso",
                        trControl = fitControl,
                        tuneLength = 10,
                        preProcess = c('scale', 'center'))

lasso.model.cv
## The lasso 
## 
## 4151 samples
##   20 predictor
## 
## Pre-processing: scaled (83), centered (83) 
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 3735, 3735, 3737, 3737, 3736, 3736, ... 
## Resampling results across tuning parameters:
## 
##   fraction   RMSE      Rsquared   MAE     
##   0.1000000  25607.12  0.5609974  11529.22
##   0.1888889  25458.22  0.5679476  11865.45
##   0.2777778  25492.11  0.5679536  12003.65
##   0.3666667  25505.68  0.5678757  12059.67
##   0.4555556  25528.46  0.5674453  12092.91
##   0.5444444  25547.14  0.5669537  12104.30
##   0.6333333  25567.79  0.5663208  12111.71
##   0.7222222  25590.54  0.5656239  12118.97
##   0.8111111  25615.73  0.5648606  12126.02
##   0.9000000  25643.31  0.5640335  12133.12
## 
## RMSE was used to select the optimal model using  the smallest value.
## The final value used for the model was fraction = 0.1888889.
set.seed(4151)
knn.model.cv <- train(votos ~ ., 
                        data = eleicoes2014.train,
                        method = "knn",
                        trControl = fitControl,
                        tuneLength = 10,
                        preProcess = c('scale', 'center'))

knn.model.cv
## k-Nearest Neighbors 
## 
## 4151 samples
##   20 predictor
## 
## Pre-processing: scaled (83), centered (83) 
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 3735, 3735, 3737, 3737, 3736, 3736, ... 
## Resampling results across tuning parameters:
## 
##   k   RMSE      Rsquared   MAE     
##    5  28437.87  0.4640478  12344.70
##    7  27977.39  0.4810944  12159.44
##    9  27922.73  0.4839583  12250.86
##   11  27774.44  0.4911181  12187.83
##   13  27726.84  0.4943403  12194.56
##   15  27803.85  0.4931622  12228.07
##   17  27809.33  0.4956835  12288.50
##   19  27986.04  0.4900150  12348.09
##   21  28035.53  0.4905949  12362.54
##   23  28192.01  0.4866251  12456.34
## 
## RMSE was used to select the optimal model using  the smallest value.
## The final value used for the model was k = 13.


Usando a regressão ridge, o lâmbda escolhido foi 0.0005623413, com um RMSE obtido de 25495.10.
Usando a regressão lasso, o fraction escolhido foi 0.1888889, com um RMSE obtido de 25458.22.
Para o modelo KNN, o número K dos melhores vizinhos escolhido foi 13, com um RMSE de 27726.84.

2) Compare os três modelos em termos do erro RMSE de validação cruzada.

Comparando os três modelos, temos que o modelo de regressão lasso apresentou o menor RMSE, enquanto o modelo KNN representou o maior. Obviamente, comparando os melhores casos de cada modelo.

O RMSE é o desvio padrão dos resíduos(erros de predição). Uma pequena introdução a resíduos foi feito no documento anterior. O RMSE geralmente é usado para aferir a qualidade do ajuste de um modelo.

3) Quais as variáveis mais importantes segundo o modelo de regressão Ridge e Lasso? Variáveis foram descartadas pelo Lasso? Quais?

Ridge

set.seed(4151)
ridge.importance <- varImp(ridge.model.cv)$importance

ridge.importance<- data.frame(Names=rownames(ridge.importance),
                              Overall=ridge.importance)

ggplot(ridge.importance, aes(x = reorder(Names, Overall), y=Overall)) +
geom_bar(stat="identity", fill="#CD5C5C", colour="black") +
geom_text(aes(x = Names, y= Overall, h.just=2,label = format(round(Overall, 2), nsmall = 2)), hjust = -.04,  size=2.6) +
labs(title="Importância de variáveis (Regressão Ridge)", y="Importância", x="Variável") +
coord_flip()

Lasso

set.seed(4151)
lasso.importance <- varImp(lasso.model.cv)$importance

lasso.importance<- data.frame(Names=rownames(lasso.importance),
                              Overall=lasso.importance)

ggplot(lasso.importance, aes(x = reorder(Names, Overall), y=Overall)) +
  geom_bar(stat="identity", fill="#CD5C5C", colour="black") +
  geom_text(aes(x = Names, y= Overall, h.just=2,label = format(round(Overall, 2), nsmall = 2)), hjust = -.04,  size=2.6) +
   labs(title="Importância de variáveis (Regressão Lasso)", y="Importância", x="Variável")+
  coord_flip()

Tanto no modelo de regressão ridge quanto no modelo de regressão lasso, as variáveis mais importantes foram, em ordem: quantidade_despesas, quantidade_fornecedores, total receita e total_despesa

Em relação as variaveis descartadas pelo lasso, temos:

set.seed(4151)
predict.lasso <- predict.enet(lasso.model.cv$finalModel, type='coefficients', s=lasso.model.cv$bestTune$fraction, mode='fraction')$coefficients

predict.dataFrame <- as.data.frame(predict.lasso)

variableCoefficient<- data.frame(Names=rownames(predict.dataFrame),
                                          Coeficiente=predict.lasso)

variableCoefficient <- variableCoefficient %>% filter(Coeficiente == 0)

variableCoefficient 
##                          Names Coeficiente
## 1                         UFRJ           0
## 2                   partidoPTB           0
## 3                    partidoSD           0
## 4         recursos_de_partidos           0
## 5 grauENSINO MÃ<U+0089>DIO INCOMPLETO           0

Como pode se ver, as variáveis UFRJ, partidoPTB, recursos_de_partidos e grauENSINO MÉDIO INCOMPLETO foram descartadas do modelo de regressão lasso.

4) Re-treine o melhor modelo (usando os melhores valores de parâmetros encontrados em todos os dados, sem usar validação cruzada).

Utilizando somente o melhor valor de fraction encontrado:

lambdaGrid <- expand.grid(fraction = 0.1888889)

set.seed(4151)
lasso.best.model <- train(votos ~ ., 
                        data = eleicoes2014.train,
                        method = "lasso",
                        tuneGrid = lambdaGrid,
                        preProcess = c('scale', 'center'))
lasso.best.model 
## The lasso 
## 
## 4151 samples
##   20 predictor
## 
## Pre-processing: scaled (83), centered (83) 
## Resampling: Bootstrapped (25 reps) 
## Summary of sample sizes: 4151, 4151, 4151, 4151, 4151, 4151, ... 
## Resampling results:
## 
##   RMSE      Rsquared   MAE     
##   25668.75  0.5562935  12067.65
## 
## Tuning parameter 'fraction' was held constant at a value of 0.1888889

A partir disso obtivemos:
RMSE = 25668.75

Logo, o que se pode notar no nosso experimento, foi que o RMSE deu maior que o RMSE original utilizando validação cruzada.