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")
# 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)
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.
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.
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.
Analisando os resultados temos que:
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.
# 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.
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)
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)