Data Science How-To's

Detección de anomalías en el aprendizaje automático utilizando Python

Read this post in other languages:

En los últimos años, muchas de nuestras aplicaciones se han visto impulsadas por el gran volumen de datos que somos capaces de recopilar y procesar. Se podría decir que estamos en la era de los datos. Uno de los aspectos esenciales del manejo de una cantidad tan ingente de datos es la detección de anomalías: procesos que nos permiten identificar valores atípicos, datos que se salen de los límites de lo esperado y demuestran un comportamiento fuera de la norma. En la investigación científica, los puntos de datos anómalos podrían ser causa de problemas técnicos y habría que descartarlos a la hora de sacar conclusiones, o podrían conducir a nuevos descubrimientos.

En este artículo del blog, veremos por qué es útil emplear el aprendizaje automático para la detección de anomalías y exploraremos técnicas clave para detectar anomalías utilizando Python. Aprenderá a implementar métodos populares como OneClassSVM y Isolation Forest, verá ejemplos de cómo visualizar estos resultados y comprenderá cómo aplicarlos a problemas del mundo real.

¿Dónde se utiliza la detección de anomalías?

La detección de anomalías también ha formado una parte crucial de la inteligencia empresarial moderna, ya que proporciona información sobre lo que podría ir mal y también puede identificar problemas potenciales. He aquí algunos ejemplos del uso de la detección de anomalías en la empresa actual.

Alertas de seguridad

Hay algunos ataques de ciberseguridad que pueden detectarse mediante la detección de anomalías; por ejemplo, un pico en el volumen de solicitudes puede indicar un ataque DDoS, mientras que un comportamiento sospechoso de inicio de sesión, como varios intentos fallidos, puede indicar un acceso no autorizado. La detección de comportamientos sospechosos de los usuarios puede indicar posibles amenazas a la ciberseguridad, y las empresas pueden actuar en consecuencia para prevenir o minimizar los daños.

Detección del fraude

En las organizaciones financieras, por ejemplo, los bancos pueden utilizar la detección de anomalías para destacar actividades sospechosas en las cuentas, que pueden ser un indicio de actividades ilegales como el blanqueo de dinero o la usurpación de identidad. Las transacciones sospechosas también pueden ser un signo de fraude con tarjeta de crédito.

Observabilidad

Una de las prácticas habituales para los servicios web es recopilar métricas del rendimiento en tiempo real del servicio si se produce un comportamiento anómalo en el sistema. Por ejemplo, un pico en el uso de la memoria puede mostrar que algo en el sistema no está funcionando correctamente, y puede que los ingenieros deban solucionarlo inmediatamente para evitar una interrupción del servicio.

¿Por qué utilizar el aprendizaje automático para la detección de anomalías?

Aunque los métodos estadísticos tradicionales también pueden ayudar a encontrar valores atípicos, el uso del aprendizaje automático para la detección de anomalías ha supuesto un cambio en las reglas del juego. Con los algoritmos de aprendizaje automático se pueden analizar datos más complejos (por ejemplo, con múltiples parámetros) de una sola vez. Las técnicas de aprendizaje automático también proporcionan un medio para analizar datos categóricos que no son fáciles de analizar utilizando métodos estadísticos tradicionales, que son más adecuados para datos numéricos.

Muchas veces, estos algoritmos de detección de anomalías se programan y pueden implementarse como una aplicación (consulte nuestro tutorial FastAPI para el aprendizaje automático) y ejecutarse según se solicite o a intervalos programados para detectar cualquier anomalía. Esto significa que pueden impulsar acciones inmediatas dentro de la empresa y también pueden utilizarse como herramientas de información para que los equipos de inteligencia empresarial revisen y ajusten las estrategias.

Tipos de técnicas y algoritmos de detección de anomalías

En general, existen dos tipos principales de detección de anomalías: la detección de valores atípicos y la detección de novedades.

Detección de valores atípicos

La detección de valores atípicos se denomina a veces detección de anomalías no supervisada, ya que se supone que en los datos de entrenamiento existen algunas anomalías no detectadas (por tanto, no etiquetadas), y el enfoque consiste en utilizar algoritmos de aprendizaje automático no supervisados para seleccionarlas. Algunos de estos algoritmos son las máquinas de vectores de apoyo (SVM) de una clase, Isolation Forest, Local Outlier Factor y Elliptic Envelope.

Detección de novedades

Por otro lado, la detección de novedades se denomina a veces detección de anomalías semisupervisada. Puesto que suponemos que todos los datos de entrenamiento no consisten únicamente en anomalías, todos se etiquetan como normales. El objetivo es detectar si los nuevos datos son una anomalía o no, lo que a veces se denomina una novedad. Los algoritmos utilizados en la detección de valores atípicos también pueden emplearse para la detección de novedades, siempre que no haya anomalías en los datos de entrenamiento.

Aparte de la detección de valores atípicos y la detección de novedades mencionadas, también es muy común requerir la detección de anomalías en los datos de series temporales. Sin embargo, dado que el enfoque y la técnica utilizados para los datos de series temporales suelen ser diferentes de los algoritmos mencionados anteriormente, hablaremos de ellos en detalle más adelante.

