Support Vector Machine (SVM) - Máquina de Vactores de Soporte
Msc. Roberto Trespalacios
Universidad Tecnológica de Bolivar
6/8/23
Support Vector Machine (SVM) - Máquina de Vactores de Soporte
Introducción
Las máquinas de soporte vectorial, máquinas de vectores de soporte o máquinas de vector soporte (Support Vector Machines, SVMs) son un conjunto de algoritmos de aprendizaje supervisado desarrollados por Vladimir Vapnik y su equipo en los laboratorios AT&T.
Una máquina de vectores de soporte (SVM) es un algoritmo de aprendizaje supervisado que se puede emplear para clasificación binaria o regresión, construye un hiperplano óptimo en forma de superficie de decisión, de modo que el margen de separación entre las dos clases en los datos se amplía al máximo.
Los vectores de soporte hacen referencia a un pequeño subconjunto de las observaciones de entrenamiento que se utilizan como soporte para la ubicación óptima de la superficie de decisión.
Las máquinas de vectores de soporte pertenecen a una clase de algoritmos de Machine Learning denominados métodos kernel y también se conocen como máquinas kernel.
Hiperplano y Clasificador de margen máximo (Maximal Margin Classifier)
En un espacio p-dimensional, un hiperplano se define como un subespacio plano y afín de dimensiones p−1 .
El término afín significa que el subespacio no tiene por qué pasar por el origen.
En un espacio de dos dimensiones, el hiperplano es un subespacio de 1 dimensión, es decir, una recta.
En un espacio tridimensional, un hiperplano es un subespacio de dos dimensiones, un plano convencional.
Para dimensiones \(p>3\) no es intuitivo visualizar un hiperplano, pero el concepto de subespacio con \(p−1\) dimensiones se mantiene.
La definición matemática de un hiperplano es bastante simple. En el caso de dos dimensiones, el hiperplano se describe acorde a la ecuación de una recta:
Hiperplano y Clasificador de margen máximo (Maximal Margin Classifier)
La definición matemática de un hiperplano es bastante simple. En el caso de dos dimensiones, el hiperplano se describe acorde a la ecuación de una recta:
\[\beta_0 + \beta_1x_1 + \beta_2x_2 = 0\]
Dados los parámetros \(\beta_0\), \(\beta_1\) y \(\beta_2\) , todos los pares de valores \(x=(x_1,x_2)\) para los que se cumple la igualdad son puntos del hiperplano. Esta ecuación puede generalizarse para p-dimensiones:
entonces, el punto \(x\) cae a un lado o al otro del hiperplano.
Así pues, se puede entender que un hiperplano divide un espacio p-dimensional en dos mitades.
Para saber en qué lado del hiperplano se encuentra un determinado punto \(x\) , solo hay que calcular el signo de la ecuación.
La siguiente imagen muestra el hiperplano de un espacio bidimensional.
La ecuación que describe el hiperplano (una recta) es: \[1+2x_1+3x_2=0\]
La región naranja representa el espacio en el que se encuentran todos los puntos para los que \(1+2x_1+3x_2>0\)
La región verde el de los puntos para los que \(1+2x_1+3x_2<0\)
Entrenamiento de una SVM
El entrenamiento de una máquina de vectores de soporte consta de dos fases:
Transformar los predictores (datos de entrada) en un espacio de características altamente dimensional.
En esta fase es suficiente con especificar el kernel; los datos nunca se transforman explícitamente al espacio de características.
Este proceso se conoce comúnmente como el “truco kernel”.
Resolver un problema de optimización cuadrática que se ajuste a un hiperplano óptimo para clasificar las características transformadas en dos clases.
El número de características transformadas está determinado por el número de vectores de soporte.
Construcción de una SVM
Para construir la superficie de decisión solo se requieren los vectores de soporte seleccionados de los datos de entrenamiento.
Una vez entrenados, el resto de los datos de entrenamiento son irrelevantes.
Entre los kernels populares que se emplean con las máquinas SVM se incluyen:
Gausiano
Lineal
Polinomial
Radial
Sigmoide
Apectos inportantes de la función Kernel
La manera más simple de realizar la separación es mediante una línea recta, un plano recto o un hiperplano N-dimensional.
Desafortunadamente los universos a estudiar no se suelen presentar en casos idílicos de dos dimensiones como en el ejemplo anterior, sino que un algoritmo SVM debe tratar con:
más de dos variables predictoras
curvas no lineales de separación
casos donde los conjuntos de datos no pueden ser completamente separados
clasificaciones en más de dos categorías
Debido a las limitaciones computacionales de las máquinas de aprendizaje lineal, éstas no pueden ser utilizadas en la mayoría de las aplicaciones del mundo real.
La representación por medio de funciones Kernel ofrece una solución a este problema, proyectando la información a un espacio de características de mayor dimensión el cual aumenta la capacidad computacional de la máquinas de aprendizaje lineal.
Es decir, mapearemos el espacio de entradas \(X\) a un nuevo espacio de características de mayor dimensionalidad (Hilbert):
Ejemplo en 2–dimensiones
En el siguiente ejemplo idealizado para 2-dimensiones, la representación de los datos a clasificar se realiza en el plano \(x-y\).
El algoritmo SVM trata de encontrar un hiperplano 1-dimensional (en el ejemplo que nos ocupa es una línea) que une a las variables predictoras y constituye el límite que define si un elemento de entrada pertenece a una categoría o a la otra.
La mejor solución es aquella que permita un margen máximo entre los elementos de las dos categorías.
Se denominan vectores de soporte a los puntos que conforman las dos líneas paralelas al hiperplano, siendo la distancia entre ellas (margen) la mayor posible.
Existe un número infinito de posibles hiperplanos (líneas) que realicen la clasificación. La cuestión es:
¿cuál es la mejor y cómo la definimos?
Ejemplo gráfico
Soft margin: Errores de entrenamiento
Idealmente, el modelo basado en SVM debería producir un hiperplano que separe completamente los datos del universo estudiado en dos categorías.
Sin embargo, una separación perfecta no siempre es posible y, si lo es, el resultado del modelo no puede ser generalizado para otros datos. Esto se conoce como sobreajuste (overfitting).
Con el fin de permitir cierta flexibilidad, los SVM manejan un parámetro C que controla la compensación entre errores de entrenamiento y los márgenes rígidos, creando así un margen blando (soft margin) que permita algunos errores en la clasificación a la vez que los penaliza.
Ejemplo para caso de diagnóstico de cáncer utilizando imágenes
Los datos proceden de un estudio sobre diagnóstico del cáncer de mama por imagen y fue realizada siguiendo estos pasos: - Mediante una punción con aguja fina se extrae una muestra del tejido sospechoso de la paciente. - La muestra se tiñe para resaltar los núcleos de las células y se determinan los límites exactos de los núcleos. - Las variables consideradas corresponden a distintos aspectos de la forma del núcleo. - El fichero contiene un data.frame, llamado breast.cancer2, con 2 variables explicativas medidas en pacientes cuyos tumores fueron diagnosticados posteriormente como benignos o malignos y el factor y que toma los valores 0 o 1 en función de si la correspondiente fila corresponde a un tumor benigno o maligno respectivamente.
Nota
En los datos originales se considera un total de 30 variables explicativas. Hay 569 observaciones, de las que 357 corresponden a tumores benignos y 212 a tumores malignos.
#build scatter plot of training datasetlibrary(ggplot2)grafico_puntos <-ggplot(data = breast.cancer2, aes(x = x.smoothness, y = x.concavepoints, color = y)) +geom_point() +scale_color_manual(values =c("red", "blue"), labels =c("Benigno", "Maligno") )+labs(title = , x ='Smoothness', y ='Concavepoints')
SVM lineal
Para calcular la regla de clasificación SVM lineal con \(C=10\) , se usa la función svm del paquete e1071.
El primer argumento y~. indica que la variable y (que debe ser necesariamente un factor) se desea predecir en términos del resto de variables del fichero.
La sintaxis es similar a la que utilizaríamos para ajustar un modelo lineal o un modelo de regresión logística.
El segundo argumento indica el fichero en el que están las variables que vamos a usar.
El argumento kernel corresponde al núcleo que representa el producto escalar que queremos utilizar.
La opción linear corresponde a \(k(x,y)=x′y\) .
El argumento cost determina la penalización que ponemos a los errores de clasificación.
Con el fin de estimar la probabilidad de clasificar erróneamente una observación se puede utilizar validación cruzada, dividiendo la muestra en, por ejemplo, dos partes. Ello se consigue fijando cross=2.
Finalmente, scale=FALSE se usa para usar los datos no estandarizados (por defecto, sí se estandarizan).
Estimación del modelo en R
Librerías necesarias
library(MASS)library(e1071) # para hacer SVM
Modelo SVM (lineal)
C =10svm.lineal <-svm(y~., data = breast.cancer2, kernel ='linear', type="C-classification",cost = C, cross =2, scale =FALSE)summary(svm.lineal)
Observaciones
Hay 258 vectores soporte.
Usando validación cruzada con la muestra dividida en dos partes se estima una probabilidad de acierto en la clasificación de aproximadamente el 88%.
Podemos cambiar el parámetro de penalización para ver si estos valores aumentan o disminuyen.
Parámetros de salida del modelo SVM
SV: Los vectores de soporte resultantes (posiblemente escalados).
index: El índice de los vectores de soporte resultantes en la matriz de datos. Tenga en cuenta que este índice se refiere a los datos preprocesados (después del posible efecto de na.omit y subset)
coefs: Los coeficientes correspondientes multiplicados por las etiquetas de entrenamiento.
rho: El intercepto negativo.
sigma: En el caso de un modelo de regresión probabilística, el parámetro de escala de la distribución de Laplace hipotética (media cero) estimada por máxima verosimilitud.
probA, probB: vectores numéricos de longitud k(k-1)/2, k número de clases, que contienen los parámetros de las distribuciones logísticas ajustadas a los valores de decisión de los clasificadores binarios (1 / (1 + exp(a x + b))).
Modelo SVM (lineal) cambio del parámetro cost
# cambio del parametro CC <-10^3svm.lineal <-svm(y~., data = breast.cancer2, kernel ='linear', cost = C, cross =2, scale =FALSE)summary(svm.lineal)
Con toda esta información en el summary, es posible calcular el hiperplano (recta) que da la regla de clasificación.
La recta de clasificación es: \(w_0 + w'x=0\).
Los parámetros de esta recta, están contenidos en svm.lineal. (ver el código)
\(w = \sum_{i \in S} \alpha_i x_i\)
\(S\) el conjunto de índices de los vectores soporte.
Extracción de los parámetros del modelo
#extraemos los coeficientes y SVw=t(svm.lineal$coefs) %*% svm.lineal$SV# calculamos la pendiente y el intercepto# de la recta de clasificacion slope_1 <--w[1]/w[2]intercept_1 <- svm.lineal$rho/w[2]
Construcción del gráfico final de clasificación de puntos
#agregamos la recta de decision al graficorecta_decision <- grafico_puntos +geom_abline(slope = slope_1, intercept = intercept_1) # agregamos las fronteras de la recta de decision al graficografico_margenes <- recta_decision +geom_abline(slope = slope_1, intercept = intercept_1 -1/w[2], linetype ="dashed")+geom_abline(slope = slope_1, intercept = intercept_1 +1/w[2], linetype ="dashed")#display plotgrafico_margenes
Ajuste del modelo SVM
Crear datos train y test (entrenamiento y validación)
Generamos los datos train y test (entrenamiento y validación) para estudiar el comportamiento del modelo.
set.seed(123)#generamos una muestra de numeros aleatorios #equivalentes al 70% de todas las observacionesmuestra <-sample(1:nrow(breast.cancer2), size =nrow(breast.cancer2)*0.7, replace =FALSE)#usamos esos numeros aleatorios para #crear los datos de entrenamiento(train)train <- breast.cancer2[muestra, ]#usamos los nuemeros restantes para crear#los datos de de validacion (test)test <- breast.cancer2[-muestra, ]
Entrenamiento del modelo
Generamos el modelo SVM con los datos train (entrenamiento del modelo)
# cambio del parametro CC <-10^3svm.lineal.train <-svm(y~., data = train, kernel ='linear', cost = C, cross =2)summary(svm.lineal.train)
Validación del modelo
Generamos una clasificación de los datos test (predición dela clase) para ver que tan bueno es el modelo.
# prediccion de los resultados de clasificacion para el test# utilizar el modelo para predecir # la probabilidad de erroresy_pred <-predict(svm.lineal.train, newdata = test[,-3])
Evaluando los resultados de la clasificación (Matriz de confusión)
library(caret)#Creacion de la matriz de confusioncm <-confusionMatrix(data=y_pred, reference = test[, 3])cm
Observaciones sobre la matriz de confusión
También podemos calcular las siguientes métricas usando la matriz de confusión:
Sensibilidad (Sensitivity): la “tasa positiva verdadera”: el porcentaje de personas que el modelo predijo correctamente con tumor benigno.
Especificidad (Specificity): la “tasa negativa verdadera”: el porcentaje de personas que el modelo predijo correctamente que no tienen tumor benigno.
Tasa de clasificación errónea total (Total misclassification rate): el porcentaje de clasificaciones incorrectas totales realizadas por el modelo.