Máquina de vectores de soporte (SVM)

Nov 25 2022
Introducción Support Vector Machine es uno de los algoritmos de aprendizaje automático más populares. No solo se usa para clasificación, sino también para problemas de regresión.
SVM (Ref. geospasialis.com)

Introducción

Support Vector Machine es uno de los algoritmos de aprendizaje automático más populares. No solo se usa para clasificación, sino también para problemas de regresión. Pero mayormente, su uso se ha observado en problemas de clasificación en el área de aprendizaje automático. Muchas personas prefieren la máquina de vectores de soporte porque ofrece una precisión notable y utiliza menos potencia de procesamiento. La máquina de vectores de soporte segrega los datos a través de un hiperplano y el nuevo punto de datos se coloca en la categoría más adecuada. Este es el objetivo básico de Support Vector Machine. Este hiperplano también se conoce como límite de decisión de Support Vector Machine. Hay una variedad de hiperplanos diferentes que pueden usarse para dividir las dos clases de puntos de datos. Encontrar un plano con el mayor margen, es decir,

Ejemplo

Si queremos un modelo que pueda distinguir correctamente entre un gato y un perro, digamos que observamos un gato inusual que también se parece a un perro. Podemos construir un modelo de este tipo utilizando el algoritmo SVM. Antes de probarlo con este extraño animal, primero entrenaremos a nuestro modelo con varias fotografías de gatos y perros para que pueda familiarizarse con los diversos atributos de gatos y perros. Cuando un resultado, los casos extremos de gatos y perros serán vistos por el vector de soporte, ya que dibuja un borde de juicio entre estos dos conjuntos de datos (gato y perro). Los vectores de soporte se utilizarán para categorizarlo como un gato.

Fig. Ejemplo de SVM (ref: www.javatpoint.com)

Tipos de MVS

SVM lineal : el término "datos separables linealmente" se refiere a los datos que se pueden dividir en dos grupos usando solo una línea recta. SVM lineal se utiliza para clasificar dichos datos, y el clasificador utilizado se conoce como clasificador SVM lineal.

Fig. SVM lineal (Ref. www.javatpoint.com)

SVM no lineal: SVM no lineal se utiliza para datos separados de forma no lineal, lo que significa que si un conjunto de datos no se puede clasificar mediante el uso de una línea recta, dichos datos se denominan datos no lineales y el clasificador utilizado se denomina no -clasificador SVM lineal.

Fig. SVM no lineal (Ref. www.javatpoint.com)

Trabajando

SVM clasifica los puntos de datos incluso cuando no son separables linealmente de otro modo al asignar los datos a un espacio de características de alta dimensión. Una vez que se identifica un separador entre las categorías, los datos se convierten para habilitar la representación de hiperplano del separador. El grupo al que debe pertenecer un nuevo registro se puede predecir utilizando las características de los nuevos datos.

Función de costo y actualizaciones de gradiente

El objetivo del método SVM es aumentar la distancia entre los puntos de datos y el hiperplano. La pérdida articulada es la función de pérdida que ayuda a maximizar el margen.

Fig. Función de pérdida de bisagra (la función de la izquierda se puede representar como una función de la derecha)

Si el valor proyectado y el valor real tienen el mismo signo, no hay costo. De lo contrario, determinamos el valor de la pérdida. La función de costo también recibe un parámetro de regularización de nosotros. El objetivo del parámetro de regularización es lograr un equilibrio entre la maximización del margen y la pérdida. Las funciones de costo aparecen de la siguiente manera después de agregar el parámetro de regularización.

Higo. Función de pérdida para SVM

Ahora que tenemos la función de pérdida, podemos encontrar los gradientes tomando derivadas parciales con respecto a los pesos. Podemos modificar nuestros pesos usando los gradientes.

Fig. Gradientes

Solo necesitamos actualizar el gradiente del parámetro de regularización cuando no hay una clasificación incorrecta, es decir, cuando nuestro modelo predice correctamente la clase de nuestro punto de datos.

Fig. Actualización de gradiente: sin clasificación errónea

Para realizar una actualización de gradiente cuando hay una clasificación incorrecta, o cuando nuestro modelo predice incorrectamente la clase de un punto de datos, incluimos la pérdida junto con el parámetro de regularización.

Fig. Actualización de gradiente: clasificación errónea

Fragmento de programa de muestra

Importación de bibliotecas

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split

