ML | Uso de SVM para realizar la clasificación en un conjunto de datos no lineal

Prerrequisito: Máquinas de vectores de soporte

Definición de un hiperplano y clasificador SVM:
para un conjunto de datos linealmente separable que tiene n características (por lo tanto, necesita n dimensiones para la representación), un hiperplano es básicamente un subespacio dimensional (n – 1) que se usa para separar el conjunto de datos en dos conjuntos, cada conjunto contiene datos puntos pertenecientes a una clase diferente. Por ejemplo, para un conjunto de datos que tiene dos características X e Y (por lo tanto, se encuentra en un espacio bidimensional), el hiperplano de separación es una línea (un subespacio unidimensional). De manera similar, para un conjunto de datos que tiene 3 dimensiones, tenemos un hiperplano de separación de 2 dimensiones, y así sucesivamente.
En el aprendizaje automático, Support Vector Machine (SVM) es un clasificador binario, lineal y no probabilístico que se utiliza para clasificar datos mediante el aprendizaje de un hiperplano que separa los datos.

Clasificación de un conjunto de datos separable no linealmente utilizando un SVM: un clasificador lineal:
como se mencionó anteriormente, SVM es un clasificador lineal que aprende un clasificador de (n – 1) dimensiones para la clasificación de datos en dos clases. Sin embargo, se puede utilizar para clasificar un conjunto de datos no lineal. ¡Esto se puede hacer proyectando el conjunto de datos en una dimensión superior en la que se puede separar linealmente!

Para obtener una mejor comprensión, consideremos el conjunto de datos de círculos.

# importing libraries
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles
from mpl_toolkits.mplot3d import Axes3D
  
# generating data
X, Y = make_circles(n_samples = 500, noise = 0.02)
  
# visualizing data
plt.scatter(X[:, 0], X[:, 1], c = Y, marker = '.')
plt.show()

El conjunto de datos es claramente un conjunto de datos no lineal y consta de dos características (por ejemplo, X e Y).

Para usar SVM para clasificar estos datos, introduzca otra característica Z = X 2 + Y 2 en el conjunto de datos. Por lo tanto, proyectar los datos bidimensionales en un espacio tridimensional. La primera dimensión que representa la característica X, la segunda que representa Y y la tercera que representa Z (que, matemáticamente, es igual al radio del círculo del que forma parte el punto (x, y)). Ahora, claramente, para los datos que se muestran arriba, los puntos de datos ‘amarillos’ pertenecen a un círculo de radio más pequeño y los puntos de datos ‘morados’ pertenecen a un círculo de radio más grande. Por lo tanto, los datos se vuelven linealmente separables a lo largo del eje Z.

# adding a new dimension to X
X1 = X[:, 0].reshape((-1, 1))
X2 = X[:, 1].reshape((-1, 1))
X3 = (X1**2 + X2**2)
X = np.hstack((X, X3))
  
# visualizing data in higher dimension
fig = plt.figure()
axes = fig.add_subplot(111, projection = '3d')
axes.scatter(X1, X2, X1**2 + X2**2, c = Y, depthshade = True)
plt.show()

Ahora, podemos usar SVM (o, para el caso, cualquier otro clasificador lineal) para aprender un hiperplano de separación bidimensional. Así es como se vería el hiperplano:

# create support vector classifier using a linear kernel
from sklearn import svm
  
svc = svm.SVC(kernel = 'linear')
svc.fit(X, Y)
w = svc.coef_
b = svc.intercept_
  
# plotting the separating hyperplane
x1 = X[:, 0].reshape((-1, 1))
x2 = X[:, 1].reshape((-1, 1))
x1, x2 = np.meshgrid(x1, x2)
x3 = -(w[0][0]*x1 + w[0][1]*x2 + b) / w[0][2]
  
fig = plt.figure()
axes2 = fig.add_subplot(111, projection = '3d')
axes2.scatter(X1, X2, X1**2 + X2**2, c = Y, depthshade = True)
axes1 = fig.gca(projection = '3d')
axes1.plot_surface(x1, x2, x3, alpha = 0.01)
plt.show()

Por lo tanto, usando un clasificador lineal podemos separar un conjunto de datos separable no linealmente.

Una breve introducción a los núcleos en el aprendizaje automático:
en el aprendizaje automático, se utiliza un truco conocido como «truco del núcleo» para aprender un clasificador lineal para clasificar un conjunto de datos no lineal. Transforma los datos linealmente inseparables en uno linealmente separable proyectándolos a una dimensión superior. Se aplica una función kernel en cada instancia de datos para mapear los puntos de datos no lineales originales en un espacio dimensional superior en el que se vuelven linealmente separables.

Publicación traducida automáticamente

Artículo escrito por savyakhosla y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *