Checkpoint 3

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)
Função para processar as métricas: Precision, Recall e F1
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)
}
Leitura e pré-processamento dos dados
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)
Definição das características do treinamento
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")
Treinamento
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))
  
}
Resultados
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
Conclusões

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.