Máquinas de Soporte Vectorial en Python

 Introducción.-

La máquina de soporte vectorial (SVM, por sus siglas en inglés) es un modelo de aprendizaje supervisado que se utiliza en el campo de la ciencia de datos y el aprendizaje automático. Este modelo es especialmente eficaz para la clasificación y la regresión en conjuntos de datos de alta dimensión.

Las SVM, son métodos de clasificación basado en discriminantes lineales de márgen máximo, es decir, el objetivo es encontrar el hiperplano óptimo que maximiza la brecha o el margen entre las clases. Además, podemos usar el truco del núcleo para encontrar el límite de decisión no lineal óptimo entre las clases, que corresponde a un hiperplano en un espacio "no lineal" de alta dimensión.

Los Vectores de soporte y margen son puntos de datos más cercanos al hiperplano son conocidos como vectores de soporte. El SVM maximiza el margen entre estos vectores de soporte y el hiperplano. Cuanto mayor es el margen, mejor es la generalización del modelo. Cuando los datos no son linealmente separables, las SVM utilizan una técnica conocida como "kernel trick". Esto permite mapear los datos a un espacio de mayor dimensión donde puedan ser linealmente separables. Los kernels comunes incluyen el polinomial, radial (RBF) y sigmoidal.

Dentro de las ventajas de las SVM se tienen que son eficaces en espacios de alta dimensión y cuando los datos no son linealmente separables. Son menos propensas al sobreajuste, especialmente en casos donde el número de dimensiones es mayor que el número de muestras. y la desventajas que se tiene en estos modelos SVM es que pueden ser ineficientes en conjuntos de datos muy grandes y no funcionan bien con un alto nivel de ruido y solapamiento entre clases.

Antecedentes.-

Los antecedentes de las Máquinas de Soporte Vectorial (SVM) se remontan a varias décadas atrás y están estrechamente vinculados con el desarrollo de la teoría del aprendizaje estadístico y la inteligencia artificial. A continuación, se presenta una cronología de los hitos más importantes en la evolución de las SVM:

Década de 1960 - Orígenes en la Teoría de Aprendizaje Estadístico: Las SVM tienen sus raíces en el trabajo de Vladimir Vapnik y Alexey Chervonenkis. En 1963, estos investigadores soviéticos introdujeron lo que más tarde se conocería como la "dimensión VC" (por Vapnik-Chervonenkis), un concepto fundamental en la teoría del aprendizaje estadístico.

Años 70 - Concepto de Separación Lineal: Vapnik y Chervonenkis, junto con otros colaboradores, continuaron desarrollando la teoría de aprendizaje estadístico. Durante este período, plantearon la idea de un clasificador lineal óptimo, que fue el precursor directo de las SVM. Este enfoque se centraba en maximizar el margen entre las clases de datos.

1992 - Introducción del 'Kernel Trick': A principios de los años 90, Bernhard Boser, Isabelle Guyon y Vladimir Vapnik introdujeron el concepto del "kernel trick", permitiendo que las SVM se aplicaran eficazmente a datos no linealmente separables. Este fue un avance significativo, ya que amplió enormemente la aplicabilidad de las SVM a una variedad de problemas de clasificación y regresión.

Mediados de los 90 - Popularización y Expansión: Las SVM ganaron popularidad rápidamente en la comunidad de aprendizaje automático después de la introducción del kernel trick. Su capacidad para manejar espacios de características de alta dimensión y su robustez frente a los modelos sobreajustados las convirtieron en una herramienta atractiva para muchos investigadores y profesionales.

Finales de los 90 y 2000s - Aplicaciones y Desarrollos: Las SVM encontraron aplicaciones en una variedad de campos, desde el reconocimiento de patrones hasta la bioinformática. Durante este tiempo, se desarrollaron numerosas variantes y mejoras, como las SVM para regresión (SVR) y las técnicas para manejar conjuntos de datos grandes y desequilibrados.

Era Moderna - Integración con Otros Métodos: En las últimas dos décadas, las SVM han sido combinadas con otras técnicas y enfoques de aprendizaje automático, como los métodos de ensamble y el aprendizaje profundo. Aunque las redes neuronales profundas han ganado prominencia en muchas aplicaciones, las SVM siguen siendo una herramienta poderosa y relevante en el arsenal del aprendizaje automático.

