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.