Você está na página 1de 8

MI630 - Support Vector Machines

Gabriel Franco
September 12, 2016
SVM no R
SVM no R pode ser utilizado em diversos pacotes, mas em especial utiliza-se mais a funo svm() contida
no pacote e1071 devido sua compilao integrada com C e C++, reduzindo significativamente seu custo
computacional.

Exemplo: cncer de mama


Para ilustrar como o mtodo pode ser implementado, vamos utilizar o conjunto de dados sobre cncer de
mama da universidade de Wisconsin disponvel no UCI Repository fo Machine Learning.
Table 1: Primeiras observaes das primeiras 8 variveis (de 32) do
conjunto de dados
ID
842302
842517
84300903
84348301
84358402
843786

diag
M
M
M
M
M
M

V3

V4

V5

V6

V7

V8

17.99
20.57
19.69
11.42
20.29
12.45

10.38
17.77
21.25
20.38
14.34
15.70

122.80
132.90
130.00
77.58
135.10
82.57

1001.0
1326.0
1203.0
386.1
1297.0
477.1

0.11840
0.08474
0.10960
0.14250
0.10030
0.12780

0.27760
0.07864
0.15990
0.28390
0.13280
0.17000

Para ver a descrio completa do estudo, seus resultados e artigos que este conjunto de dados gerou, clique
aqui. Aqui vamos inserir apenas o item 7 do documento mencionado que descreve as 33 variveis.
7. Attribute information
1) ID number
2) Diagnosis (M = malignant, B = benign)
3-32)
Ten real-valued features are computed for each cell nucleus:
a)
b)
c)
d)
e)
f)
g)
h)
i)
j)

radius (mean of distances from center to points on the perimeter)


texture (standard deviation of gray-scale values)
perimeter
area
smoothness (local variation in radius lengths)
compactness (perimeter^2 / area - 1.0)
concavity (severity of concave portions of the contour)
concave points (number of concave portions of the contour)
symmetry
fractal dimension ("coastline approximation" - 1)

Dividindo entre treinamento e teste


Estamos interessados na varivel Diagnosis. No total, temos 569 observaes no conjunto disponibilizado no
Kaggle. Dessas 569, vamos tomar 379 observaes como treinamento e as demais para testar o modelo.
Vejamos como a varivel Diagnosis distribuda ao longo de algumas variveis.
40
0.09
30
0.08

V12

V4

diag
M

diag
B

0.07

20
0.06

10

0.05
10

15

20

25

500

1000

V3

1500

2000

V6

Note que o conjunto apresenta caractersticas muito boas para uma clasificao, visto que as classes so muito
bem divididas como vimos nas figuras.
Vejamos ento como implementar SVM e como definir os parmetros necessrios para o ajuste. Utilizando o
pacote e1071 mencionado no incio, vamos utilizar sua funo tune() para verificar qual a melhor combinao
de parmetros de custo C e da radial basis G se ajusta melhor no conjunto de treino.
A princpio vamos chutar uma amplitude bem grande de possveis valores dos parmetros para termos uma
ideia de onde se encontra a melhor combinao.
library(e1071)
set.seed(14)
G = 2^seq(-10,0, by=.2)
C = 2^seq(-2,8, by=.2)
Prop = 2/3

# parametro da radial basis


# parametro de custo do termo lagrangiano
# que proporo dos dados ser usado para treino

svm.fit <- tune(svm, diag ~ .,


data = na.omit(dd[,-1]),
ranges = list(gamma = G, cost = C) ,
tunecontrol = tune.control(sampling = "fix", fix = Prop)
)
svm.fit
##
## Parameter tuning of 'svm':
##
## - sampling method: fixed training/validation set
##
## - best parameters:
##
gamma
cost
2

2500

## 0.04736614 1.319508
##
## - best performance: 0.02631579
O algoritmo retorna o custo C = 1.3195 e o parmetro do kernel = 0.0473661. Esta combinao possui
uma proporo de erro de 0.0263158.
O resumo do ajuste dado executando o objeto onde foi armazenado. Ou seja,
svm.fit
##
##
##
##
##
##
##
##
##
##

Parameter tuning of 'svm':


