En este post veremos cómo funcionan los SVM en problemas de clasificación por medio de algunos ejemplos. Comenzaremos analizando las máquinas de vectores soporte o support vector machine en clasificación, en ocasiones denominadas support vector classifiers. Como es lo habitual, primero probamos sobre ejemplos sintéticos.
SVM en problemas de clasificación: ejemplos
#SVM en problemas de clasificación
#ejemplo1
ejemplo1 = pd.read_csv ("./data/ex2datal.txt", sep = " , ", header = None, names = ['x1', 'x2', 'label'])
#ejemplo2
ejemplo2 = pd.read_csv ("./data/ex2data2.txt", sep = " , ", header = None, names = ['x1', 'x2', 'label'])
#ejemplo 3: Problema XOR
np.random.seed (0)
# -- parameters
N = 800
mu = 1.5 #Cambia este valor
sigma = 1 #Cambia este valor
#variables auxiliares
unos = np.ones (int (N / 4))
random4 = sigma * np.random.randn (int (N / 4), 1)
random2 = sigma * np.random.randn (int (N / 2), 1)
# -- features
y3 = np.concatenate ([-1 * unos, unos, unos, -1 * unos])
X1 = np.concatenate ([-mu + random4, mu + random4, -mu + random4, mu + random4])
X2 = np.concatenate ([ + mu + random2, -mu + random2])
X3 = np.hstack ((X1, X2))
#SVM en problemas de clasificación
plt.figure (figsize = (15, 5))
plt.subplot (1, 3, 1)
plt.scatter (ejemplo1 ['x1'], ejemplo1 ['x2'], c = ejemplo1 ['label'], cmap = cm_bright)
plt.xlabel ("$x_1$", fontsize = 16)
plt.ylabel ("$x_2$", fontsize = 16)
plt.title ('Ejemplo 1')
plt.subplot (1, 3, 2)
plt.scatter (ejemplo2 ['x1'], ejemplo2 ['x2'], c = ejemplo2 ['label'], cmap = cm_bright)
plt.xlabel ("$x_1$", fontsize = 16)
plt.ylabel ("$x_2$", fontsize = 16)
plt.title ('Ejemplo 2')
plt.subplot (1, 3, 3)
plt.scatter (X3 [: , 0], X3 [: , 1], c = y3, cmap = cm_bright)
plt.xlabel ("$x_1$", fontsize = 16)
plt.ylabel ("$x_2$", fontsize = 16)
plt.title ('Ejemplo 3')
plt.tight_layout ()
plt.show ()
Ejemplo 1
#SVM en problemas de clasificación
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
#Ejemplo 1
#preparamos los datos
data1 = ejemplo1.values
X1= data1 [ : , 0 : 2]
y1 = data1 [ : , -1]
#creamos el modelo y ajustamos
svmModel1 = SVC (kernel = 'linear', probability = True)
svmModel1.fit (x1, y1)
plot_decision_boundary_svm (x1, y1, 0.05, svnModel1)
Hemos resaltado los vectores soporte, la frontera de separación y el margen.
Como el problema no es linealmente separable, observamos errores de clasificación que caen tanto dentro del margen como al otro lado de la frontera de separación correspondiente.
Sabemos que podemos permitir ciertos errores dentro del margen y los penalizamos con un coste C.
- Si tenemos un valor elevado del coste C, estaremos penalizando mucho los errores y, por tanto, se obtienen fronteras más ajustadas (mayor complejidad, mayor riesgo de overfitting, potenciales mejores prestaciones).
- Por otro lado, si tenemos un valor pequeño del coste C, no daremos mucha importancia a los errores y, por tanto, se obtienen fronteras menos ajustadas (menor complejidad, menor riesgo de overfitting, potenciales peores prestaciones).
Se puede modificar el coste C mediante el parámetro de mismo nombre en scikit-learn. Por defecto, C = 1.
#SVM en problemas de clasificación
svmModel1 = SVC (kernel = "linear", probability = True, C = 0.0001)
svmModel1.fit (x1, y1)
plot_decision_boundary_svm (x1, y1, 0.05, svmModel1)
#SVM en problemas de clasificación
svmModel1 = SVC (kernel = "linear", probability = True, C = 1e5)
svmModel1.fit (x1, y1)
plot_decision_boundary_svm (x1, y1, 0.05, svmModel1)
Ejemplos 2 y 3
Comenzamos por el ejemplo 2:
#SVM en problemas de clasificación
# preparamos los datos
data2 = ejemplo2.values
y2 = data2 [ : , -1]
X2 = data2 [ : , 0 : 2]
#creamos el modelo
svmModel2 = SVC (kernel = 'linear', probability = True) svmModel2.fit (x2, y2)
plot_decision_boundary_svm (X2, y2, 0.05, svmModel2)
Como podemos comprobar, un kernel lineal no nos sirve para generar una frontera de separación no lineal, así que tenemos que utilizar otros kernels.
#SVM en problemas de clasificación
#Ejemplo 3
#creamos el modelo
SvmModel3 = SVC (kernel = "linear", probability = True) svmModel3.fit (X3, y3)
plot_decision_boundary_svm (x3, y3, 0.05, svmModel3)
/tmp / ipykernel_164433/724428688.py : 26: UserWarning: No contour levels were found within the data range.
plt.contour (xx, yy. Zd, colors = [‘k’, ‘k’, ‘k’], linestyles = [‘–‘, ‘-‘, ‘–‘], levels = [-1, 0, 1])
/tmp / ipykernel_184433/724428688.py : 37 : UserWarning: No contour levels were found within the data range
plt.contour (xx, yy, Zd, colors = [‘k’, ‘k’, ‘k’], linestyles = [‘–‘, ‘-‘, ‘–‘], levels = [-1, 0, 1])
Como vemos, este último gráfico no nos sirve para nada, ya que son completamente aleatorios los datos dentro de él.
Si quieres seguir aprendiendo sobre Big Data, una de las disciplinas más demandadas en la actualidad, tenemos para ti el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva en la que aprenderás todo lo necesario para seguir formando tu camino profesional como data scientist. ¡No esperes más y solicita información ahora!