• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Herramientas
    • Método D’Hondt – Atribución de escaños
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad
    • Tiendas afiliadas
      • AliExpress
      • Amazon
      • Banggood
      • GeekBuying
      • Lenovo

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • Python
  • Pandas
  • NumPy
  • Matlab
  • Julia
  • Excel
  • IA Generativa

One-Class SVM: Detección de anomalías con máquinas de vector soporte

marzo 15, 2024 Por Daniel Rodríguez Deja un comentario
Tiempo de lectura: 6 minutos

Gráfica con los datos y las anomalías detectadas con OneClass SVM

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.

Consistencia en nombres y orden en TypeScript: la base de un código mantenible aplicado a tslane
En Analytics Lane
Consistencia en nombres y orden en TypeScript: la base de un código mantenible aplicado a tslane

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.

Publicidad


Funcionamiento de One-Class SVM

El funcionamiento básico del algoritmo de One-Class SVM se puede resumir en los siguientes pasos:

  1. 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.
  2. 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.

Publicidad


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()
Conjunto de datos creado con make_moons para la detección de anomalías
Conjunto de datos en el que se muestran dos lunas y un conjunto de datos aleatorios que se pueden considerar anomalías

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()
Gráfica con los datos y las anomalías detectadas con OneClass SVM
Las anomalías detectadas por el algoritmo en el conjunto de datos creado anteriormente

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()
Representación gráfica de la puntuación de decisión
Puntuación de decisión asociada a cada uno de los puntos del conjunto de datos

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.

Publicidad


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.

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicaciones relacionadas

  • Consistencia en nombres y orden en TypeScript: la base de un código mantenible aplicado a tslane
  • Análisis de Redes con Python
  • Nuevo calendario de publicaciones: más calidad, mejor ritmo
  • Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • Cómo eliminar las noticias en Windows 11 y recuperar tu concentración
  • Publicaciones de verano 2025: los trucos más populares, ahora en vídeo
  • Cómo enviar correos desde PowerShell utilizando Brevo: Guía paso a paso para automatizar tus notificaciones
  • Nueva herramienta disponible: Calculadora del Método D’Hondt para la atribución de escaños
  • Cómo enviar correos desde Python utilizando Brevo: Automatiza tus notificaciones con scripts eficientes

Publicado en: Ciencia de datos Etiquetado como: Aprendizaje no supervisado, Detección de anomalías, Machine learning, Scikit-Learn

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

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

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

¡Nuevo video! Gráficos de barras en Matplotlib sin complicarte

julio 17, 2025 Por Daniel Rodríguez

¡Nuevo video! Iterar filas en Pandas sin romperte la cabeza

julio 15, 2025 Por Daniel Rodríguez

¡Nuevo video! Encuentra la posición en listas como un PRO

julio 10, 2025 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Obtención de valores únicos de una columna con Pandas publicado el mayo 8, 2019 | en Python
  • Cómo encontrar la posición de elementos en una lista de Python publicado el abril 12, 2021 | en Python
  • Combinar varios archivos Jupyter Notebook en uno publicado el noviembre 21, 2022 | en Python
  • Gráficos de barras en Matplotlib publicado el julio 5, 2022 | en Python
  • pandas Pandas: Cómo iterar sobre las filas de un DataFrame en Pandas publicado el septiembre 13, 2021 | en Python

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.5 (10)

Diferencias entre var y let en JavaScript

Publicidad

Comentarios recientes

  • Piera en Ecuaciones multilínea en Markdown
  • Daniel Rodríguez en Tutorial de Mypy para Principiantes
  • Javier en Tutorial de Mypy para Principiantes
  • javier en Problemas con listas mutables en Python: Cómo evitar efectos inesperados
  • soldado en Numpy básico: encontrar la posición de un elemento en un Array de Numpy

Publicidad


Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2025 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto