knitr::opts_chunk$set(cache=F, echo = TRUE, set.seed(4151), message=FALSE, warning=FALSE)
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).
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.
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.
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.
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()
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.
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.
Infelizmente o último modelo não foi satisfatório no desafio. Por isso o modelo utilizado foi um modelo pls utilizando 12-fold cross-validation. Foram feitos vários testes, porém, o modelo em questão foi o “vencedor”. Mais informações sobre pls na seção bibliografia.
set.seed(4151)
pls.submission.cv <- train(votos ~ .,
data = eleicoes2014.train,
method = "pls",
trControl = fitControl <- trainControl(method = "cv", number =12),
tuneLength = 10,
preProcess = c('scale', 'center'))
kaggle.pred.lasso <- predict(pls.submission.cv, eleicoes2014.test, ncomp=15)
submission.lasso <- data.frame(ID = eleicoes2014.test$ID, votos = abs(kaggle.pred.lasso))
write.csv(submission.lasso, "submissionlasso.csv", row.names = FALSE)