Carregando e ajustando os dados:

train <- read.csv("./data/train.csv", encoding="UTF-8")
test <- read.csv("./data/test.csv", encoding="UTF-8")
submission <- read.csv("./data/sample_submission.csv")

1. Usando todas as variáveis disponíveis, tune (usando validação cruzada):

# K-fold cross-validation -> 10-fold CV
fitControl <- trainControl(method = "cv",
                    number = 5,
                    search= "random")

lambdaGrid <- expand.grid(lambda = 10^seq(2, -10, length=30))
fractionGrid <- expand.grid(fraction = seq(0.001, 1, length = 30))
neighborsGrid <- expand.grid(k = seq(1, 30, length=30))

# Removendo variáveis nao importantes

trainDadosFiltrados <- train %>% select(-nome, -uf, -estado_civil, -partido, -ocupacao, -ano, -cargo, -grau, -sexo, -sequencial_candidato)
testDadosFiltrados <- test %>% select(-nome, -uf, -estado_civil, -partido, -ocupacao, -ano, -cargo, -grau, -sexo, -sequencial_candidato)

i) Modelo de regressão Ridge

modelRidge <- train(votos ~ .,
          data = trainDadosFiltrados,
          method = "ridge",
          trControl = fitControl,
          preProcess = c('scale', 'center'),
          tuneGrid = lambdaGrid,
          na.action = na.omit)

modelRidge
## Ridge Regression 
## 
## 7476 samples
##   13 predictor
## 
## Pre-processing: scaled (13), centered (13) 
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 5980, 5981, 5981, 5981, 5981 
## Resampling results across tuning parameters:
## 
##   lambda        RMSE       Rsquared   MAE     
##   1.000000e-10   41081.19  0.3636260  16997.49
##   2.592944e-10   41080.60  0.3636289  16997.17
##   6.723358e-10   41080.20  0.3636307  16996.97
##   1.743329e-09   41079.99  0.3636316  16996.86
##   4.520354e-09   41079.90  0.3636320  16996.81
##   1.172102e-08   41079.87  0.3636322  16996.80
##   3.039195e-08   41079.85  0.3636322  16996.79
##   7.880463e-08   41079.85  0.3636323  16996.79
##   2.043360e-07   41079.85  0.3636323  16996.79
##   5.298317e-07   41079.85  0.3636325  16996.78
##   1.373824e-06   41079.85  0.3636327  16996.78
##   3.562248e-06   41079.85  0.3636335  16996.78
##   9.236709e-06   41079.87  0.3636355  16996.77
##   2.395027e-05   41079.91  0.3636405  16996.76
##   6.210169e-05   41080.01  0.3636533  16996.71
##   1.610262e-04   41080.35  0.3636848  16996.61
##   4.175319e-04   41081.60  0.3637562  16996.69
##   1.082637e-03   41086.67  0.3638881  16996.88
##   2.807216e-03   41106.62  0.3640177  16997.44
##   7.278954e-03   41170.59  0.3638325  16997.59
##   1.887392e-02   41322.01  0.3629811  16986.41
##   4.893901e-02   41619.31  0.3617815  16915.36
##   1.268961e-01   42261.09  0.3606801  16674.35
##   3.290345e-01   43970.39  0.3590469  16126.85
##   8.531679e-01   49187.74  0.3563930  15646.46
##   2.212216e+00   63909.36  0.3538138  21539.67
##   5.736153e+00   91866.79  0.3521251  35977.08
##   1.487352e+01  123210.39  0.3512363  51814.93
##   3.856620e+01  145353.80  0.3508313  62921.55
##   1.000000e+02  156804.77  0.3506626  68679.50
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was lambda = 5.298317e-07.

ii) Modelo de regressão Lasso

modelLasso <- train(votos ~ ., 
                    data = trainDadosFiltrados, 
                    method = "lasso", 
                    trControl = fitControl,
                    tuneGrid = fractionGrid,
                    na.action = na.omit)
