#Set-up

library(ggplot2)
library(lars)
library(lattice)
library(caret)
library(elasticnet)
library(tidyr)
library(dplyr)

setwd("C:/Users/dimit/Desktop/Projetos/AD2")
train <- read.csv("data/train.csv", encoding="UTF-8")
test <- read.csv("data/test.csv", encoding="UTF-8")

#substitui os valores "NA" pela média da coluna.
for(i in 1:ncol(train)){
  train[is.na(train[,i]), i] <- mean(train[,i], na.rm = TRUE)
}

for(i in 1:ncol(test)){
  test[is.na(test[,i]), i] <- mean(test[,i], na.rm = TRUE)
}

Descrição:

Nesta parte construiremos modelos preditivos de regressão para a predição de votação de candidatos à Câmara Federal de Deputados, as atividades esperadas para essa etapa são descritas a seguir:

1. Usando todas as variáveis disponíveis, tune (usando validação cruzada): (i) um modelo de regressão Ridge, (ii) um modelo de regressão Lasso e (iii) um modelo KNN. Para os modelos de regressão linear, o parâmetro a ser tunado é o lambda (penalização dos coeficientes) e o KNN o número de vizinhos.

#Definição dos parâmetros.

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

# variação do lambda
lambdaGrid <- expand.grid(lambda = 10^seq(2, -10, length=30))

# variação do fraction
fractionGrid <- expand.grid(fraction = seq(0.001, 1, length = 30))

# variação no número de vizinho
neighborsGrid <- expand.grid(k = seq(1, 30, length=30))

train_dadosFiltrados <- train %>% select(-nome, -cargo, -setor_economico_receita, -setor_economico_despesa)
test_dadosFiltrados <- test %>% select(-nome, -cargo, -setor_economico_receita, -setor_economico_despesa)
#Definição dos modelos.

# (i) modelo de regressão Ridge
model_ridge <- train(votos ~ .,
          data = train_dadosFiltrados,
          method = "ridge", 
          trControl = fitControl,
          tuneGrid = lambdaGrid,
          na.action = na.omit)

# (ii) modelo de regressão Lasso
model_lasso <- train(votos ~ ., 
                    data = train_dadosFiltrados, 
                    method = "lasso", 
                    trControl = fitControl,
                    tuneGrid = fractionGrid,
                    na.action = na.omit)

# (iii) modelo usando KNN
model_knn <- train(votos ~ ., 
                    data = train_dadosFiltrados, 
                    method = "knn", 
                    trControl = fitControl,
                    tuneGrid = neighborsGrid,
                    na.action = na.omit)

Primeiramente foi realizado um pré-processamento nos dados, para remover todos os valores “NA” das colunas, depois disso, foi criado o “trainControl” no qual foi definido o uso do método “cv” ou cross-validation, em seguida como pedido foram criadas 3 “grids” uma para cada parâmetro, e cada uma dessas grids define um intervalo que será usado para tunar os parâmetros de cada modelo, para o método “ridge” o parâmetro é “lambda”, no caso do método “lasso” o parâmetro seria “fraction” e para o método “knn” o parâmetro é “k” que seria o número de vizinhos. Para esses modelos eu precisei filtrar quais colunas da base de dados utilizar, eu removi “cargo” pois só tinha um valor, e as demais colunas (“nome”, “setor_economico_receita”, “setor_economico_despesa”) foram removidas pois supostamente possuem pouca variação e geravam erro ao tentar treinar o modelo.

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

#Plot dos RMSE de cada modelo.

ggplot(model_ridge)

ggplot(model_lasso)

ggplot(model_knn)

Aqui podemos avaliar o gráfico (RMSE x parâmetro do modelo), para cada um dos modelos.

  • Método Ridge: Esse acabou sendo o mais curioso pois ele possui uma curva crescente tendo início quando o parâmetro “lambda” é 0, isso significa que o melhor modelo usando esse método seria o próprio modelo inicial, onde o nenhuma das variáveis é penalizada.

  • Método Lasso: Nesse método nós temos o parâmetro “fraction” variando entre 0 e 1, e uma curva que nos mostra que para fraction 0 o RMSE é bem alto e a medida que ele aumenta o RMSE diminui (estabilizando por volta de fracton = 0,25).

  • Método KNN: Aqui a curva é mais interessante no início o RMSE vai melhorando a medida que aumentamos o número de vizinhos mas chega um ponto (aproximadamente 10 vizinhos) que aumentar o número de vizinhos não ajuda mais o modelo, pelo contrário só piora.

3. Quais as variáveis mais importantes segundo o modelo de regressão Ridge e Lasso? Variáveis foram descartadas pelo Lasso? Quais?

#Análise Ridge
ggplot(varImp(model_ridge))

#Análise Lasso
ggplot(varImp(model_lasso))

Ambos os modelos tiveram a mesma ordem de importância nas variáveis mostradas no plot, e as variáveis mais importantes para eles foram as variáveis relacionadas a despesas, principalmente “total_receita” e “total_despesa”, o que seria de se esperar.

Nenhuma variável foi descartada pelo método “lasso”, creio que isso se dá pelo fato de ser necessário remover algumas variáveis do modelo (nome, cargo, setor_economico_receita, setor_economico_despesa), para que ele ao menos possa ser gerado, e observando essas variáveis elas seriam justamente as de menor importância devido a sua baixa variação, então o método provavelmente iria descartar elas de toda forma.

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

Avaliando o “RMSE” como métrica o melhor modelo seria o que usa “KNN”, re-treinando o modelo, com o melhor parâmetro e sem usar validação cruzada, obtemos o seguinte resultado:

#grid contendo apenas o melhor valor para k (10)
bestK <- expand.grid(k = seq(10, 10, length=1))

#melhor modelo
best_model <- train(votos ~ ., 
                    data = train_dadosFiltrados, 
                    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.