O objetivo desse checkpoint é construir modelos preditivos de regressão para a predição de votação de candidatos à Câmara Federal de Deputados.
Antes de tudo, iremos importar os dados de treino e teste:
train = importa_eleicao("train.csv")
test = importa_eleicao("test.csv")
Nessa parte inicial, optei por retirar algumas variáveis contidas na base de dados afim de faciltar a criação dos modelos posteriormente.
train <- train %>%
select(-cargo,
-sequencial_candidato,
-ocupacao,
-uf,
-nome)
modelo_ridge <- train(votos ~ .,
data = train,
method = "ridge")
modelo_lasso <- train(votos ~ .,
data = train,
method = "lasso")
modelo_knn <- train(votos ~ .,
data = train,
method = "knn")
modelo_ridge
## Ridge Regression
##
## 7476 samples
## 18 predictors
##
## No pre-processing
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 7476, 7476, 7476, 7476, 7476, 7476, ...
## Resampling results across tuning parameters:
##
## lambda RMSE Rsquared MAE
## 0e+00 8.844462e+12 0.2984072 1.723877e+11
## 1e-04 3.964234e+04 0.3777695 1.640843e+04
## 1e-01 4.021715e+04 0.3724965 1.638444e+04
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was lambda = 1e-04.
modelo_lasso
## The lasso
##
## 7476 samples
## 18 predictors
##
## No pre-processing
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 7476, 7476, 7476, 7476, 7476, 7476, ...
## Resampling results across tuning parameters:
##
## fraction RMSE Rsquared MAE
## 0.1 40011.60 0.3658536 17281.49
## 0.5 47866.01 0.3462689 16733.67
## 0.9 56690.42 0.3412130 16931.11
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was fraction = 0.1.
modelo_knn
## k-Nearest Neighbors
##
## 7476 samples
## 18 predictors
##
## No pre-processing
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 7476, 7476, 7476, 7476, 7476, 7476, ...
## Resampling results across tuning parameters:
##
## k RMSE Rsquared MAE
## 5 36188.35 0.4388912 13769.85
## 7 34905.95 0.4637648 13295.12
## 9 34086.40 0.4814088 13024.89
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 9.
Para ficar mais fácil a observação dos valores mínimos, é mais intuitivo observar da seguinte forma:
min(modelo_ridge$results$RMSE)
## [1] 39642.34
min(modelo_lasso$results$RMSE)
## [1] 40011.6
min(modelo_knn$results$RMSE)
## [1] 34086.4
Dessa forma, podemos observar o modelo feito com o knn teve o menor resultado para o RMSE e o mais alto foi o método feito pelo lasso.
ggplot(varImp(modelo_ridge)) +
geom_col(fill = "#F08080") +
labs(title = "Importância das variáveis do modelo Ridge",
y = "Importância",
x = "Variável(is)")
ggplot(varImp(modelo_lasso)) +
geom_col(fill = "#FFA07A") +
labs(title = "Importância das variáveis do modelo Lasso",
y = "Importância",
x = "Variável(is)")
ggplot(varImp(modelo_knn)) +
geom_col(fill = "#F4A460") +
labs(title = "Importância das variáveis do modelo Knn",
y = "Importância",
x = "Variável(is)")
A partir das visualizações acima, podemos observar que as seguintes variáveis tem um menor nível de importância para o modelo:
Obs.: o critério de seleção das variáveis menos importantes se deu pelo nível de importância zero.
Dessa forma, utilizei total_receita, total_despesa, recursos_de_pessoas_juridicas, recursos_de_pessoas_fisicas, quantidade_fornecedores, quantidade_despesas, media_receita, recursos_de_partido_politico, quantidade_doadores, quantidade_doacoes, grau, estado_civil, partido, sexo e ano, deixando o modelo mais enxuto e possibilitando a construção de um novo modelo com menos variáveis e mais representativo.
Para formar um novo modelo, selecionei as variáveis com maior nível de importância de acordo com os resultados vistos acima e criei um novo dataframe.
modelo_select <- train %>%
select(-media_despesa,
-recursos_de_outros_candidatos.comites,
-recursos_proprios)
modelo_select_knn <- train(votos ~ .,
data = modelo_select,
method = "knn")
modelo_select_knn
## k-Nearest Neighbors
##
## 7476 samples
## 15 predictors
##
## No pre-processing
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 7476, 7476, 7476, 7476, 7476, 7476, ...
## Resampling results across tuning parameters:
##
## k RMSE Rsquared MAE
## 5 38957.94 0.3936298 14217.56
## 7 37015.82 0.4328611 13649.16
## 9 36363.75 0.4466227 13390.30
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 9.
Da mesma forma do modelo anterior, é mais intuitivo observar o valor mínimo do RMSE abaixo:
min(modelo_select_knn$results$RMSE)
## [1] 36363.75
Podemos observar dessa vez que o valor do RMSE aumentou em comparação ao modelo com todas as variáveis.
submissao <- test %>%
select(sequencial_candidato)
test <- test %>%
select(-cargo,
-sequencial_candidato,
-ocupacao,
-uf,
-nome)
predicao <- predict(modelo_select_knn, test)
submissao$votos <- predicao
submissao <- submissao %>%
select(ID = sequencial_candidato,
votos = votos)
write.csv(x = submissao,
file = "../data/sample_submission.csv",
row.names = FALSE)