Planteamiento del problema.-

La definición matemática de un hiperplano es bastante simple, en el caso de dos dimensiones, el hiperplano se describe acorde a la ecuacion de una recta:

$$\beta_0+ \beta_1x_1 + \beta_2 x_2 =0$$

Donde los parámetros $\beta_0, \beta_1$ y $\beta_2$, todos los pares de valores $x = (x_1, x_2)$ para los que se cumple la igualdad son untos del hiperplano. Esta Ecuación puede generalizarse para p-dimensiones:

$$\beta_0 + \beta_1x_1 + \beta_2 x_2 + \ldots + \beta_p x_p =0$$

Los puntos que cumplen la ecuación pertenecen al hiperplano

Cuando $x$ no satisface a la ecuación 

$$\beta_0 + \beta_1x_1 + \beta_2 x_2 + \ldots + \beta_p x_p  < 0$$

o bien 

$$\beta_0 + \beta_1x_1 + \beta_2 x_2 + \ldots + \beta_p x_p  > 0$$

El punto $x$  cae a un lado o al otro lado del hiperplano, se puede entender que un hiperplano divide un espacio p-dimensional en dos mitados. Para saber en qué lado del hiperplano se encuentra un determinado punto $x$, solo hay que calcular el signo de la ecuación.

Sin embargo, se necesita que los datos (los puntos $x$) sean linealmente separables:

Ejemplo:



La tarea de SVM es encontrar el hiperplano que maximiza el margen $\dfrac{1}{||w||}$ , sujeto a las $n$ restricciones dadas, los cuales son: $y_i (w^t x_i+b)\geq 1$, para todos los puntos $x_i \in D$, donde $D$ es el dataset, Observe que en lugar de maximizar el margen $\dfrac{1}{||w||}$ , podemos minimizar $||w||$. De hecho, podemos obtener una formulación de minimización equivalente, dada como sigue: $$\begin{aligned}\text{Función Objetivo: }& \underset{w,b}{min}\left\{ \dfrac{||w||^2}{2}\right\} \\ \text{Restricciones lineales: } & y_i (w^t x_i + b) \geq 1, \ \forall x_i \in D\\ \end{aligned}$$

Ejemplo aplicativo.-

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix

# Crear un DataFrame de pandas con datos ficticios
# Supongamos que tenemos dos características (feature1, feature2) y una etiqueta binaria
np.random.seed(0)  # Para reproducibilidad
data = {
    'feature1': np.random.randn(100),
    'feature2': np.random.randn(100),
    'label': np.random.randint(0, 2, 100)  # 0 o 1
}
df = pd.DataFrame(data)

# Dividir los datos en características (X) y etiqueta (y)
X = df[['feature1', 'feature2']]
y = df['label']

# 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=0)

# Estandarizar las características
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Crear y entrenar el clasificador SVM
svm_classifier = SVC(kernel='linear')  # Se puede cambiar el kernel a 'rbf', 'poly', etc.
svm_classifier.fit(X_train, y_train)

# Realizar predicciones
y_pred = svm_classifier.predict(X_test)

# Evaluar el clasificador
print("Matriz de confusión:")
print(confusion_matrix(y_test, y_pred))
print("\nInforme de clasificación:")
print(classification_report(y_test, y_pred))

Matriz de confusión: [[11 5] [ 8 6]] Informe de clasificación: precision recall f1-score support 0 0.58 0.69 0.63 16 1 0.55 0.43 0.48 14 accuracy 0.57 30 macro avg 0.56 0.56 0.55 30 weighted avg 0.56 0.57 0.56 30


Este script realiza los siguientes pasos:

Crea un conjunto de datos ficticios con dos características (feature1 y feature2) y una etiqueta binaria (label).

Divide los datos en características (X) y etiqueta (y), y luego en conjuntos de entrenamiento y prueba.

Estandariza las características, que es un paso importante para las SVM.

Entrena un clasificador SVM con un kernel lineal. Puedes cambiar el kernel para experimentar.

