Esta análise será feita uitlizando dados sobre a votação de candidatos à Câmara Federal de Deputados. Onde será feita algumas predições dessas votações. Logo abaixo será respondido 5 perguntas tomando como base os dados fornecidos.
Antes de tudo será importado as nossas bibliotecas que serão utilizadas para a plotagem das análises para responder as questões.
Logo após, será importado a nossa base de dados, sendo elas: train.csv (conjunto de treino que contém dados das eleições dos anos de 2006 e 2010), test.csv (conjunto de teste que contém dados das eleições de 2014). Assim como remover informações que tem pouca relevância, como nome e cargo que iriam demandar um custo elevado de tempo e atrapalhar no processo de tunagem e por fim substituir dados com NA para 0, pois utilizar dados com NA não é de bom uso.
treino <- read.csv("~/Downloads/AD2/Lab03/train.csv", encoding = "latin1")
teste <- read.csv("~/Downloads/AD2/Lab03/test.csv", encoding = "latin1")
treino <- treino %>%
select(-c(cargo, nome))
teste <- teste %>%
select(-c(cargo, nome))
treino[is.na(treino)] <- 0
teste[is.na(teste)] <- 0
Antes de partir para as perguntas, é necessário entender o que cada coluna presente nos nossos dados significa:
Após entender as variáveis disponíveis, poderemos partir para a resolução das perguntas.
Para realizar a tunagem das nossas variáveis vamos utilizar validação cruzada. Ou seja, teremos que fazer ums buca para encontrar os melhores valores para que o teste seja melhor. Sendo assim, segue o passo de utilizar validação cruzada:
controleFit <- trainControl(method = "cv",
number = 20,
repeats = 20)
## Warning: `repeats` has no meaning for this resampling method.
valoresPreProcessados <- c("center", "scale", "nzv")
Ridge regression é um método de regularização que tem como principal objetivo suavizar os atributos que aumentem o ruído no modelo, evitando o overffiting.
modeloRidge <- train(votos ~ .,
data = treino,
trControl = controleFit,
method = "ridge",
preProcess = valoresPreProcessados,
tuneLength = 15)
modeloRidge
Com o resultado do modelo, podemos observar o lambda com o valor de 0,004124626, ou seja, bem próximo a 0 que significa que o Bias é baixo e a variância alta.
O lasso, é um método de análise de regressão que executa a seleção e regularização de variáveis para aumentar a precisão da predição, podendo selecionar as variáveis para 0 se necessário.
modeloLasso <- train(votos ~ .,
data = treino,
trControl = controleFit,
method = "lasso",
preProcess = valoresPreProcessados,
tuneLength = 14)
modeloLasso
Após o resultado acima, podemos ver que a fração tem o valor de 0,1 onde o Rsquared é melhor, assumindo o valor de 0,4795668.
O modelo KNN vai fazer uma busca dos elementos que estão mais próximos para dar um match em seus resultados, ou seja, se um valor x está mais perto de y do que de z, ela terá o valor y por estar mais próxima.
modeloKNN <- train(votos ~ .,
data = treino,
trControl = controleFit,
method = "knn",
preProcess = valoresPreProcessados,
tuneLength = 15)
modeloKNN
O resultado mostrou k = 13 onde o Rsquared assume o valor de 0,5072944.
Para fazer a comparação dos três modelos em termos do erro RMSE da validação realizada na questão passada podemos plotar três gráficos utilizando x = Lambda e y = RMSE.
plot(modeloRidge, xlab = "Lambda", ylab = "RMSE")
plot(modeloLasso, xlab = "Lambda", ylab = "RMSE")
plot(modeloKNN, ylab = "RMSE")
Pelos resultados obtidos nas análises passados, obtemos os seguintes RMSE’s:
Podemos afirmar que apesar de todos terem um valor elevado de RMSE. Não há muita diferença entre eles, a não ser no modelo Ridge, que é um pouco mais elevados que os outros modelos.
Para a importância das variáveis de cada modelo, vamos observar os seguintes gráficos para assim observar as variáveis que tem menos importância em cada modelo.
ggplot(varImp(modeloRidge))
No modelo Ridge, as varáveis “recursos_proprios”, “recursos_de_outros_candidatos.comites”, “media_despesa”, “ano” não tem importância.
ggplot(varImp(modeloLasso))
No modelo Lasso, vemos as mesmas variáveis que não têm importância no Ridge.
Levando em consideração o “melhor modelo”, como vimos que os resultados são muito similares, vamos usar o modelo knn sem validação cruzada, tomando como base o menor valor do RMSE encontrado dentre os três modelos.
treinoK <- treino %>% select (-ano, -recursos_de_outros_candidatos.comites, -recursos_proprios, -media_despesa)
testeK <- teste %>% select (-ano, -recursos_de_outros_candidatos.comites, -recursos_proprios, -media_despesa)
E retreinando ele temos:
grid <- expand.grid(k = modeloKNN$bestTune)
controle <- trainControl(method = "optimism_boot")
modeloKNNCV <- train(votos ~ .,
data = treinoK,
method = "knn",
tuneGrid = grid,
trControl = controle,
preProcess = valoresPreProcessados)
modeloKNNCV
Após o resultado, vimos que foi possível obter um Rsquared menor quando usamos o knn sem validação cruzda, tendo um Rsquared = 0,4745128 e com validação cruzada tem o Rsquared = 0,5072944.
Gerando o csv para submeter no desafio no Kaggle:
modeloKNNCV$xlevels[["ocupacao"]] <- union(modeloKNNCV$xlevels[["ocupacao"]], levels(testeK$ocupacao))
predicao <- predict(modeloKNNCV, testeK)
ID <- testeK %>%
select(sequencial_candidato)
colnames(ID)[colnames(ID)=="sequencial_candidato"] <- "ID"
arquivoCSV <- ID
arquivoCSV$votos <- predicao
arquivoCSV$votos[arquivoCSV$votos < 0] <- 0
write.csv(arquivoCSV, "sample_submission.csv", row.names=FALSE)