Máquina de vectores de soporte (SVM)

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.
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.

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.

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.
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.
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.
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.
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.
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 soporteUna 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:-
- Ajinkya Mahajan
- Aditya Bodhankar
- Riya Dhakalkar
- diksha prasad
- Shivani Mahajan