- sampling method: fixed training/validation set
- best parameters:
gamma
cost
0.04736614 1.319508
- best performance: 0.02631579

Para uma visualizao mais detalhada do ajusta, podemos utilizar a funo summary() que retorna o erro de
cada combinao de parmetros, a melhor combinao e o melhor desempenho. Porm, como a sada possui
todas as combinaes pedidas, vamos suprimir este resultado.
Encontrados os parmetros nesta primeira tentativa, vamos agora verificar sua vizinhana em busca de
melhores resultados.
set.seed(14)
G = 2^(-5)* exp( seq(-1,1,by=.2) )
# parametro da radial basis
C = 2 * exp( seq(-1,1, by=.2) )
# parametro de custo do termo lagrangiano
Prop = 2/3
# que proporo dos dados ser usado para treino
svm.fit <- tune(svm, diag ~ .,
data = na.omit(dd[,-1]),
ranges = list(gamma = G, cost = C) ,
tunecontrol = tune.control(sampling = "fix", fix = Prop)
)
No muito distante dos parmetros anteriores, o algoritmo retorna o custo C = 1.3406 e o parmetro do
kernel = 0.0466195. Esta combinao possui uma proporo de erro de 0.0263158. Na verdade, ao observar
o summary do ajuste podemos notar que vrias combinaes atingem o mesmo erro e, portanto, qualquer um
desses pares pode ser utilizado.
interessante observar o mapa de desempenho do ajuste ao longo dos parmetros do SVM. Para isso,
podemos escrever o cdigo abaixo. A melhor combinao de parmetros apontada no grfico.
plot(svm.fit)
points(svm.fit$best.parameters$gamma, svm.fit$best.parameters$cost, pch = 13)

cost

Performance of svm'
5
4
3
2
1

0.050
0.045
0.040
0.035
0.030
0.02

0.05

0.08

gamma
SVM e validao cruzada
Uma maneira de tentar uma preciso ainda maior acerca dos parmetros utilizando validao cruzada. Para
ilustrar, vamos utilizar a mesma abordagem que a anterior ao particionarmos o conjunto em treinamento e
teste.
set.seed(14)
G = 2^seq(-5,5, by=1)
C = 2^seq(-5,5, by=1)
CV = 10

# parametro da radial basis


# parametro de custo do termo lagrangiano
# nmero de parties da validao cruzada

svm.fit <- tune(svm, diag ~.,


data = na.omit(dd[,-1]),
ranges = list(gamma = G, cost = C) ,
tunecontrol = tune.control(sampling = "cross", fix = CV)
)
svm.fit
##
##
##
##
##
##
##
##
##
##

Parameter tuning of 'svm':


- sampling method: 10-fold cross validation
- best parameters:
gamma cost
0.03125
4
- best performance: 0.02108396

O algoritmo retorna o custo C = 4 e o parmetro do kernel = 0.03125. Esta combinao possui uma
proporo de erro de 0.021084. Um desempenho um pouco melhor que os anteriores, porm um custo
computacional relativamente maior.
Assim como fizemos na seo anterior, vamos refinar a busca pelos parmetros. Como temos ainda mais
operaes a serem realizadas em uma validao cruzada, a maior quantidade de pares de possveis parmetros
afeta exponencialmente o custo computacional.

set.seed(14)
G = 2^(-5)* exp( seq(-1,1,by=.1) )
C = 2 * exp( seq(-1,1, by=.1) )
CV = 10

# parametro da radial basis


# parametro de custo do termo lagrangiano
# nmero de parties da validao cruzada

svm.fit <- tune(svm, diag ~ .,


data = na.omit(dd[,-1]),
ranges = list(gamma = G, cost = C) ,
tunecontrol = tune.control(sampling = "cross", fix = CV)
)
svm.fit
##
##
##
##
##
##
##
##
##
##

Parameter tuning of 'svm':


- sampling method: 10-fold cross validation
- best parameters:
gamma
cost
0.0127053 2.983649
- best performance: 0.01754386

