require(ggplot2)
## Loading required package: ggplot2
require(GGally)
## Loading required package: GGally
require(dplyr)
## Loading required package: dplyr
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:GGally':
##
## nasa
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(caret)
## Loading required package: lattice
require(reshape)
## Loading required package: reshape
##
## Attaching package: 'reshape'
## The following object is masked from 'package:dplyr':
##
## rename
library(C50)
evaluate <- function(model,test,model_name){
test_labels = as.factor(test$Impeachment)
predictions = predict(model,newdata=test)
cM <- confusionMatrix(data = predictions, test_labels)
cM
confm <- data.frame(as.matrix(cM))
recall <- confm$SIM[2]/sum(confm$SIM)
precision <- confm$NAO[1]/sum(confm$NAO)
f1 <- 2 * ((precision*recall)/precision+recall)
results <- data.frame(precision=c(precision),recall=c(recall),f1=c(f1),model=c(model_name))
return (results)
}
deputados_temas_e_impeachment <- read.csv("~/Dropbox/UFCG/AD2/MT5/deputados_temas_e_impeachment.csv", sep=";")
deputados <- melt(na.omit(deputados_temas_e_impeachment))
## Using nome, deputado, partido, UF, tema_1, tema_2, tema_3, tema_4, tema_5, tema_6, tema_7, tema_8, tema_9, tema_10, tema_11, tema_12, tema_13, tema_14, tema_15, tema_16, tema_17, tema_18, tema_19, IMPEACHMENT as id variables
deputados <- select(deputados,partido:IMPEACHMENT)
colnames_deputados = c('Partido','UF','Cobranca_Latus_Sensu','Tributacao_Internet','Terrorismo_Definicao','Infanticidio_Indigena','Maioridade_1','Maioridade_2','Financiamento_Partido','Financiamento_Politico','Terceirizacao','Distritao','Trangenico','Fim_da_reeleicao','Cota_Mulheres','Restrincao_Pensao','Seguro_Desemprego','Tempo_Mandato','Voto_Facultativo','Voto_Impresso','Coincidencia_reeleicao','Impeachment')
colnames(deputados) <-colnames_deputados
deputados <- select(deputados,Partido,UF,Trangenico,Infanticidio_Indigena,Maioridade_1,Maioridade_2,Financiamento_Partido,Financiamento_Politico,Terceirizacao,Seguro_Desemprego,Impeachment)
deputados$Impeachment <- as.character(deputados$Impeachment)
deputados$Impeachment[deputados$Impeachment=='ABST'] <- 'NAO'
deputados$Impeachment[deputados$Impeachment=='AUSEN'] <- 'NAO'
deputados$Impeachment <- as.factor(deputados$Impeachment)
train_idx = createDataPartition(y=deputados$Impeachment, p=.75,list=FALSE)
train = deputados[train_idx,]
test = deputados[-train_idx,]
names(train) = names(deputados) #adicionando cabeçalho aos dados de treino e test
names(test) = names(deputados)
fitControl = trainControl(method="repeatedcv",number=10,repeats=5,returnResamp="all")
grid = expand.grid(.winnow=c(TRUE,FALSE),.trials=c(1,5,10,20,30,40,50,60,70,80,90,100),.model="tree")
labels = as.factor(train$Impeachment)
tree = train(x=train[-9],y=labels,tuneGrid=grid,trControl=fitControl,method="C5.0")
r <- evaluate(tree,test,'Tree')
models <- c('svmPoly','nnet','blackboost','glm','knn')
for (modelname in models){
model <- train(Impeachment ~ .,
method=modelname,
data=train,
trControl = fitControl)
r <- rbind(r,evaluate(model,test,modelname))
}
r
## precision recall f1 model
## 1 1.0000000 1.0000000 4.000000 Tree
## 2 0.7058824 0.8117647 3.247059 svmPoly
## 3 0.7058824 0.8705882 3.482353 nnet
## 4 0.5294118 0.9764706 3.905882 blackboost
## 5 0.6176471 0.8352941 3.341176 glm
## 6 0.6764706 0.8941176 3.576471 knn
Precisão será a métrica utilizada para avaliar os modelos.
Como podemos observar o melhor resultado foi utilizando redes neurais seguido pelo KNN. Por algum motivo o resultado para Arvores de Decisão não saiu corretamente. SVM apesar de ser um algoritmo que apresenta ótimos para diversos tipos de tarefa, este é mais aplicável quando temos muitas features, o que não é o caso. No caso da regressão logística, pelo fato de os dados serem binários (sim ou não). Já se tratando do KNN, pelo fato de os dados serem binários, os dados não são esparsos e assim facilita o agrupamento. Em relação ao Boosted Tree, a qual foi utilizado para subistituir a árvore de decisão, não mostrou uma precisão muito boa. Eu não tive oportunidade de estudar a tempo como funciona o algoritmo. Apenas sei que este é baseado em árvores de decisão E por fim, Redes Neurais deve mostrar um melhor resultado devido ao backpropagation que proporciona um alto poder de generalização.