Inteligencia Analítica de Datos con R

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:

\[\beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_px_p = 0\]

y de igual manera, todos los puntos definidos por el vector (\(x=x_1,x_2, \dots, x_p\)) que cumplen la ecuación pertenecen al hiperplano.

Hiperplano y Clasificador de margen máximo (Maximal Margin Classifier)

Cuando \(x\) no satisface la ecuación:

\[\beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_px_p < 0\]

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:

  1. 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”.
  2. 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.

Lectura de datos

#load(url('https://verso.mat.uam.es/~joser.berrendero/datos/practica-svm-io.RData'))

load("/home/rober/Downloads/practica-svm-io.RData")
head(breast.cancer2)

Representación gráfica de los datos

#build scatter plot of training dataset
library(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 = 10
svm.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 C
C <- 10^3
svm.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 SV
w=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 grafico
recta_decision <- grafico_puntos + 
                    geom_abline(slope = slope_1, 
                                intercept = intercept_1) 

# agregamos las fronteras de la recta de decision al grafico
grafico_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 plot
grafico_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 observaciones
muestra <- 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 C
C <- 10^3
svm.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 errores
y_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 confusion
cm <- 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.
#Sensibilidad
sensitivity(test$y, y_pred)

#Especificidad
specificity(test$y, y_pred)

#Tasa de clasificación errónea total
Accuracy = as.vector(cm$overall[1]) 
misclassification_rate = 1 - Accuracy
misclassification_rate

Tuning (“sintonizar”) el modelo SVM

Usando tune.svm()

Veamos como podemos sintonizar el modelo svm, con el uso de la función tune.svm().

  • Lo usará para obtener los valores óptimos para los parámetros de cost, gamma y coef0 para un modelo SVM basado en el conjunto de datos separables.
  • Establezca los rangos de búsqueda de parámetros de la siguiente manera:
    • cost (costo): de 0.1 (10^(-1)) a 100 (10^3) en múltiplos de 10.
    • gamma y coef0: uno de los siguientes valores: 0.1, 1 y 10.
#sintonizar modelo
svm.lineal.tune <- tune.svm(x = train[, -3], y = train[, 3],
                            type = "C-classification",
                            kernel = "linear", degree = 2, cost = 10^(-1:3),
                            gamma = c(0.1, 1, 10), coef0 = c(0.1, 1, 10))

Valores óptimos

#enumerar valores óptimos
svm.lineal.tune$best.parameters

Ejercicios

Ejercicio 1:

Realizar un análisis con los datos de la base breast.cancer2, usando los kernels gausiano y radial. ¿Qué puede concluir?.

Ejercicio 2:

Ir a la página de Kaggle, descargar los datos social-network-ads y realizar una clasificación en donde la variable respuesta sea Purchased.