Por fim, temos uma combinao de parmetros de custo C = 2.9836 e parmetro do kernel = 0.0127053.
Esta combinao possui uma proporo de erro estimada de 0.0175439.
Devido s inmeras realizaes do ajuste SVM para diversas parties da amostra, temos condies de estimar
a preciso do estimador do erro de predio. Para visualizar esses erros de predio, podemos pedir a funo
summary(svm.fit). Mais uma vez, por motivos de supresso de sadas extensas, no vamos imprimir este
resultado aqui.
Contudo, interessante observar o mapa de desempenho do SVM para cada combinao de parmetros
testada. Veja que quando exploramos uma regio mais prxima da regio tima, temos curvas de nveis
tendendo ao valor retornado pela funo tune(). Indicando uma boa convergncia do mtodo.
plot(svm.fit)
points(svm.fit$best.parameters$gamma, svm.fit$best.parameters$cost, pch = 13)

cost

Performance of svm'
0.040
0.035
0.030
0.025
0.020

5
4
3
2
1
0.02

0.05

0.08

gamma

SVM e regresso logstica


Considere o caso perfeito em que possvel traar uma linha reta entre as duas classes. Vamos gerar o
seguinte conjunto de dados para efeito de ilustrao.
x = runif(100)
y = runif(100)
tipo = matrix(NA, nrow=100,ncol=1)
for(i in 1:nrow(tipo)){
if(x[i] <= y[i] - .15) tipo[i] = "A"
if(x[i] >= y[i] + .15) tipo[i] = "B"
}
dd2 <- na.omit(data.frame(x,y,tipo))
q1 <- ggplot(dd2, aes(x,y)) + geom_point(aes(colour = factor(tipo)))
q1
1.00

0.75

factor(tipo)
A

0.50

B
0.25

0.00
0.00

0.25

0.50

0.75

1.00

x
Aplicando SVM neste conjunto de dados, temos o seguinte.
fit <- tune(svm, tipo~., data = dd2)
fit
##
## Error estimation of 'svm' using 10-fold cross validation: 0
Neste caso com apenas duas variveis explanatrias possvel ilustrar o SVM graficamente, mostrando o
plano de deciso envolvendo os dados dispersos no grfico.
best.fit2 <- fit$best.model
plot(best.fit2, dd2,x~y)

0.2

0.8
0.6
0.4
0.2

x o o oo o
ooo oo x
oo
o xo
oo
o oo x
x xo
ooo
o oooo
o
o
o
xx
xo x o oo o o
ooooo oooooooo
oo
o
ooo
x x oo
oo x

SVM classification plot

0.6
y

No exemplo do cncer de mama anterior este tipo de ferramenta visual complicado de mostrar devido ao
grande nmero de variveis envolvidas. Para cada par de variveis que desejemos ilustrar preciso fixar um
valor para todas as demais para que seja possvel representar o hiperplano de deciso neste par em particular.
Porm, conforme os valores escolhidos para os demais pontos o hiperplano pode ter uma visualizao no
informativa.
Conclumos, ento, que o SVM faz uma classificao perfeita. No entanto, ao utilizarmos a regresso logstica,
temos o seguinte.
fit2<- glm(tipo~., data = dd2,
family=binomial)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(fit2)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##

Call:
glm(formula = tipo ~ ., family = binomial, data = dd2)
Deviance Residuals:
Min
1Q
-3.650e-05 -2.100e-08

Median
-2.100e-08

3Q
2.100e-08

Max
2.568e-05

Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept)
-10.58
65810.07
0.000
1.000
x
139.87 140029.83
0.001
0.999
y
-115.88 121821.41 -0.001
0.999
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1.0196e+02
Residual deviance: 2.5462e-09
AIC: 6

on 75
on 73

degrees of freedom
degrees of freedom

Number of Fisher Scoring iterations: 25


7

Observe que em termos de resduo o modelo satisfatrio, mas repare que os parmetros no podem ser
estimados.
De fato, para que uma regresso logstica possa trabalhar com erro zero nessa sepao perfeita preciso
que os parmetros estimados para seja muito grando, praticamente infinito. Prejudicando, assim, toda a
inferncia acerca dos parmetros.
Portanto, quando temos dados separveis, como neste caso, a regresso logstica no uma boa ferramenta
para ajustar uma regio de deciso.

Você também pode gostar