modelLasso
## The lasso 
## 
## 7476 samples
##   13 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 5980, 5981, 5981, 5980, 5982 
## Resampling results across tuning parameters:
## 
##   fraction    RMSE       Rsquared   MAE     
##   0.00100000   39181.34  0.3855045  17269.69
##   0.03544828   39723.65  0.3837515  17042.98
##   0.06989655   41432.80  0.3707679  17127.85
##   0.10434483   43759.39  0.3595941  17212.71
##   0.13879310   46433.38  0.3518258  17297.58
##   0.17324138   49306.28  0.3466797  17382.45
##   0.20768966   52299.20  0.3432394  17467.33
##   0.24213793   55368.65  0.3408772  17552.20
##   0.27658621   58489.37  0.3392053  17637.07
##   0.31103448   61645.89  0.3379874  17721.95
##   0.34548276   64828.30  0.3370768  17806.82
##   0.37993103   68030.01  0.3363802  17891.69
##   0.41437931   71246.44  0.3358364  17976.57
##   0.44882759   74474.37  0.3354044  18061.44
##   0.48327586   77711.42  0.3350559  18146.31
##   0.51772414   80955.84  0.3347707  18231.19
##   0.55217241   84206.29  0.3345346  18316.06
##   0.58662069   87461.73  0.3343369  18400.94
##   0.62106897   90721.36  0.3341698  18485.81
##   0.65551724   93984.53  0.3340274  18570.68
##   0.68996552   97250.71  0.3339049  18655.63
##   0.72441379  100519.49  0.3337989  18740.89
##   0.75886207  103790.52  0.3337065  18826.14
##   0.79331034  107063.50  0.3336255  18911.67
##   0.82775862  110338.21  0.3335542  18997.31
##   0.86220690  113614.43  0.3334909  19082.95
##   0.89665517  116891.99  0.3334346  19168.59
##   0.93110345  120170.74  0.3333843  19254.22
##   0.96555172  123450.56  0.3333391  19339.86
##   1.00000000  126731.35  0.3332984  19425.50
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was fraction = 0.001.

iii) Modelo KNN.

modelKnn <- train(votos ~ ., 
                    data = trainDadosFiltrados, 
                    method = "knn", 
                    trControl = fitControl,
                    tuneGrid = neighborsGrid,
                    na.action = na.omit)
modelKnn
## k-Nearest Neighbors 
## 
## 7476 samples
##   13 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 5980, 5981, 5980, 5982, 5981 
## Resampling results across tuning parameters:
## 
##   k   RMSE      Rsquared   MAE     
##    1  43401.64  0.3221223  16523.96
##    2  38561.46  0.3947285  14532.89
##    3  37187.35  0.4256961  13857.12
##    4  35788.49  0.4544770  13384.41
##    5  34968.41  0.4757893  13051.63
##    6  34424.54  0.4881977  12812.28
##    7  33781.23  0.5042744  12642.50
##    8  33669.45  0.5078290  12566.02
##    9  33531.58  0.5106317  12472.39
##   10  33539.95  0.5099322  12424.36
##   11  33587.83  0.5083545  12393.29
##   12  33406.69  0.5130957  12326.75
##   13  33364.41  0.5138337  12283.39
##   14  33420.95  0.5123149  12310.33
##   15  33331.03  0.5146506  12252.28
##   16  33171.82  0.5189991  12202.92
##   17  33090.41  0.5209043  12162.27
##   18  33067.48  0.5213821  12136.15
##   19  33020.77  0.5227012  12129.79
##   20  32974.08  0.5239853  12123.50
##   21  32948.81  0.5247164  12115.38
##   22  32934.46  0.5250922  12100.66
##   23  32913.48  0.5257477  12079.76
##   24  32937.23  0.5250270  12066.95
##   25  32937.01  0.5249410  12070.19
##   26  32948.28  0.5245949  12091.80
##   27  32939.40  0.5248640  12070.87
##   28  32936.26  0.5249654  12053.98
##   29  32932.51  0.5250544  12045.87
##   30  32901.01  0.5258265  12042.16
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was k = 30.

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

Analisando os resultados temos que:

  • Ridge: Menor RSME é 38977.07, quando o lambda é 2.807216e-03;
  • Lasso: Menor RSME é 40441.92, quando a fração é 0.00100000;
  • KNN: Menor RSME é 32802.00, quando o k é 26;
plot(modelRidge)

plot(modelLasso)

plot(modelKnn)

Analisando os gráficos acima, vemos que no caso de Ridge uma curva crescente que tem início quando o parâmetro “lambda” é 0. Mostrando que o melhor modelo seria o modelo inicial.

Já para Lasso, “fraction”, que varia de 0 a 1, apresenta um RMSE muito alto para valores do fraction próximos a 0, chegando próximo de 0.5 a função se estabiliza.

No caso do modelo KNN vemos que com K próximo de 0 o RSME é muito alto e um ponto de inflexão com k próximo de 7. O que leva a entender que um número maior de vizinho não melhore o 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
ggplot(varImp(modelRidge))

# Lasso
ggplot(varImp(modelLasso))

Para Ridge, as variáveis recursos_proprios e recursos_de_outros_candidatos.comites e media não tiveram importância. O mesmo para Lasso.

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

Como foi possível ver, KNN é o modelo mais adequado com K em 10.

bestK <- expand.grid(k = seq(10, 10, length=1))

bestModel <- train(votos ~ ., 
                    data = trainDadosFiltrados, 
                    method = "knn",
                    tuneGrid = bestK,
                    na.action = na.omit)

5. Use esse último modelo treinado para prever os dados de teste disponíveis no challenge que criamos na plataforma Kaggle.

submission_predict <- predict(bestModel, testDadosFiltrados)

for(i in 1:length(submission_predict)){
  submission$votos[i] = abs(submission_predict[i])
}

write.csv(submission, file = "helisson_submition.csv", row.names = FALSE)