Ejemplo de código: búsqueda de anomalías en el conjunto de datos de colmenas

En este artículo del blog, utilizaremos este conjunto de datos de colmenas como ejemplo para detectar cualquier anomalía en las colmenas. Este conjunto de datos proporciona varias mediciones de la colmena (incluidas la temperatura y la humedad relativa) en varios momentos.

Aquí mostraremos dos métodos muy diferentes para descubrir anomalías. Son OneClassSVM, que se basa en la tecnología de máquina de vectores de soporte, que utilizaremos para trazar los límites de decisión, y Isolation Forest, que es un método de conjunto similar a Random Forest.

Ejemplo: OneClassSVM

En este primer ejemplo, utilizaremos los datos de la colmena 17, suponiendo que las abejas mantendrán su colmena en un entorno agradable constante para la colonia; podemos observar si esto es cierto y si hay momentos en los que la colmena sufre anomalías en los niveles de temperatura y humedad relativa. Utilizaremos OneClassSVM para ajustar nuestros datos y observar los límites de la toma de decisiones en un gráfico de dispersión.

«SVM» en OneClassSVM son las siglas de support vector machine (máquina de vectores de soporte), que es un algoritmo popular de aprendizaje automático para la clasificación y las regresiones. Mientras que las máquinas de vectores soporte pueden utilizarse para clasificar puntos de datos en dimensiones elevadas, al elegir un núcleo y un parámetro escalar para definir una frontera podemos crear una frontera de decisión que incluya la mayoría de los puntos de datos (datos normales), al tiempo que retenemos un pequeño número de anomalías fuera de las fronteras para representar la probabilidad (nu) de encontrar una nueva anomalía. El método de utilizar máquinas de vectores de soporte para la detección de anomalías se trata en un artículo de Scholkopf et al. titulado Estimating the Support of a High-Dimensional Distribution.

1. Inicie un proyecto de Jupyter

Al iniciar un nuevo proyecto en PyCharm (Professional 2024.2.2), seleccione Jupyter en Python.

Iniciar un proyecto de Jupyter en PyCharm

La ventaja de utilizar un proyecto Jupyter (antes también conocido como proyecto científico) en PyCharm es que se genera una estructura de archivos para usted, que incluye una carpeta para almacenar sus datos y una carpeta para almacenar todos los notebooks de Jupyter, de modo que pueda guardar todos sus experimentos en un único lugar. 

Proyectos Jupyter en PyCharm

Otra gran ventaja es que podemos representar gráficos muy fácilmente con Matplotlib. Lo verá en los pasos siguientes.

2. Instale dependencias

Descargue requirements.txt del repositorio GitHub correspondiente. Una vez que lo sitúe en el directorio del proyecto y lo abra en PyCharm, verá un aviso pidiéndole que instale las bibliotecas que faltan.

Instalar dependencias en PyCharm

Haga clic en Install requirements y se instalarán todos los requisitos automáticamente. En este proyecto utilizamos Python 3.11.1.

3. Importe e inspeccione los datos

Puede descargar el conjunto de datos «Beehives» (Colmenas) de Kaggle o de este repositorio de GitHub. Coloque los tres CSV en la carpeta Data. A continuación, en main.py, introduzca el siguiente código:

import pandas as pd

df = pd.read_csv('data/Hive17.csv', sep=";")
df = df.dropna()
print(df.head())

Por último, pulse el botón Run de la esquina superior derecha de la pantalla y nuestro código se ejecutará en la consola de Python, lo que nos dará una idea del aspecto de nuestros datos.

Importar datos en PyCharm

4. Ajuste los puntos de datos e inspecciónelos en un gráfico

Puesto que utilizaremos el OneClassSVM de scikit-learn, lo importaremos junto con DecisionBoundaryDisplay y Matplotlib utilizando el código siguiente:

from sklearn.svm import OneClassSVM
from sklearn.inspection import DecisionBoundaryDisplay

import matplotlib.pyplot as plt

Según la descripción de los datos, sabemos que la columna T17 representa la temperatura de la colmena, y RH17 representa la humedad relativa de la colmena. Extraeremos el valor de estas dos columnas como entrada:

X = df[["T17", "RH17"]].values

A continuación, crearemos y ajustaremos el modelo. Tenga en cuenta que primero probaremos la configuración predeterminada:

estimator = OneClassSVM().fit(X)

A continuación, mostraremos el límite de decisión junto con los puntos de datos:

disp = DecisionBoundaryDisplay.from_estimator(
    estimator,
    X,
    response_method="decision_function",
    plot_method="contour",
    xlabel="Temperature", ylabel="Humidity",
    levels=[0],
)
disp.ax_.scatter(X[:, 0], X[:, 1])
plt.show()

Ahora, guarde y pulse Run de nuevo, y verá que el gráfico se muestra en una ventana aparte para su inspección.

Ajuste los puntos de datos e inspecciónelos en un gráfico en PyCharm

5. Refina los hiperparámetros

