#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)
}
#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.
#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.
#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.
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)