Support-vector Machine

1 Introdução

O document a seguir refere-se a utilização de uma ténica chamada Support-vector Machine, ou SVM. Um modelo da aprendizado supervisionado que tem por objetivo realizar classificação binária. Esta metodoliga é determinada como classificador linear binário não-probabilístico.

2 Veficiações iniciais

2.1 Importante a base

spam <- read.csv("C:/Users/Rafael/Downloads/spambase_csv.csv")

2.2 Verificando a consistência da base

table(is.na(spam))
## 
##  FALSE 
## 266858

Não há observações faltantes

meanmax=rbind(apply(spam,2,mean),apply(spam,2,max))
rownames(meanmax) = c("Média","Máximo");
meanmax[,1:5]
##        word_freq_make word_freq_address word_freq_all word_freq_3d
## Média       0.1045534         0.2130146     0.2806564   0.06542491
## Máximo      4.5400000        14.2800000     5.1000000  42.81000000
##        word_freq_our
## Média      0.3122234
## Máximo    10.0000000

Observa-se a grande distância ente o máximo e a média, indicando possível presença de outliers.

-(table(spam[,1:54]>1)-table(spam[,1:58]>1))[2]
##  TRUE 
## 13096
round(as.numeric(-(table(spam[,1:54]>1)-table(spam[,1:58]>1))[2])/(4601*54)*100)
## [1] 5

Por se tratar de variáveis de frequência, não faz sentido admitir que alguma seja maior que 1.

Existem ao todo 13.096 observações acima de 1, correspondendo a 5% da amostra.

barplot(table(spam$class)/4601,names.arg = c("Não spam","Spam"))

Proporção da quantidade de spam, são razoavelmente balanceados.

2.3 Separando a amostra

set.seed(123)

train_idx <- sample(1:nrow(spam),3601,replace=FALSE)

train <- spam[train_idx,]
test <- spam[-train_idx,]

train$class = factor(train$class)
test$class  = factor(test$class)

80% para o treino, 20% para o teste.

3 SVM

O método SVM foca sua análise nos pontos que são de díficil classicação. Em outras palavras, observações incomuns serão classificadas mais naturalmente, pois estão distantes da “região comum de classificação”.

Posto isso, a base de dados exibe um comportamento desconhecido a priori.

A literatura sugere a utilização do kernel radial bias para estas situações (Cawley, Talbot. 2007)

4 Modelo inicial

set.seed(123)

svmtune = tune(svm, class ~., data= train,kernel="linear",ranges =list(cost=c( 1, 5, 10) ))

bestmod = svmtune$best.model

prediction.svm <- predict(bestmod, newdata = test, type = "class")
m.conf <- table(`Actual Class` = test$class, `Predicted Class` = prediction.svm) 

m.conf
##             Predicted Class
## Actual Class   0   1
##            0 573  27
##            1  36 364

Dado um modelo inicial, podemos tentar otimizá-lo.

5 Modelo otimizado

svmtune = tune(svm, class ~., data= train,kernel="linear",ranges =list(cost=c(5, 10,15,20),gamma=c(1,2,3,4,5)))

bestmod1 = svmtune$best.model

prediction.svm1 <- predict(bestmod1, newdata = test, type = "class")
m.conf <- table(`Actual Class` = test$class, `Predicted Class` = prediction.svm1)

m.conf
##             Predicted Class
## Actual Class   0   1
##            0 574  26
##            1  37 363

Ganha-se apenas uma classificação correta a mais

6 Medidas

conf = as.matrix(m.conf)

acc = round((conf[1,1]+conf[2,2])/sum(rowSums(conf))*100)
  
prec = as.numeric(round(conf[1,1]/colSums(conf)[1]*100))

negprec = as.numeric(round(conf[2,2]/colSums(conf)[2]*100))

med = as.data.frame(cbind(acc,prec,negprec));med
##   acc prec negprec
## 1  94   94      93

As medidas indicam um bom nível de classificação do algoritmo.

Rafael Cabral Fernandez

2019-05-12