
La detección de anomalías es una de las aplicaciones del aprendizaje no supervisado más utilizadas. Siendo una técnica que se emplea en casos tan diferentes como la detección de ataques cibernéticos, la detección de problemas de salud o la identificación de aplicaciones fraudulentas en servicios financieros o seguros. En todos los casos, identificar anomalías requiere localizar unos pocos datos inusuales en los conjuntos de datos. En esta entrada, se analizará el algoritmo One-Class SVM (Support Vector Machine) para la detección de anomalías, basado en el uso de máquinas de vector soporte.
Fundamentos de One-Class SVM
One-Class SVM, o Máquinas de Vector Soporte de una Clase, es una técnica de aprendizaje automático utilizada para la detección de anomalías en conjuntos de datos. Un modelo de aprendizaje no supervisado. A diferencia de las Máquinas de Vector Soporte (SVM) tradicionales, ampliamente utilizadas en problemas de clasificación o regresión, One-Class SVM busca identificar una sola clase de datos, generalmente la clase ”normal” o ”habitual”, sin necesidad de datos de la clase ”anómala”.
El funcionamiento de One-Class SVM se basa en la premisa de que las anomalías tienden a estar alejadas de los casos normales en el espacio de características. Debido a que las anomalías son registros diferentes a los normales. Para modelar esta diferencia, el algoritmo busca una región en el espacio de características que contiene la mayoría de los datos normales. Esta región se define como el “hiperplano de separación”, y su objetivo es encapsular los datos normales mientras se minimiza la influencia de las anomalías.

El hecho de modelar la distribución de los datos normales en una sola región en el espacio de características hace que este algoritmo sea más adecuado para conjuntos de datos unimodales. Esto es, datos donde los datos normales tienden a agruparse en una única región. Así One-Class SVM puede delinear eficazmente la frontera entre los datos normales y las anomalías, identificando las instancias que están significativamente lejos de la región normal como anomalías.
Funcionamiento de One-Class SVM
El funcionamiento básico del algoritmo de One-Class SVM se puede resumir en los siguientes pasos:
- Entrenamiento del Modelo: El algoritmo ajusta un hiperplano de separación que encapsula la región que contiene la mayoría de los datos normales. Este hiperplano se ajusta de manera que maximiza el margen entre los puntos de datos normales y el hiperplano.
- Detección de anomalías: Una vez que se ha aprendido el modelo, se evalúa la distancia de cada punto de datos al hiperplano de separación. Los puntos de datos que están muy lejos del hiperplano se consideran anomalías.
Parámetros Importantes
A la hora de entrenar un modelo de One-Class SVM es importante conocer los hiperparámetros más importantes que pueden influir en el rendimiento de este. Similares a los usados en las máquinas de vector soporte para problemas de regresión o clasificación. Los hiperparámetros más importantes del modelo son los siguientes:
- Núcleo (
kernel
): Especifica el tipo de función de núcleo a utilizar en el algoritmo SVM. Algunas opciones comunes incluyen lineal, polinómica y radial (RBF). - Núcleo Radial (RBF) (
gamma
): Este parámetro controla la influencia de cada punto de datos en el ajuste del hiperplano. Un valor más bajo significa que los puntos de datos tienen un efecto más extendido. - Parámetro de Regularización (
nu
): Controla la cantidad de errores de clasificación permitidos. Un valor más alto permite más errores de clasificación, lo que puede ser útil cuando los datos son ruidosos o ambiguos.
Uso de One-Class SVM en scikit-learn
Scikit-learn, la biblioteca de aprendizaje automático de referencia en Python, ofrece una implementación eficaz de One-Class SVM. Además, como el resto de los modelos de scikit-learn son muy fáciles de utilizar. Así, para entrenar un modelo solamente se tiene que importar la clase y entrenar esta con un conjunto de datos:
from sklearn.svm import OneClassSVM # Crear el modelo One-Class SVM one_class_svm = OneClassSVM(kernel='rbf', gamma='auto', nu=0.05) # Entrenar el modelo one_class_svm.fit(data) # Predicción de anomalías anomaly_scores = one_class_svm.predict(data)
En este ejemplo, una vez importada la clase OneClassSVM
se crea un clasificador con este y se ajusta con el conjunto de datos. Empleando para ello el método fit()
de la clase. Una vez entrenado el moldeo se pueden obtener la puntuación con decision_function()
o predecir las anomalías con predict()
.
La puntuación de decisión es una medida de cuán lejos está cada muestra del hiperplano de separación. En One-Class SVM, cuanto menor sea la puntuación de decisión, más probable es que la muestra se considere como anomalía. Los valores negativos indican que la muestra se encuentra en la región anómala, mientras que los valores positivos se corresponden con muestras que están en la región normal.
Por otro lado, el método predict()
solamente pude clasificar las muestras como normales (1) o anómalas (-1) en base a los valores de la puntuación de decisión.
Caso práctico con One-Class SVM en scikit-learn
Ahora se puede crear un conjunto de datos sintético para ver cómo funciona la clase que implementa One-Class SVM en scikit-learn. Simplemente se puede usar la función make_moons()
para crear un conjunto de datos aleatorios al que se puede agregar anomalías con random.uniform()
de NumPy. Esto es lo que se hace en el siguiente ejemplo.
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_moons from sklearn.svm import OneClassSVM # Generar datos sintéticos con make_moons X, _ = make_moons(n_samples=1000, noise=0.1, random_state=42) # Introducir algunas anomalías anomalies = np.random.uniform(low=-1.5, high=2.5, size=(100, 2)) # Combinar datos normales y anomalías data = np.vstack([X, anomalies]) # Visualizar los datos con las anomalías en un color diferente plt.figure(figsize=(8, 6)) plt.scatter(data[:, 0], data[:, 1], alpha=0.7, c='blue', label='Datos') plt.scatter(anomalies[:, 0], anomalies[:, 1], color='red', label='Anomalías') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.title('Datos Generados con Anomalías') plt.legend() plt.show()

