Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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)
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
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
##
##
##
##
##
##
##
##
##
##
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
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
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
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
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
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.