Upload
ngoanh
View
222
Download
2
Embed Size (px)
Citation preview
Support Vector MachineGraficas, estadıstica y minerıa de datos con Python
Miguel Cardenas Montes
Centro de Investigaciones Energeticas Medioambientales y Tecnologicas,Madrid, Spain
2-6 de Noviembre de 2015
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 1 / 31
Tabla de Contenidos
1 Objetivos
2 Support Vector Machine
3 Ejemplo Python
4 Regresion con SVM
5 Ejemplo R
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 2 / 31
Objetivos
Conocer las diferencias entre los metodos de aprendizaje supervisadoy no supervisados.
Conocer metodos SVM lineales, polinomicos y radiales
Aspectos Tecnicos
scikit-learn API
Support Vector Machine
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 3 / 31
Support Vector Machine
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 4 / 31
SVM I
Support Vector Machine (SVM)es un metodo supervisado declasificacion, aunque tambienpuede utilizarse en regresion.
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 5 / 31
SVM II
H1 no separa las clases.
H2 y H3 sı separan las clases.
H3 maximiza el margen deseparacion de las clases.
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 6 / 31
SVM III
Objetivo maximizar la anchura del margen que separa ambas clasesde datos.
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 7 / 31
SVM IV
Existen conjutos de datos no linealmente separables.
SVM tambien puede tratarlos.
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 8 / 31
Elementos de SVM I
Un Support VectorMachine (SVM) ejecutauna clasificacion.
Para ello tiene queencontrar el hiperplanoque maximiza el margenentre las dos clases.
Los vectores (casos) quedefinen el hiperplano sedenominan support
vectors.
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 9 / 31
SVM
SVM usa un mapeo no lineal transformando los datos originales enotros de dimensionalidad superior.
En estas nuevas dimensionalidades, SVM busca el hiperplano optimoque separa las clases.
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 10 / 31
Ejemplo: Python
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 11 / 31
Ejemplo I
SVM linealmente separable.
import numpy as np
import pylab as pl
from sklearn import svm
# first training set
X = np.r_[’1,2,0’, \
[500, 1000, 2000, 1000, 4000, 4000, 8000], \
[500, 1000, 2000, 4000, 1000, 4000, 2000] ]
Y = [0, 0, 0, 0, 0, \
1, 1]
pl.scatter(X[:, 0], X[:, 1], c=Y, cmap=pl.cm.Paired)
pl.xlabel(’Label A’)
pl.ylabel(’Label B’)
pl.axis(’tight’)
pl.ylim( (0, 8110) )
pl.xlim( (0, 8110) )
pl.show()
0 1000 2000 3000 4000 5000 6000 7000 8000Label A
0
1000
2000
3000
4000
5000
6000
7000
8000
Labe
l B
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 12 / 31
Ejemplo II
SVM linealmente separable.
# fit the model and get the separating hyperplane
clf = svm.SVC(kernel=’linear’, C=2.0)
clf.fit(X, Y)
# get the separating hyperplane
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(0, 20001)
yy = a * xx - (clf.intercept_[0]) / w[1]
# plot the parallels to the separating hyperplane that pass through the
# support vectors
b = clf.support_vectors_[0]
yy_down = a * xx + (b[1] - a * b[0])
b = clf.support_vectors_[-1]
yy_up = a * xx + (b[1] - a * b[0])
# plot the line, the points, and the nearest vectors to the plane
pl.plot(xx, yy, ’k-’)
pl.plot(xx, yy_down, ’k--’)
pl.plot(xx, yy_up, ’k--’)
pl.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=80, facecolors=’none’)
pl.scatter(X[:, 0], X[:, 1], c=Y, cmap=pl.cm.Paired)
0 1000 2000 3000 4000 5000 6000 7000 8000Label A
0
1000
2000
3000
4000
5000
6000
7000
8000
Labe
l B
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 13 / 31
Ejemplo III
Al anadir un nuevo punto se reoganiza el esquema.
Se mantiene que los puntos son linealmente separables (3500, 3500,etiqueta 1).
# Modified training set
X = np.r_[’1,2,0’, \
[500, 1000, 2000, 1000, 4000, 4000, 8000, 3500], \
[500, 1000, 2000, 4000, 1000, 4000, 2000, 3500] ]
Y = [0, 0, 0, 0, 0, \
1, 1, 1]
0 1000 2000 3000 4000 5000 6000 7000 8000Label A
0
1000
2000
3000
4000
5000
6000
7000
8000
Labe
l B
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 14 / 31
Ejemplo IV
0 1000 2000 3000 4000 5000 6000 7000 8000Label A
0
1000
2000
3000
4000
5000
6000
7000
8000
Labe
l B
0 1000 2000 3000 4000 5000 6000 7000 8000Label A
0
1000
2000
3000
4000
5000
6000
7000
8000
Labe
l B
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 15 / 31
Ejemplo V
Prediccion de nuevos puntos.
from sklearn import svm
X = [[0, 0], [0.4, 0.5], [1, 1], [2, 2]]
y = [0, 0, 1, 1]
clf = svm.SVC()
clf.fit(X, y)
print clf.predict([[0.5, 1.]])
print clf.predict([[2., 2.]])
print clf.predict([[2., 3.]])
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 16 / 31
Ejemplo VI
Datos no linealmente separable.Se cambia un punto de etiqueta (2000, 2000, etiqueta 1).El resultado grafico es anomalo si se trata de mantener unaseparabilidad lineal.
# Modified training set
X = np.r_[’1,2,0’, \
[500, 1000, 2000, 1000, 4000, 4000, 8000], \
[500, 1000, 2000, 4000, 1000, 4000, 2000] ]
Y = [0, 0, 1, 0, 0, \
1, 1]
0 1000 2000 3000 4000 5000 6000 7000 8000 90000
500
1000
1500
2000
2500
3000
3500
4000
4500
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 17 / 31
Ejemplo VII
Sin embargo, con ecuacion no lineal (polinomica) se podrıan separarlos datos.
clf = svm.SVC(kernel=’poly’, gamma=4)
clf.fit(X, Y)
pl.figure()
pl.clf()
pl.scatter(X[:, 0], X[:, 1], c=Y, zorder=10, cmap=pl.cm.Paired)
pl.axis(’tight’)
x_min = X[:, 0].min()
x_max = X[:, 0].max()
y_min = X[:, 1].min()
y_max = X[:, 1].max()
XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()])
# Put the result into a color plot
Z = Z.reshape(XX.shape)
pl.pcolormesh(XX, YY, Z > 0, cmap=pl.cm.Paired)
pl.contour(XX, YY, Z, colors=[’k’, ’k’, ’k’], linestyles=[’--’, ’-’, ’--’], levels=[-.5, 0, .5])
pl.show()
1000 2000 3000 4000 5000 6000 7000 8000500
1000
1500
2000
2500
3000
3500
4000
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 18 / 31
Tipos de kernel en SVM
Lineal
Polinomico
rbf, radial basis function
sigmoide, tangente hiperbolica
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 19 / 31
Parametros de SVM
C Penalizacion del termino de error. Este parametro, comun entodos los kernels, es un compromiso entre las clasificacioneserroneas de las tuplas de entrenamiento contra la simplicidadde la superficie de decision. Un valor bajo de ”c” hace lasuperficie de decision suave, mientras que un valor alto tratade clasificar absolutamente todas las tuplas de entrenamientocorrectamente.
kernel Tipo de kernel usado en el algoritmo.
degree Grado de la funcion kernel cuando de tipo polinomico.
gamma Coeficiente del kernel cuando es de tipo rbf.
coef0 Parametro del kernel cuando es de tipo sigmoide.
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 20 / 31
Multiclases
Para datos no linealmente separable y masde dos clases es posible hacer mapas(mediante prediccion) de las zonas deinfluencia de cada clase.
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 21 / 31
Complejidad Computacional de SVM
SVM incrementa los requerimientos computacionales con rapidez conel numero de tuplas de entrenamiento.
El nucleo de la librerıa escala como O(nfeatures × n2samples) o como
O(nfeatures × n3samples) dependiendo de la eficiencia del uso y de lasparticularidades de los datos.
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 22 / 31
Regresion con SVM
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 23 / 31
Regresion con SVM I
El metodo de SVM puede ser extendida a la resolucion de problemasde regresion.
En SVR la etiqueta categorica tiene que ser cambiada por valorescontinuos.
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 24 / 31
Regresion con SVM II
import numpy as np
X = np.sort(5 * np.random.rand(40, 1), axis=0)
y = np.sin(X).ravel()
# Add noise to targets
y[::4] += 3 * (0.5 - np.random.rand(10))
# Fit regression model
from sklearn.svm import SVR
svr_rbf = SVR(kernel=’rbf’, C=1e3, gamma=0.1)
svr_lin = SVR(kernel=’linear’, C=1e3)
svr_poly = SVR(kernel=’poly’, C=1e3, degree=2)
y_rbf = svr_rbf.fit(X, y).predict(X)
y_lin = svr_lin.fit(X, y).predict(X)
y_poly = svr_poly.fit(X, y).predict(X)
# look at the results
import pylab as pl
pl.scatter(X, y, c=’k’, label=’data’)
pl.hold(’on’)
pl.plot(X, y_rbf, c=’g’, label=’RBF model’)
pl.plot(X, y_lin, c=’r’, label=’Linear model’)
pl.plot(X, y_poly, c=’b’, label=’Polynomial model’)
pl.legend()
pl.show()
−1 0 1 2 3 4 5 6data
−2.0
−1.5
−1.0
−0.5
0.0
0.5
1.0
1.5
2.0
targ
et
Support Vector Regression
Linear modelPolynomial modeldata
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 25 / 31
Ejemplo: R
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 26 / 31
Ejemplo (SVM Lineal) I
Ejemplo en R de SVM linealmente separable.
# numero de valores
nn<-100
dim<-2
# valores eje x,y para el primer conjunto
data1<-matrix(c(rnorm(nn,mean=2,sd=0.7),rnorm(nn,mean=1,sd=0.7)),nn,dim)
data1
# valores eje x,y para el segundo conjunto
data2<-matrix(c(rnorm(nn,mean=5,sd=0.6),rnorm(nn,mean=4,sd=0.4)),nn,dim)
data2
# construir tabla datos
datos<-rbind(data1,data2)
datos
# generar las etiquetas
y <- matrix(c(rep(1,nn),rep(-1,nn)))
# mostrar los datos
plot(datos,col=ifelse(y>0,1,2))
1 2 3 4 5 6
01
23
45
datos[,1]
dato
s[,2
]
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 27 / 31
Ejemplo (SVM Lineal) II
# leer el paquete kernlab
library(kernlab)
# entrenar el modelo SVM
svp <- ksvm(datos,y,type="C-svc",kernel=’vanilladot’,C=100,scaled=c())
# Sumario de datos
svp
# Atributos disponibles
attributes(svp)
# algunos ejemplos de atributos disponibles
alpha(svp)
alphaindex(svp)
b(svp)
# Usar el modelo para pintar el clasificador
plot(svp,data=datos)
−4
−2
0
2
4
6
0 1 2 3 4 5
1
2
3
4
5
6
SVM classification plot
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 28 / 31
Ejemplo (SVM No Lineal: RBF) III
# numero de valores
nn<-100
dim<-2
# valores eje x,y para el primer conjunto
data1<-matrix(c(rnorm(nn,mean=2,sd=0.7),rnorm(nn,mean=1,sd=0.7)),nn,dim)
# valores eje x,y para el segundo conjunto
data2<-matrix(c(rnorm(nn,mean=5,sd=0.6),rnorm(nn,mean=4,sd=0.4)),nn,dim)
# valores eje x,y para el terce conjunto
data3<-matrix(c(rnorm(nn,mean=-2,sd=0.3),rnorm(nn,mean=-2,sd=0.3)),nn,dim)
# construir tabla datos
datos<-rbind(data1,data2,data3)
# generar las etiquetas
y <- matrix(c(rep(1,nn),rep(-1,nn), rep(-1,nn)))
# mostrar los datos
plot(datos,col=ifelse(y>0,1,2))
# leer el paquete kernlab
library(kernlab)
# entrenar el modelo SVM
svp <- ksvm(datos,y,type="C-svc",kernel=’rbf’,kpar=list(sigma=1),C=1 )
# Usar el modelo para pintar el clasificador
plot(svp,data=datos)
−1.5
−1.0
−0.5
0.0
0.5
1.0
1.5
2.0
−2 −1 0 1 2 3 4 5
−2
0
2
4
6
SVM classification plot
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 29 / 31
Ejemplo (SVM Lineal) IV
Ejemplo de SVM Lineal con margenes y vectores de soporte:
nn<-40
dim<-2
data1<-matrix(c(rnorm(nn,mean=1,sd=0.7),rnorm(nn,mean=2,sd=0.7)),nn,dim)
data2<-matrix(c(rnorm(nn,mean=4,sd=0.6),rnorm(nn,mean=5,sd=0.4)),nn,dim)
datos<-rbind(data1,data2)
# generar las etiquetas
y <- matrix(c(rep(1,nn),rep(-1,nn)))
# mostrar los datos
#plot(datos,col=ifelse(y>0,1,2), type=’n’)
# leer el paquete kernlab
library(kernlab)
# entrenar el modelo SVM
svp <- ksvm(datos,y,type="C-svc",kernel=’vanilladot’,C=100,scaled=c())
ymat<-ymatrix(svp)
plot(c(min(datos[,1]), max(datos[,1])),c(min(datos[,2]), max(datos[,2])),type=’n’,xlab=’x1’,ylab=’x2’)
points(datos[-SVindex(svp),1], datos[-SVindex(svp),2], pch = ifelse(ymat[-SVindex(svp)] < 0, 2, 1))
points(datos[SVindex(svp),1], datos[SVindex(svp),2], pch = ifelse(ymat[SVindex(svp)] < 0, 17, 16))
# Extraer w y b del modelo
w <- colSums(coef(svp)[[1]] * datos[SVindex(svp),])
b <- b(svp)
# Dibujar lineas
abline(b/w[2],-w[1]/w[2])
abline((b+1)/w[2],-w[1]/w[2],lty=2)
abline((b-1)/w[2],-w[1]/w[2],lty=2)
0 1 2 3 4 5
12
34
5
x1
x2
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 30 / 31
Gracias
Gracias
¿Preguntas?
¿Mas preguntas?
M. Cardenas (CIEMAT) SVM 2-6 de Noviembre de 2015 31 / 31