Realiza predicciones en el conjunto de prueba.

Evalúa el clasificador usando la matriz de confusión y el informe de clasificación.


Analisis exploratorio de datos.-

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Crear el DataFrame con datos ficticios (repetimos el paso anterior)
np.random.seed(0)
data = {
    'feature1': np.random.randn(100),
    'feature2': np.random.randn(100),
    'label': np.random.randint(0, 2, 100)
}
df = pd.DataFrame(data)

# Visualización básica de los datos

# Histogramas de las características
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
sns.histplot(df['feature1'], kde=True, bins=20, color='blue')
plt.title('Histograma de Feature 1')

plt.subplot(1, 2, 2)
sns.histplot(df['feature2'], kde=True, bins=20, color='green')
plt.title('Histograma de Feature 2')
plt.show()

# Diagrama de caja para cada característica
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
sns.boxplot(y=df['feature1'], color='blue')
plt.title('Boxplot de Feature 1')

plt.subplot(1, 2, 2)
sns.boxplot(y=df['feature2'], color='green')
plt.title('Boxplot de Feature 2')
plt.show()

# Diagrama de dispersión de las características con la etiqueta como color
sns.scatterplot(x='feature1', y='feature2', hue='label', data=df)
plt.title('Dispersión de Feature 1 vs Feature 2 con Etiqueta')
plt.show()

# Matriz de correlación
corr_matrix = df.corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title('Matriz de Correlación')
plt.show()






Conclusiones.-

A partir del código y los análisis realizados, podemos extraer varias conclusiones importantes tanto sobre el conjunto de datos ficticio como sobre el uso de las Máquinas de Soporte Vectorial (SVM) y el Análisis Exploratorio de Datos (EDA) en Python:

EDA Como Herramienta Clave: El Análisis Exploratorio de Datos (EDA) ha demostrado ser una herramienta esencial para entender mejor el conjunto de datos antes de aplicar cualquier modelo de aprendizaje automático. Nos permite visualizar y comprender las distribuciones de las características, detectar posibles valores atípicos y entender las relaciones entre variables.

Distribución de Características: Los histogramas y boxplots revelaron cómo se distribuyen las características 'feature1' y 'feature2'. Esta información es crucial para identificar patrones, posibles errores en los datos y necesidades de normalización o estandarización.

Relaciones entre Características y Etiquetas: El diagrama de dispersión con la coloración según las etiquetas proporciona una visión intuitiva de cómo las características se relacionan entre sí y cómo se agrupan las diferentes clases. Esto es especialmente importante para algoritmos como las SVM, que dependen de la separabilidad de las clases.

Correlación entre Características: La matriz de correlación ofrece una visión rápida de las posibles interdependencias entre las características. En aprendizaje automático, las características altamente correlacionadas pueden llevar a la redundancia y afectar el rendimiento del modelo.

Aplicación de SVM: La implementación de la SVM con un kernel lineal en este conjunto de datos ficticios demostró cómo este algoritmo puede ser aplicado para tareas de clasificación. La elección del kernel y la parametrización son pasos cruciales que pueden influir significativamente en el rendimiento del modelo.

Importancia de la Estandarización: El proceso de estandarizar las características antes de aplicar la SVM es crucial debido a la sensibilidad del modelo a la escala de los datos. Esto afecta la decisión sobre el margen y los vectores de soporte.

Evaluación del Modelo: El uso de la matriz de confusión y el informe de clasificación nos permite evaluar el rendimiento del clasificador SVM. Estas métricas son esenciales para comprender la precisión, la recuperación (recall) y la precisión (f1-score) del modelo.

Flexibilidad de Python en el Aprendizaje Automático: Este ejemplo demuestra la versatilidad y facilidad de uso de Python y sus bibliotecas en la implementación de algoritmos de aprendizaje automático y análisis de datos.


Bibliografia.-


"Python Data Science Handbook" por Jake VanderPlas

"Introduction to Machine Learning with Python: A Guide for Data Scientists" por Andreas C. Müller & Sarah Guido



Comentarios

Entradas populares de este blog

Utilizando Gráficas Multivariantes con Python