Como se puede ver en la gráfica las anomalías se repiten por todo el espacio, mientras que los casos normales entran en un par de lunas. Ahora se puede entrenar un modelo One-Class SVM como se explicó en la sección anterior.
# Entrenar One-Class SVM model = OneClassSVM(kernel='rbf', nu=0.10, gamma='auto') model.fit(data) # Predecir anomalías predictions = model.predict(data) # Visualizar los resultados con círculos sobre las anomalías plt.figure(figsize=(8, 6)) plt.scatter(data[:, 0], data[:, 1], alpha=0.7, c='blue', label='Datos') plt.scatter(data[predictions == -1][:, 0], data[predictions == -1][:, 1], facecolors='none', edgecolors='r', s=100, label='Anomalías Detectadas') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.title('Detención de Anomalías con One-Class SVM') plt.legend() plt.show()

En la nueva gráfica se puede ver como el modelo ha detectado la mayoría de las anomalías. Quizás se dejen las que están entre las dos lunas debido a que es un método que funciona bien con conjuntos de datos unimodales. Si se desea una mayor precisión en la predicción, se puede recurrir al método decision_function()
para obtener la puntuación de decisión y ver lo alejado que está cada punto de los datos normales.
# Obtener la puntuación de decisión para cada punto en el conjunto de datos decision_scores = model.decision_function(data) # Visualizar las puntuaciones de decisión plt.figure(figsize=(8, 6)) plt.scatter(data[:, 0], data[:, 1], c=decision_scores, cmap='coolwarm', alpha=0.7) plt.colorbar(label='Puntuación de Decisión') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.title('Puntuaciones de Decisión de One-Class SVM') plt.show()

En esta gráfica se puede ver que, cuanto más azul sea el color de un punto, más negativo es su puntuación de decisión y, por lo tanto, más probable es que el punto en concreto sea una anomalía.
Conclusiones
One-Class SVM es una excelente opción para la detección de anomalías en conjuntos de datos unimodales. Su capacidad para aprender a separar los datos normales de los anómalos de forma fácil hace que sea una interesante en muchas aplicaciones. Teniendo en cuenta que funciona mejor con datos unimodales, algo habitual en muchos casos reales.
Deja una respuesta