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_id

Iremos 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_features

Visualizando 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...

Ítalo Batista

7 de outubro de 2018