class SVM:
    def __init__(self, learning_rate=0.0001, lambda_param=0.001, n_iters=10000):
        self.weights = None
        self.bias =  None
        self.lr = learning_rate
        self.lambda_param = lambda_param
        self.n_iters = n_iters
    def fit(self,X,y):
        n_samples, n_features = X.shape
        
        y1 = np.where(y <= 0, -1, 1)
        
        self.weights = np.zeros(n_features)
        self.bias = 0
        for i in range(self.n_iters):
            for idx, x_i in enumerate(X):
                condition = y1[idx] * (np.dot(x_i, self.weights) - self.bias) >= 1
                if condition:
                    self.weights -= self.lr * (2 * self.lambda_param * self.weights)
                else:
                    self.weights -= self.lr * (2 * self.lambda_param * self.weights - np.dot(x_i, y1[idx]))
                    self.bias -= self.lr * y1[idx]
        
    def predict(self, X):
        approx = np.dot(X, self.weights) - self.bias
        return np.sign(approx)

def accuracy(y_true,y_pred):
    acc = np.sum(y_true == y_pred)/len(y_true)
    return acc
X, y =  datasets.make_blobs(n_samples=10, n_features=2, centers=2, cluster_std=1.05, random_state=40)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)
y = np.where(y == 0, -1, 1)
clf = SVM()
clf.fit(X_train,y_train)
predict = clf.predict(X_test)
svm_acc = accuracy(y_test,predict)
print('Accuracy:',svm_acc)
print(f'''
     Final Weight:{clf.weights}
     Final Bias:{clf.bias}
     ''')

Peso final:[0.34494241 0.1443094]
Sesgo final:-0.012899999999999977

Visualización

def visualize_svm():
    def get_hyperplane_value(x, w, b, offset):
        return (-w[0] * x + b + offset) / w[1]
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    plt.scatter(X[:,0], X[:,1], marker='x',c=y)

    x0_1 = np.amin(X[:,0])
    x0_2 = np.amax(X[:,0])

    x1_1 = get_hyperplane_value(x0_1, clf.weights, clf.bias, 0)
    x1_2 = get_hyperplane_value(x0_2, clf.weights, clf.bias, 0)

    x1_1_m = get_hyperplane_value(x0_1, clf.weights, clf.bias, -1)
    x1_2_m = get_hyperplane_value(x0_2, clf.weights, clf.bias, -1)

    x1_1_p = get_hyperplane_value(x0_1, clf.weights, clf.bias, 1)
    x1_2_p = get_hyperplane_value(x0_2, clf.weights, clf.bias, 1)

    ax.plot([x0_1, x0_2],[x1_1, x1_2], 'b--')
    ax.plot([x0_1, x0_2],[x1_1_m, x1_2_m], 'k')
    ax.plot([x0_1, x0_2],[x1_1_p, x1_2_p], 'k')

    x1_min = np.amin(X[:,1])
    x1_max = np.amax(X[:,1])
    ax.set_ylim([x1_min-3,x1_max+3])

    plt.show()

visualize_svm()

      
                
Fig. Output of SVM

Detección de rostros: SVMc clasifica partes de la imagen como rostro y no rostro y crea un límite cuadrado alrededor del rostro.

Categorización de texto e hipertexto: las SVM admiten modelos inductivos y transductivos para la clasificación de texto e hipertexto. Para clasificar los artículos en distintos grupos, se requieren datos de entrenamiento. Clasifica en función de la puntuación obtenida y luego contrasta con el valor umbral.
Clasificación de imágenes: las SVM mejoran la precisión de búsqueda para la clasificación de imágenes. En comparación con las estrategias de búsqueda convencionales basadas en consultas, ofrece una mayor precisión.
La clasificación de proteínas y la clasificación del cáncer son dos ejemplos de bioinformática. SVM se utiliza para clasificar genes, pacientes según sus genes y otras cuestiones biológicas.
Aplique algoritmos SVM para la detección de homología remota de proteínas y la detección de pliegues de proteínas.

Conclusión

Support Vector Machine es un poderoso algoritmo para la clasificación en el aprendizaje automático. Aunque también se puede usar para problemas de regresión, sugerimos usarlo principalmente para fines de clasificación. Se puede usar para datos lineales o no lineales y funciona bien. Sin embargo, es un algoritmo de aprendizaje supervisado, por lo que necesita datos etiquetados. Funciona mejor en conjuntos de datos más pequeños que en conjuntos complejos.

Referencias

Máquinas de vectores soporte

Una tarea en el hogar para la inferencia estadística (SI) por estudiantes de inteligencia artificial y ciencia de datos (AI & DS), Instituto de Tecnología Vishwakarma, Pune.

Preparado por:-

  1. Ajinkya Mahajan
  2. Aditya Bodhankar
  3. Riya Dhakalkar
  4. diksha prasad
  5. Shivani Mahajan