Como muestra el gráfico anterior, el límite de decisión no se ajusta muy bien a los puntos de datos. Los puntos de datos consisten en un par de formas irregulares en lugar de un óvalo. Para refinar nuestro modelo, tenemos que proporcionar un valor específico de «nu» y «gamma» al modelo OneClassSVM. Puede probarlo usted mismo, pero tras un par de pruebas, parece que «nu=0,1, gamma=0,05» da el mejor resultado.

Refinado de los hiperparámetros en PyCharm

Ejemplo: Isolation Forest

Isolation Forest es un método basado en conjuntos, similar al método de clasificación más popular Random Forest. Seleccionando aleatoriamente características y valores de separación, creará muchos árboles de decisión, y la longitud de la ruta desde la raíz del árbol hasta el nodo que toma la decisión se promediará sobre todos los árboles (de ahí lo de «Forest», bosque). Una longitud media de la ruta corta indica anomalías.

Isolation Forest
Una ruta de decisión corta suele indicar datos muy diferentes de los demás
.

Ahora, comparemos el resultado de OneClassSVM con IsolationForest. Para ello, haremos dos gráficos de los límites de decisión tomados por los dos algoritmos. En los pasos siguientes, nos basaremos en el script anterior utilizando los mismos datos de la colmena 17.

1. Importe IsolationForest

IsolationForest se puede importar desde las categorías de conjuntos en Scikit-learn:

from sklearn.ensemble import IsolationForest

2. Refactorice y añada un nuevo estimador

Como ahora tendremos dos estimadores diferentes, pongámoslos en una lista:

estimators = [
    OneClassSVM(nu=0.1, gamma=0.05).fit(X),
    IsolationForest(n_estimators=100).fit(X)
]

Después, utilizaremos un bucle «for» para iterar por todos los estimadores.

for estimator in estimators:
    disp = DecisionBoundaryDisplay.from_estimator(
        estimator,
        X,
        response_method="decision_function",
        plot_method="contour",
        xlabel="Temperature", ylabel="Humidity",
        levels=[0],
    )
    disp.ax_.scatter(X[:, 0], X[:, 1])
    plt.show()

Como toque final, también añadiremos un título a cada uno de los gráficos para facilitar su inspección. Para ello, añadiremos lo siguiente después de disp.ax_.scatter:

disp.ax_.set_title(
        f"Decision boundary using {estimator.__class__.__name__}"
    )

Descubrirá que refactorizar utilizando PyCharm es muy fácil con las sugerencias de autocompletado que proporciona.

Refactorización mediante autocompletado en PyCharm
Autocompletado en PyCharm

3. Ejecute el código

Como antes, ejecutar el código es tan fácil como pulsar el botón Run de la esquina superior derecha. Tras ejecutar el código esta vez, deberíamos obtener dos gráficos.

Ejecutar el código en PyCharm

Puede ojear fácilmente los dos gráficos con la vista previa de la derecha. Como puede ver, el límite de decisión es bastante diferente si se utilizan distintos algoritmos. Al realizar la detección de anomalías, merece la pena experimentar con varios algoritmos y parámetros para encontrar el que mejor se adapte al caso.

Siguiente paso: detección de anomalías en datos de series temporales

Si los datos son como los de nuestra colmena de abejas, que es una serie temporal, existen métodos adicionales para distinguir las anomalías. Como las series temporales tienen tendencias y periodos, todo aquello que se salga de este patrón de tendencias y periodos puede considerarse una anomalía. Entre los métodos más populares para detectar anomalías en las series temporales se encuentran la descomposición STL y la predicción LSTM.

Aprenda a utilizar estos métodos para detectar anomalías en las series temporales en este artículo del blog.

Resumen

La detección de anomalías ha demostrado ser un aspecto importante de la inteligencia empresarial, y ser capaz de identificar anomalías y solicitar que se tomen medidas inmediatas es esencial en algunos sectores empresariales. Utilizar el modelo de aprendizaje automático adecuado para detectar automáticamente las anomalías puede ayudar a analizar volúmenes de datos complicados y elevados en poco tiempo. En este artículo del blog, hemos demostrado cómo identificar anomalías utilizando modelos estadísticos como OneClassSVM.

Para saber más sobre el uso de PyCharm para el aprendizaje automático, consulte Start Studying Machine Learning With PyCharm y How to Use Jupyter Notebooks in PyCharm.

Detectar anomalías utilizando PyCharm

Con el proyecto Jupyter de PyCharm Professional, puede organizar fácilmente su proyecto de detección de anomalías con muchos archivos de datos y notebooks. Se pueden generar gráficos de salida para inspeccionar las anomalías y los diagramas son muy accesibles en PyCharm. Otras funciones, como las sugerencias de autocompletado, hacen que navegar por todos los modelos de Scikit-learn y los ajustes de trazado de Matplotlib sea facilísimo.

Dé un nuevo impulso a su proyecto de ciencia de datos utilizando PyCharm; eche un vistazo a las funciones de ciencia de datos que se ofrecen para agilizar su flujo de trabajo de ciencia de datos.

Artículo original en inglés de:

Cheuk Ting Ho

Cheuk Ting Ho

image description