predicting-votes
predicting-votes
O Problema
O objetivo deste exercício é construir modelos preditivos de regressão utilizando técnicas de regularização e seleção de variáveis para a predição de votos em candidatos a deputados que já exercem a função. Os dados foram divididos em dados de treinos e de teste.
Baixando dados
library(here)
library(dplyr)
library(readr)
train_data = read.csv(here::here("data/kaggle/ceap/train.csv")) %>% na.omit()
test_data = read.csv(here::here("data/kaggle/ceap/test.csv")) %>% na.omit()train_data %>%
glimpse()## Observations: 7,476
## Variables: 24
## $ ano <int> 2006, 2006, 2006, 2006, ...
## $ sequencial_candidato <dbl> 10001, 10002, 10002, 100...
## $ nome <fct> JOSÉ LUIZ NOGUEIRA DE SO...
## $ uf <fct> AP, RO, AP, MS, RO, PI, ...
## $ partido <fct> PT, PT, PT, PRONA, PT, P...
## $ quantidade_doacoes <int> 6, 13, 17, 6, 48, 6, 14,...
## $ quantidade_doadores <int> 6, 13, 16, 6, 48, 6, 7, ...
## $ total_receita <dbl> 16600.00, 22826.00, 1581...
## $ media_receita <dbl> 2766.67, 1755.85, 9301.2...
## $ recursos_de_outros_candidatos.comites <dbl> 0.00, 6625.00, 2250.00, ...
## $ recursos_de_pessoas_fisicas <dbl> 9000.00, 15000.00, 34150...
## $ recursos_de_pessoas_juridicas <dbl> 6300.00, 1000.00, 62220....
## $ recursos_proprios <dbl> 1300.00, 201.00, 59500.0...
## $ recursos_de_partido_politico <dbl> 0, 0, 0, 0, 0, 0, 0, 0, ...
## $ quantidade_despesas <int> 14, 24, 123, 8, 133, 9, ...
## $ quantidade_fornecedores <int> 14, 23, 108, 8, 120, 9, ...
## $ total_despesa <dbl> 16583.60, 20325.99, 1460...
## $ media_despesa <dbl> 1184.54, 846.92, 1187.09...
## $ cargo <fct> DEPUTADO FEDERAL, DEPUTA...
## $ sexo <fct> MASCULINO, FEMININO, FEM...
## $ grau <fct> ENSINO MÉDIO COMPLETO, S...
## $ estado_civil <fct> CASADO(A), SOLTEIRO(A), ...
## $ ocupacao <fct> VEREADOR, SERVIDOR PÚBLI...
## $ votos <int> 8579, 2757, 17428, 1193,...
Pré-processando
Iremos aplicar as seguintes transformações para ambos dados de treino e teste.
Temos algumas variáveis categóricas. Vamos transformá-las.
genre_cat_to_id = function(m_genre) {
return(ifelse(m_genre == "MASCULINO", 0, 1))
}
categoric_to_id = function(data) {
require(dplyr)
return(data %>%
mutate(sexo = genre_cat_to_id(sexo),
grau = as.integer(as.factor(grau)),
estado_civil = as.integer(as.factor(estado_civil)),
ocupacao = as.integer(as.factor(ocupacao)),
partido = as.integer(as.factor(partido)),
uf = as.integer(as.factor(uf))))
}
train_data = train_data %>% categoric_to_id
test_data = test_data %>% categoric_to_idIremos retirar as variáveis cargo, pois ela é igual para todas as observações. Também iremos remover nome e sequencial candidato, pois são pouco relevantes.
remove_irrelevante_features = function(data) {
require(dplyr)
return(data %>%
select(-c(cargo, nome, sequencial_candidato)))
}
# But we will save this colum for make predictions later
ID = test_data$sequencial_candidato
train_data = train_data %>% remove_irrelevante_features
test_data = test_data %>% remove_irrelevante_featuresVisualizando o comportamento dos dados de treino:
plot_data_distribution = function(data) {
require(reshape2)
require(ggplot2)
require(scales)
reshaped_data =
reshape2::melt(data)
plot =
ggplot(reshaped_data, aes(x = value)) +
facet_wrap(~variable, scales = "free") +
geom_histogram() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
return(plot)
}
plot_data_distribution(train_data)Transformação dos dados a fim de encontrar uma distribuição normal (exceto da variávle independente, votos).
to_log = function(x) {
transformed = (x ** 2) %>% sqrt() %>% log()
returned = ifelse(transformed == -Inf, x,
ifelse(transformed == Inf, x, transformed))
return(returned)
}
train_data = train_data %>%
mutate(
quantidade_doacoes = to_log(quantidade_doacoes),
quantidade_doadores = to_log(quantidade_doadores),
total_receita = to_log(total_receita),
media_receita = to_log(media_receita),
recursos_de_outros_candidatos.comites = to_log(recursos_de_outros_candidatos.comites),
recursos_de_pessoas_fisicas = to_log(recursos_de_pessoas_fisicas),
recursos_de_pessoas_juridicas = to_log(recursos_de_pessoas_juridicas),
recursos_proprios = to_log(recursos_proprios),
recursos_de_partido_politico = to_log(recursos_de_partido_politico),
quantidade_despesas = to_log(quantidade_despesas),
quantidade_fornecedores = to_log(quantidade_fornecedores),
total_despesa = to_log(total_despesa),
media_despesa = to_log(media_despesa))
train_data = train_data %>% na.omit()plot_data_distribution(train_data)Tuanando modelos (usando validação cruzada)
Será utilizado o pacote caret, que implementa funções para tunar modelos usando o método Ridge, Lasso ou outros. Será utilizada uma validação cruzada 10-fold.
Modelo de regressão Ridge
A grande vantagem do método Ridge é que através dele podemos diminuir a variância do modelo ao custo de um pequeno aumento no bias. O método ridge tende a aproximar a 0 os coeficientes das variáveis preditoras, conforme o lambda aumenta. Isso diminui a flexibilidade do modelo, diminuindo também a variância, porém aumentando o bias. A ideia por trás da regressão Ridge é encontrar um lambda que gere um trade-off satisfatório entre bias e Variância.
Treinando:
library(caret)
fit_control = trainControl(method = "cv", number = 10)
# Tunando o hiperparâmetro lambda para penalização dos coeficientes
lambda_grid = expand.grid(lambda = 10^seq(10, -2, length=100))
model.ridge = train(votos ~ .,
data = train_data,
trControl = fit_control,
tuneGrid = lambda_grid,
method = "ridge",
metric="RMSE",
tuneLength = 100,
importance = TRUE,
preProcess = c("scale", "center"),
na.action = na.omit)Avaliando treino
model.ridge## Ridge Regression
##
## 7476 samples
## 20 predictors
##
## Pre-processing: scaled (20), centered (20)
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 6728, 6728, 6729, 6729, 6729, 6729, ...
## Resampling results across tuning parameters:
##
## lambda RMSE Rsquared MAE
## 1.000000e-02 36096.78 0.4229922 20023.43
## 1.321941e-02 36098.15 0.4229960 20043.38
## 1.747528e-02 36100.34 0.4229968 20070.20
## 2.310130e-02 36103.78 0.4229935 20106.23
## 3.053856e-02 36109.26 0.4229838 20154.90
## 4.037017e-02 36118.08 0.4229630 20220.76
## 5.336699e-02 36132.46 0.4229234 20310.12
## 7.054802e-02 36156.15 0.4228523 20431.68
## 9.326033e-02 36195.48 0.4227309 20597.16
## 1.232847e-01 36261.13 0.4225322 20824.19
## 1.629751e-01 36370.92 0.4222208 21140.21
## 2.154435e-01 36554.38 0.4217529 21581.60
## 2.848036e-01 36859.69 0.4210804 22215.61
## 3.764936e-01 37363.67 0.4201567 23110.24
## 4.977024e-01 38184.57 0.4189471 24352.29
## 6.579332e-01 39495.25 0.4174402 26100.43
## 8.697490e-01 41530.52 0.4156571 28556.53
## 1.149757e+00 44578.91 0.4136554 31899.94
## 1.519911e+00 48950.58 0.4115225 36373.45
## 2.009233e+00 54922.45 0.4093614 42179.78
## 2.656088e+00 62674.12 0.4072725 49444.45
## 3.511192e+00 72232.70 0.4053378 58106.47
## 4.641589e+00 83440.49 0.4036121 68052.71
## 6.135907e+00 95953.87 0.4021220 79015.88
## 8.111308e+00 109277.17 0.4008697 90587.54
## 1.072267e+01 122828.95 0.3998406 102266.92
## 1.417474e+01 136027.31 0.3990103 113580.05
## 1.873817e+01 148372.00 0.3983499 124117.70
## 2.477076e+01 159501.69 0.3978306 133604.91
## 3.274549e+01 169214.91 0.3974260 141865.11
## 4.328761e+01 177457.46 0.3971129 148860.69
## 5.722368e+01 184288.70 0.3968719 154649.26
## 7.564633e+01 189840.98 0.3966872 159350.12
## 1.000000e+02 194283.05 0.3965461 163107.81
## 1.321941e+02 197792.35 0.3964385 166074.42
## 1.747528e+02 200537.28 0.3963566 168394.11
## 2.310130e+02 202667.70 0.3962945 170194.06
## 3.053856e+02 204311.23 0.3962473 171582.27
## 4.037017e+02 205573.25 0.3962115 172648.03
## 5.336699e+02 206538.86 0.3961843 173463.60
## 7.054802e+02 207275.68 0.3961638 174085.86
## 9.326033e+02 207836.73 0.3961482 174559.66
## 1.232847e+03 208263.26 0.3961364 174919.85
## 1.629751e+03 208587.15 0.3961275 175193.34
## 2.154435e+03 208832.85 0.3961208 175400.82
## 2.848036e+03 209019.13 0.3961156 175558.10
## 3.764936e+03 209160.27 0.3961118 175677.28
## 4.977024e+03 209267.17 0.3961089 175767.54
## 6.579332e+03 209348.11 0.3961066 175835.88
## 8.697490e+03 209409.39 0.3961050 175887.61
## 1.149757e+04 209455.76 0.3961037 175926.77
## 1.519911e+04 209490.86 0.3961027 175956.40
## 2.009233e+04 209517.42 0.3961020 175978.82
## 2.656088e+04 209537.51 0.3961015 175995.79
## 3.511192e+04 209552.71 0.3961011 176008.63
## 4.641589e+04 209564.22 0.3961007 176018.34
## 6.135907e+04 209572.92 0.3961005 176025.68
## 8.111308e+04 209579.50 0.3961003 176031.24
## 1.072267e+05 209584.48 0.3961002 176035.45
## 1.417474e+05 209588.25 0.3961001 176038.63
## 1.873817e+05 209591.10 0.3961000 176041.03
## 2.477076e+05 209593.26 0.3960999 176042.85
## 3.274549e+05 209594.89 0.3960999 176044.23
## 4.328761e+05 209596.12 0.3960999 176045.27
## 5.722368e+05 209597.05 0.3960998 176046.06
## 7.564633e+05 209597.76 0.3960998 176046.66
## 1.000000e+06 209598.29 0.3960998 176047.11
## 1.321941e+06 209598.70 0.3960998 176047.45
## 1.747528e+06 209599.00 0.3960998 176047.71
## 2.310130e+06 209599.24 0.3960998 176047.90
## 3.053856e+06 209599.41 0.3960998 176048.05
## 4.037017e+06 209599.54 0.3960998 176048.16
## 5.336699e+06 209599.64 0.3960998 176048.25
## 7.054802e+06 209599.72 0.3960998 176048.31
## 9.326033e+06 209599.78 0.3960998 176048.36
## 1.232847e+07 209599.82 0.3960998 176048.40
## 1.629751e+07 209599.85 0.3960998 176048.42
## 2.154435e+07 209599.88 0.3960998 176048.44
## 2.848036e+07 209599.90 0.3960998 176048.46
## 3.764936e+07 209599.91 0.3960998 176048.47
## 4.977024e+07 209599.92 0.3960998 176048.48
## 6.579332e+07 209599.93 0.3960998 176048.49
## 8.697490e+07 209599.93 0.3960998 176048.49
## 1.149757e+08 209599.94 0.3960998 176048.50
## 1.519911e+08 209599.94 0.3960998 176048.50
## 2.009233e+08 209599.95 0.3960998 176048.50
## 2.656088e+08 209599.95 0.3960998 176048.50
## 3.511192e+08 209599.95 0.3960998 176048.51
## 4.641589e+08 209599.95 0.3960998 176048.51
## 6.135907e+08 209599.95 0.3960998 176048.51
## 8.111308e+08 209599.95 0.3960998 176048.51
## 1.072267e+09 209599.95 0.3960998 176048.51
## 1.417474e+09 209599.95 0.3960998 176048.51
## 1.873817e+09 209599.95 0.3960998 176048.51
## 2.477076e+09 209599.95 0.3960998 176048.51
## 3.274549e+09 209599.95 0.3960998 176048.51
## 4.328761e+09 209599.95 0.3960998 176048.51
## 5.722368e+09 209599.95 0.3960998 176048.51
## 7.564633e+09 209599.95 0.3960998 176048.51
## 1.000000e+10 209599.95 0.3960998 176048.51
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was lambda = 0.01.
plot(model.ridge, xlab = "Lambda", ylab = "RMSE")O melhor modelo gerado, levando em consideração o modelo que apresentou menor RMSE, foi o modelo cujo lambda é 0.1. Seu RMSE foi igual a ~36381.63 e seu R² foi igual a ~0.4162627 para o treinamento. Salienta-se que esses valores podem variar um pouco a cada vez que o modelo é treinado.
Modelo de Regressão Lasso
O método Lasso é uma recente alternativa ao método Ridge. A desvantagem da Ridge é que ela utiliza todas as variáveis. Nele, embora coeficientes tendam a se aproximar de 0, todos são utilizados. No método Lasso, alguns coeficientes são forçados a redução à exatamente 0, e isso significa que podemos descartar algumas variáveis. Essa é a grande vantagem do método Lasso em detrimento do método Ridge.
require(caret)
# Tunando o hiperparâmetro lambda para penalização dos coeficientes
lambda_grid = expand.grid(fraction = seq(.001, .1, length = 100))
model.lasso = train(votos ~ .,
data = train_data,
method = "lasso",
trControl = fit_control,
tuneGrid = lambda_grid,
tuneLength = 100,
metric="RMSE",
preProcess = c("scale", "center"),
na.action = na.omit)Avaliando treino
model.lasso## The lasso
##
## 7476 samples
## 20 predictors
##
## Pre-processing: scaled (20), centered (20)
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 6728, 6728, 6728, 6728, 6730, 6728, ...
## Resampling results across tuning parameters:
##
## fraction RMSE Rsquared MAE
## 0.001 38346.59 0.4080247 20560.67
## 0.002 36218.04 0.4220127 19637.25
## 0.003 36014.17 0.4247924 19912.59
## 0.004 36098.69 0.4223266 20009.73
## 0.005 36231.37 0.4192230 20021.99
## 0.006 36384.57 0.4159841 20033.51
## 0.007 36555.93 0.4127360 20044.83
## 0.008 36742.18 0.4096051 20055.36
## 0.009 36941.08 0.4066541 20065.74
## 0.010 37150.69 0.4039181 20076.12
## 0.011 37369.32 0.4014118 20086.49
## 0.012 37595.60 0.3991351 20096.87
## 0.013 37828.36 0.3970785 20107.24
## 0.014 38066.65 0.3952270 20117.62
## 0.015 38309.67 0.3935635 20128.00
## 0.016 38556.76 0.3920699 20138.37
## 0.017 38807.36 0.3907288 20148.75
## 0.018 39061.01 0.3895235 20159.13
## 0.019 39317.34 0.3884392 20169.50
## 0.020 39575.99 0.3874619 20179.88
## 0.021 39836.71 0.3865797 20190.25
## 0.022 40099.24 0.3857817 20200.63
## 0.023 40363.39 0.3850584 20211.01
## 0.024 40628.98 0.3844014 20221.38
## 0.025 40895.86 0.3838034 20231.76
## 0.026 41163.89 0.3832578 20242.14
## 0.027 41432.96 0.3827591 20252.51
## 0.028 41702.97 0.3823023 20262.89
## 0.029 41973.83 0.3818829 20273.26
## 0.030 42245.47 0.3814972 20283.64
## 0.031 42517.81 0.3811417 20294.02
## 0.032 42790.80 0.3808135 20304.39
## 0.033 43064.38 0.3805099 20314.77
## 0.034 43338.50 0.3802286 20325.14
## 0.035 43613.11 0.3799674 20335.52
## 0.036 43888.19 0.3797246 20345.90
## 0.037 44163.69 0.3794985 20356.27
## 0.038 44439.59 0.3792876 20366.65
## 0.039 44715.84 0.3790906 20377.03
## 0.040 44992.44 0.3789063 20387.40
## 0.041 45269.35 0.3787336 20397.78
## 0.042 45546.55 0.3785716 20408.15
## 0.043 45824.03 0.3784195 20418.53
## 0.044 46101.77 0.3782764 20428.91
## 0.045 46379.74 0.3781417 20439.28
## 0.046 46657.94 0.3780147 20449.66
## 0.047 46936.34 0.3778948 20460.03
## 0.048 47214.95 0.3777816 20470.41
## 0.049 47493.74 0.3776745 20480.79
## 0.050 47772.71 0.3775730 20491.16
## 0.051 48051.84 0.3774769 20501.54
## 0.052 48331.13 0.3773857 20511.92
## 0.053 48610.57 0.3772991 20522.29
## 0.054 48890.15 0.3772168 20532.67
## 0.055 49169.86 0.3771385 20543.04
## 0.056 49449.69 0.3770640 20553.42
## 0.057 49729.65 0.3769930 20563.80
## 0.058 50009.71 0.3769252 20574.17
## 0.059 50289.89 0.3768606 20584.55
## 0.060 50570.17 0.3767989 20594.93
## 0.061 50850.54 0.3767399 20605.30
## 0.062 51131.01 0.3766834 20615.68
## 0.063 51411.56 0.3766294 20626.05
## 0.064 51692.20 0.3765777 20636.43
## 0.065 51972.92 0.3765281 20646.81
## 0.066 52253.72 0.3764805 20657.18
## 0.067 52534.59 0.3764349 20667.56
## 0.068 52815.53 0.3763911 20677.93
## 0.069 53096.54 0.3763490 20688.31
## 0.070 53377.61 0.3763085 20698.69
## 0.071 53658.74 0.3762696 20709.06
## 0.072 53939.94 0.3762322 20719.44
## 0.073 54221.19 0.3761961 20729.82
## 0.074 54502.49 0.3761614 20740.19
## 0.075 54783.85 0.3761279 20750.57
## 0.076 55065.26 0.3760956 20760.94
## 0.077 55346.71 0.3760644 20771.32
## 0.078 55628.22 0.3760343 20781.70
## 0.079 55909.77 0.3760053 20792.07
## 0.080 56191.36 0.3759772 20802.45
## 0.081 56472.99 0.3759501 20812.83
## 0.082 56754.66 0.3759239 20823.20
## 0.083 57036.38 0.3758985 20833.58
## 0.084 57318.13 0.3758740 20843.95
## 0.085 57599.91 0.3758502 20854.33
## 0.086 57881.73 0.3758272 20864.71
## 0.087 58163.59 0.3758049 20875.08
## 0.088 58445.47 0.3757833 20885.46
## 0.089 58727.39 0.3757623 20895.83
## 0.090 59009.34 0.3757420 20906.21
## 0.091 59291.32 0.3757222 20916.59
## 0.092 59573.32 0.3757031 20926.96
## 0.093 59855.36 0.3756845 20937.34
## 0.094 60137.42 0.3756664 20947.72
## 0.095 60419.50 0.3756489 20958.09
## 0.096 60701.62 0.3756318 20968.47
## 0.097 60983.75 0.3756152 20978.84
## 0.098 61265.91 0.3755991 20989.22
## 0.099 61548.09 0.3755834 20999.60
## 0.100 61830.30 0.3755682 21009.97
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was fraction = 0.003.
plot(model.lasso, xlab = "Lambda", ylab = "RMSE")Dado o treinamento, o melhor hiperparâmetro, igual a lambda = ~0.003, nos fornece um modelo cujo RMSE é igual a ~36303.01 e um R² igual a ~0.4164779.
Modelo KNN
n_neighbors_grid = expand.grid(k = seq(1, 100, length=100))
model.knn = train(votos ~ .,
data = train_data,
method = "knn",
trControl = fit_control,
tuneGrid = n_neighbors_grid,
tuneLength = 100,
preProcess = c('scale', 'center'),
na.action = na.omit)Avaliando treino
model.knn ## k-Nearest Neighbors
##
## 7476 samples
## 20 predictors
##
## Pre-processing: scaled (20), centered (20)
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 6729, 6728, 6728, 6728, 6728, 6728, ...
## Resampling results across tuning parameters:
##
## k RMSE Rsquared MAE
## 1 43596.14 0.3446189 16258.82
## 2 37196.55 0.4382635 14115.36
## 3 35426.36 0.4691618 13493.44
## 4 34230.46 0.4935022 13099.84
## 5 33504.06 0.5094863 12803.34
## 6 33197.41 0.5160674 12665.47
## 7 32952.30 0.5223754 12552.22
## 8 32868.61 0.5247624 12489.86
## 9 32718.63 0.5293858 12412.61
## 10 32569.21 0.5330498 12390.95
## 11 32642.25 0.5315065 12426.23
## 12 32514.09 0.5353213 12320.85
## 13 32339.73 0.5405217 12303.34
## 14 32280.71 0.5423177 12231.86
## 15 32243.50 0.5436177 12222.59
## 16 32201.51 0.5447403 12205.92
## 17 32259.73 0.5426365 12213.16
## 18 32223.05 0.5434304 12183.64
## 19 32200.83 0.5441251 12169.44
## 20 32178.47 0.5448922 12167.98
## 21 32192.57 0.5447904 12186.25
## 22 32249.26 0.5432951 12202.28
## 23 32294.09 0.5422059 12191.36
## 24 32275.41 0.5428266 12167.54
## 25 32207.56 0.5449647 12127.21
## 26 32193.18 0.5456484 12087.35
## 27 32193.11 0.5455056 12087.10
## 28 32214.42 0.5446567 12108.94
## 29 32191.33 0.5454654 12104.50
## 30 32206.07 0.5450752 12110.99
## 31 32207.60 0.5451195 12105.59
## 32 32196.77 0.5455009 12086.59
## 33 32167.98 0.5460718 12077.53
## 34 32147.59 0.5467682 12055.37
## 35 32141.27 0.5470077 12050.26
## 36 32102.06 0.5482414 12032.02
## 37 32088.14 0.5486835 12023.98
## 38 32094.10 0.5485554 12024.04
## 39 32081.52 0.5489742 12007.17
## 40 32077.49 0.5492937 11995.45
## 41 32080.30 0.5493186 11983.15
## 42 32060.45 0.5500007 11962.15
## 43 32074.43 0.5496041 11969.66
## 44 32079.27 0.5495835 11968.16
## 45 32072.20 0.5498489 11965.60
## 46 32094.78 0.5492567 11972.28
## 47 32090.61 0.5494164 11964.20
## 48 32113.35 0.5488631 11968.96
## 49 32112.74 0.5489424 11968.03
## 50 32106.68 0.5491753 11963.40
## 51 32107.56 0.5491824 11963.35
## 52 32118.03 0.5488113 11954.72
## 53 32120.06 0.5488016 11960.62
## 54 32134.33 0.5485312 11959.22
## 55 32153.78 0.5479087 11967.18
## 56 32145.26 0.5481064 11973.66
## 57 32156.62 0.5478029 11975.60
## 58 32156.43 0.5478803 11966.61
## 59 32168.04 0.5476266 11960.02
## 60 32176.81 0.5473897 11965.05
## 61 32183.24 0.5472317 11961.78
## 62 32192.03 0.5470149 11965.36
## 63 32187.32 0.5472429 11959.26
## 64 32179.79 0.5476028 11952.80
## 65 32204.12 0.5468539 11961.69
## 66 32195.94 0.5471938 11956.88
## 67 32185.69 0.5475513 11961.93
## 68 32188.33 0.5475365 11967.41
## 69 32187.49 0.5476132 11968.77
## 70 32190.68 0.5475891 11972.33
## 71 32196.39 0.5475162 11975.48
## 72 32181.78 0.5480151 11973.23
## 73 32183.07 0.5480428 11972.16
## 74 32197.34 0.5477142 11976.65
## 75 32194.39 0.5478182 11977.43
## 76 32202.24 0.5476467 11980.67
## 77 32201.55 0.5478118 11972.48
## 78 32187.69 0.5482686 11972.78
## 79 32192.90 0.5481760 11972.60
## 80 32179.22 0.5486758 11965.65
## 81 32183.35 0.5485318 11972.25
## 82 32177.37 0.5487386 11972.05
## 83 32179.59 0.5487545 11976.48
## 84 32170.00 0.5491163 11977.58
## 85 32179.43 0.5488365 11973.98
## 86 32180.11 0.5488736 11974.23
## 87 32191.86 0.5486006 11981.48
## 88 32188.08 0.5488540 11974.70
## 89 32198.24 0.5486215 11975.83
## 90 32208.05 0.5483868 11981.85
## 91 32211.08 0.5483671 11979.74
## 92 32195.08 0.5488883 11973.48
## 93 32209.25 0.5485167 11977.70
## 94 32215.70 0.5483640 11981.55
## 95 32222.87 0.5481633 11985.25
## 96 32230.13 0.5479607 11982.52
## 97 32217.85 0.5483822 11976.47
## 98 32226.06 0.5482013 11978.79
## 99 32235.68 0.5479602 11984.35
## 100 32239.25 0.5479244 11984.28
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 42.
plot(model.knn, xlab = "k", ylab = "RMSE")O melhor valor para o número de vizinhos, dentre os testados (de 1 a 100 vizinhos), considerado é de aproximadamente 15. O RSME foi a métrica considerada para comparar os resultados para cada um dos cem. O modelo possui RSME ~32058.39, com R² ~0.5499967. Observe que a partir de 15 os valores para RSME se tornam muito próximos. Nesse sentido, pode ocorrer a seguinte situação: o número ideal de vizinhos ser (exemplo) 60, contudo a diferença entre o O RSME de 60 e de 15 ser muito pequena.
Comparando modelos
Vamos comparar os modelos em termos de RSME. Cada um deles obteve o seguinte valor de RSME:
- Ridge: ~36381.63
- Lassi: ~36303.01
- KNN: ~32295.31.
Portanto o modelo KNN (considerando 42 vizinhos) obteve o melhor resultado! :)
Quais as variáveis mais importantes segundo o modelo de regressão Ridge e Lasso?
Por importância de uma feature, podemos entender como a dificuldade do método em diminuir o peso ou desconsiderar a feature, sendo um valor variável entre 0 e 100, e considerando features com valores maiores como mais importantes.
plot_var_imp = function(model) {
require(ggplot2)
return(ggplot(varImp(model)) +
geom_bar(stat="identity", fill="#AD1457", colour="#880E4F") +
labs(title="Importância de variáveis (Lasso)", y="Importância", x="Variável"))
}Modelo Ridge
plot_var_imp(model.ridge)Como pode ser visto no gráfico, o modelo Ridge considerou as seguintes três variáveis como as mais importantes:
- total_despesa
- total_receita
- recursos_de_pessoas_jurídicas
Por outro lado, as seguintes features tiveram pouca importância para o modelo: - grau - ocupacao - partido - sexo - uf - ano
Lasso
plot_var_imp(model.lasso)O modelo Lasso obteve o mesmo resultado do modelo Ridge. No entando, o que é importanto de observar nesse modelo é que a variável ano foi descartada.
Re-treine o melhor modelo (sem validação cruzada)
O melhor modelo encontrado foi o do método KNN, para um valor k de vizinho entre 15 e 100.
best.model = train(votos ~ .,
data = train_data,
method = "knn",
na.action = na.omit,
tuneGrid = data.frame(k = 15),
preProcess = c('scale', 'center'))best.model## k-Nearest Neighbors
##
## 7476 samples
## 20 predictors
##
## Pre-processing: scaled (20), centered (20)
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 7476, 7476, 7476, 7476, 7476, 7476, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 34514.25 0.4898974 12578.31
##
## Tuning parameter 'k' was held constant at a value of 15
Prevendo votos…
Vamos usar nosso último modelo para prever quantidade de votos! :)
predictions = predict(best.model, test_data)
submission = data.frame(ID = as.character(ID), votos = predictions)
write.csv(submission, "submission.csv", row.names = F)
submission %>%
glimpse()## Observations: 4,598
## Variables: 2
## $ ID <fct> 10000000135, 10000000142, 10000000158, 10000000161, 1000...
## $ votos <dbl> 136449.1, 126671.4, 142032.9, 156745.8, 140915.9, 111476...