Las Máquinas de Soporte Vectorial (SVM, por sus siglas en inglés) son un conjunto de algoritmos supervisados utilizados para clasificación y regresión. Son especialmente conocidas por su capacidad para manejar problemas de clasificación binaria y su eficacia en espacios de alta dimensión.

Conceptos Clave

  1. Hiperplano Separador

El objetivo principal de una SVM es encontrar el hiperplano que mejor separa las clases en el espacio de características. En un problema de clasificación binaria, este hiperplano es una línea en 2D, un plano en 3D, y un hiperplano en dimensiones superiores.

  1. Margen

El margen es la distancia entre el hiperplano separador y los puntos de datos más cercanos de cada clase. SVM busca maximizar este margen para mejorar la generalización del modelo.

  1. Vectores de Soporte

Los vectores de soporte son los puntos de datos que están más cerca del hiperplano y que definen su posición. Estos puntos son cruciales para la construcción del hiperplano óptimo.

  1. Función de Kernel

Las SVM pueden utilizar funciones de kernel para transformar los datos en un espacio de mayor dimensión donde un hiperplano puede separar las clases más fácilmente. Los kernels comunes incluyen:

  • Lineal
  • Polinómico
  • Radial Basis Function (RBF)
  • Sigmoide

Ejemplo Práctico

Vamos a implementar una SVM para un problema de clasificación binaria utilizando Python y la biblioteca scikit-learn.

Paso 1: Importar las Bibliotecas Necesarias

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

Paso 2: Cargar y Preparar los Datos

Usaremos el conjunto de datos Iris, que es un clásico en problemas de clasificación.

# Cargar el conjunto de datos Iris
iris = datasets.load_iris()
X = iris.data[:, :2]  # Usamos solo las dos primeras características para visualización
y = iris.target

# Filtramos solo dos clases para simplificar a un problema binario
X = X[y != 2]
y = y[y != 2]

# Dividir los datos en conjuntos de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

Paso 3: Entrenar el Modelo SVM

# Crear el modelo SVM con un kernel lineal
model = SVC(kernel='linear')

# Entrenar el modelo
model.fit(X_train, y_train)

Paso 4: Evaluar el Modelo

# Realizar predicciones
y_pred = model.predict(X_test)

# Evaluar el rendimiento del modelo
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)

print(f"Accuracy: {accuracy}")
print("Confusion Matrix:")
print(conf_matrix)
print("Classification Report:")
print(class_report)

Paso 5: Visualizar el Hiperplano

# Función para visualizar el hiperplano
def plot_decision_boundary(X, y, model):
    h = .02  # Paso en la malla
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.title('SVM Decision Boundary')
    plt.show()

# Visualizar el hiperplano
plot_decision_boundary(X_test, y_test, model)

Ejercicio Práctico

Ejercicio 1: Implementar una SVM con Kernel RBF

  1. Modifica el código anterior para utilizar un kernel RBF en lugar de un kernel lineal.
  2. Evalúa el rendimiento del modelo con el nuevo kernel.
  3. Visualiza el hiperplano de decisión.

Solución

# Crear el modelo SVM con un kernel RBF
model_rbf = SVC(kernel='rbf')

# Entrenar el modelo
model_rbf.fit(X_train, y_train)

# Realizar predicciones
y_pred_rbf = model_rbf.predict(X_test)

# Evaluar el rendimiento del modelo
accuracy_rbf = accuracy_score(y_test, y_pred_rbf)
conf_matrix_rbf = confusion_matrix(y_test, y_pred_rbf)
class_report_rbf = classification_report(y_test, y_pred_rbf)

print(f"Accuracy with RBF Kernel: {accuracy_rbf}")
print("Confusion Matrix with RBF Kernel:")
print(conf_matrix_rbf)
print("Classification Report with RBF Kernel:")
print(class_report_rbf)

# Visualizar el hiperplano
plot_decision_boundary(X_test, y_test, model_rbf)

Conclusión

En esta sección, hemos aprendido sobre las Máquinas de Soporte Vectorial (SVM), sus conceptos clave y cómo implementarlas utilizando Python y scikit-learn. Las SVM son herramientas poderosas para problemas de clasificación y regresión, especialmente en espacios de alta dimensión. Hemos visto cómo cambiar el kernel puede afectar el rendimiento del modelo y cómo visualizar el hiperplano de decisión.

En el siguiente módulo, exploraremos los algoritmos de Machine Learning No Supervisado, comenzando con el clustering K-means.

Curso de Machine Learning

Módulo 1: Introducción al Machine Learning

Módulo 2: Fundamentos de Estadística y Probabilidad

Módulo 3: Preprocesamiento de Datos

Módulo 4: Algoritmos de Machine Learning Supervisado

Módulo 5: Algoritmos de Machine Learning No Supervisado

Módulo 6: Evaluación y Validación de Modelos

Módulo 7: Técnicas Avanzadas y Optimización

Módulo 8: Implementación y Despliegue de Modelos

Módulo 9: Proyectos Prácticos

Módulo 10: Recursos Adicionales

© Copyright 2024. Todos los derechos reservados