Carregando bibliotecas necessárias
Carregando, separando em treino e teste e pre processando os dados
dados <- read.csv("./train.csv", encoding = "latin1")
dados <- dados %>% select(-nome, -estado_civil, -grau, -uf, -ocupacao, -sequencial_candidato, -cargo)
particao <- createDataPartition(dados$situacao, p=0.75, list=FALSE)
treino <- dados[particao, ]
teste <- dados[-particao, ]
1. Há desbalanceamento das classes (isto é, uma classe tem muito mais instâncias que outra)? Em que proporção? Quais efeitos colaterais o desbalanceamento de classes pode causar no classificador?
cont_nao_eleito <- dados %>% select(situacao) %>% filter(situacao == 'nao_eleito') %>% nrow()
cont_eleito <- dados %>% select(situacao) %>% filter(situacao == 'eleito') %>% nrow()
df = data.frame(Eleito = c("Sim", "Não"), count = c(cont_eleito, cont_nao_eleito))
ggplot(df, aes(x="", y=count, fill=Eleito))+ geom_bar(width = 1, stat = "identity") + coord_polar("y", start=0) +
scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))
treino <- treino %>% select(-recursos_de_outros_candidatos.comites, -recursos_de_partido_politico, -recursos_de_pessoas_fisicas, -recursos_de_pessoas_juridicas, -recursos_proprios)
rtreino <- ROSE(situacao ~ ., data = treino)$data
2. Treine: um modelo de KNN, regressão logística, uma árvore de decisão e um modelo de adaboost. Tune esses modelos usando validação cruzada e controle overfitting se necessário, considerando as particularidades de cada modelo.
fitControl <- trainControl(method = "repeatedcv",
number = 5,
repeats = 5,
classProbs = TRUE)
KNN
preProcValues <- c("center", "scale", "nzv")
model.knn <- train(situacao ~ .,
data = treino,
method = "knn",
trControl = fitControl,
preProcess = preProcValues,
tuneLength = 15)
model.knn
## k-Nearest Neighbors
##
## 5717 samples
## 11 predictor
## 2 classes: 'eleito', 'nao_eleito'
##
## Pre-processing: centered (17), scaled (17), remove (23)
## Resampling: Cross-Validated (5 fold, repeated 5 times)
## Summary of sample sizes: 4573, 4573, 4574, 4574, 4574, 4573, ...
## Resampling results across tuning parameters:
##
## k Accuracy Kappa
## 5 0.8998789 0.5469794
## 7 0.9022925 0.5524077
## 9 0.9027470 0.5522698
## 11 0.9037618 0.5550221
## 13 0.9043916 0.5577289
## 15 0.9051260 0.5587843
## 17 0.9048460 0.5563809
## 19 0.9049508 0.5543298
## 21 0.9046008 0.5505018
## 23 0.9041112 0.5470733
## 25 0.9044965 0.5463667
## 27 0.9037619 0.5397223
## 29 0.9034825 0.5351211
## 31 0.9036924 0.5340942
## 33 0.9025380 0.5254783
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 15.
Regressão Logística
logistica <- glm(formula=situacao~., data =rtreino, family=binomial)
logistica
##
## Call: glm(formula = situacao ~ ., family = binomial, data = rtreino)
##
## Coefficients:
## (Intercept) ano partidoPAN
## 2.841e+02 -1.423e-01 -1.581e+01
## partidoPC do B partidoPCB partidoPCO
## -2.512e-02 -1.497e+01 -1.499e+01
## partidoPDT partidoPFL partidoPHS
## -5.174e-01 7.885e-01 -1.149e+00
## partidoPL partidoPMDB partidoPMN
## -1.575e-01 4.345e-01 -1.592e+00
## partidoPP partidoPPS partidoPR
## 3.982e-01 -5.261e-01 6.577e-01
## partidoPRB partidoPRONA partidoPRP
## 1.202e-01 -1.560e+01 -1.719e+00
## partidoPRTB partidoPSB partidoPSC
## -1.585e+00 -7.367e-02 -4.159e-01
## partidoPSDB partidoPSDC partidoPSL
## -8.776e-02 -1.549e+01 -5.824e+00
## partidoPSOL partidoPSTU partidoPT
## -1.021e+00 -1.524e+01 5.456e-01
## partidoPT do B partidoPTB partidoPTC
## -1.197e+00 -9.300e-01 -1.089e+00
## partidoPTN partidoPV quantidade_doacoes
## -1.585e+01 -7.580e-01 1.576e-03
## quantidade_doadores total_receita media_receita
## 2.663e-03 1.477e-06 2.897e-05
## quantidade_despesas quantidade_fornecedores total_despesa
## 3.433e-04 3.089e-04 1.808e-06
## media_despesa sexoMASCULINO
## 8.619e-05 1.027e-01
##
## Degrees of Freedom: 5716 Total (i.e. Null); 5676 Residual
## Null Deviance: 7924
## Residual Deviance: 4328 AIC: 4410
Árvore de decisão
arvore <- train(
x = rtreino[, names(rtreino) != "situacao"],
y = rtreino$situacao,
method = "rpart",
trControl = fitControl,
control = rpart.control(cp = 0.4))
arvore
## CART
##
## 5717 samples
## 11 predictor
## 2 classes: 'nao_eleito', 'eleito'
##
## No pre-processing
## Resampling: Cross-Validated (5 fold, repeated 5 times)
## Summary of sample sizes: 4574, 4573, 4574, 4574, 4573, 4574, ...
## Resampling results across tuning parameters:
##
## cp Accuracy Kappa
## 0.04787234 0.8909933 0.7819191
## 0.11134752 0.8526823 0.7048385
## 0.64929078 0.6695014 0.3319922
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.04787234.
Adaboost
adaboost <- train(x = rtreino[, names(rtreino) != "situacao"],
y = rtreino$situacao,
method = "adaboost",
trControl = fitControl)
adaboost
## AdaBoost Classification Trees
##
## 5717 samples
## 11 predictor
## 2 classes: 'nao_eleito', 'eleito'
##
## No pre-processing
## Resampling: Cross-Validated (5 fold, repeated 5 times)
## Summary of sample sizes: 4573, 4574, 4573, 4574, 4574, 4573, ...
## Resampling results across tuning parameters:
##
## nIter method Accuracy Kappa
## 50 Adaboost.M1 0.9799900 0.9599826
## 50 Real adaboost 0.9769461 0.9539039
## 100 Adaboost.M1 0.9808993 0.9618011
## 100 Real adaboost 0.9777157 0.9554421
## 150 Adaboost.M1 0.9812493 0.9625007
## 150 Real adaboost 0.9781705 0.9563517
##
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were nIter = 150 and method
## = Adaboost.M1.
3. Reporte acurácia, precision, recall e f-measure no treino e validação. Como você avalia os resultados? Justifique sua resposta.
A análise será feita no modelo adaboost.
teste$predictions <- predict(adaboost, teste)
verdadeiroPositivo <- teste %>% filter(situacao == "eleito", predictions == "eleito") %>% nrow()
verdadeiroNegativo <- teste %>% filter(situacao == "nao_eleito" , predictions == "nao_eleito" ) %>% nrow()
falsoPositivo <- teste %>% filter(situacao == "nao_eleito" , predictions == "eleito") %>% nrow()
falsoNegativo <- teste %>% filter(situacao == "eleito", predictions == "nao_eleito" ) %>% nrow()
acuracia <- (verdadeiroPositivo + verdadeiroNegativo)/(verdadeiroPositivo + verdadeiroNegativo + falsoPositivo + falsoNegativo)
precision <- verdadeiroPositivo / (verdadeiroPositivo + falsoPositivo)
recall <- verdadeiroPositivo / (verdadeiroPositivo + falsoNegativo)
f_measure <- 2 * (precision * recall) / (precision + recall)
f_measure
## [1] 0.5609756
acuracia
## [1] 0.9055118
precision
## [1] 0.7467532
recall
## [1] 0.4492188
No treino, o modelo teve acurácia igual a 0.9812493; na validação, esse valor diminuiu para 0.9055118 Mas nossa principal medida é a precisão (0.7467532), pois ela considera verdadeiros positivos, falsos positivos, verdadeiros negativos e falsos negativos. Neste sentido o preditor se mostra razoavelmente bom, mas não tão confiável. O f-measure também nos mostra isso, pois não está tão próximo de 1 assim - o que poderia indicar um bom preditor.
4. Interprete as saídas dos modelos. Quais atributos parecem ser mais importantes de acordo com cada modelo?.
KNN
ggplot(varImp(model.knn))
No modelo KNN, as variáveis tota_despesa, total_receita, quantidade_fornecedores, quantidade_despesas,quantidade_doacoes, quantidade_doadores, media_receita se mostram bem importantes, enquanto sexo, partido e ano nem tanto.
Árvore de Decisão
ggplot(varImp(arvore))
No modelo de Árvore de Decisão, apenas os atributos total_despesa, quantidade despesas, total_receita, quantidade_fornecedores, quantidade_doadores e quantidade_doacoes parecem ser importantes.
Adaboost
ggplot(varImp(adaboost))
No modelo Adaboost, total_despesa, total_receita, media_receita, quantidade_fornecedores, quantidade_doacoes e quantidade_despesas, parecem ser as mais importantes.