Isolation Forest para detectar anomalías en series temporales

Aprende a detectar anomalías en series temporales con Python, utilizando técnicas avanzadas y algoritmos de Machine Learning.

Basándonos en las ofertas de generación energética que EOLICA AUDAX (ADXVD04) ha registrado en el mercado de OMIE durante 2023, a continuación se presenta un análisis de anomalías en la serie temporal.

Visualización de anomalías detectadas en las ofertas de generación energética de EOLICA AUDAX (ADXVD04) en el mercado de OMIE durante 2023.
F1. Detección inicial de anomalías

En este tutorial, aprenderás como desarrollar un modelo de detección de anomalías en series temporales con Python a partir de un caso práctico.

Data

Cada fila representa la energía que la unidad ofertante ADXVD04 ha registrado en el mercado de OMIE durante 2023.

import pandas as pd

df = pd.read_csv('data.csv')
Representación de los datos brutos de energía ofertada por la unidad ADXVD04 en el mercado OMIE a lo largo de 2023, antes de la aplicación de técnicas de detección de anomalías
F2. Datos brutos de ofertas energéticas

Preguntas

  1. ¿Cómo se extraen las propiedades temporales para detectar anomalías?
  2. ¿Cómo utilizar el algoritmo Isolation Forest para identificar los datos anómalos?
  3. ¿Cómo se configura el algoritmo para detectar un porcentaje específico de datos como anómalos?
  4. ¿Qué técnicas se emplean para visualizar los datos anómalos en la serie temporal?

Metodología

Columnas Temporales

Siguiendo los pasos de este tutorial, creamos las columnas temporales que puedan explicar el motivo de los datos anómalos.

df.datetime = pd.to_datetime(df.datetime)
df.set_index('datetime', inplace=True)

df = (df
 .assign(
     month = lambda x: x.index.month,
     hour = lambda x: x.index.hour,
    )
)
Preparación de los datos de ofertas energéticas de ADXVD04 para el análisis de anomalías, incluyendo la creación de columnas temporales basadas en la fecha y hora de las ofertas.
F3. Preparación de datos para análisis

Modelo de Anomalías

Para detectar los datos anómalos, utilizamos el algoritmo IsolationForest de la librería sklearn. Establecemos el parámetro contamination a auto para que el modelo detecte los datos anómalos de forma automática.

from sklearn.ensemble import IsolationForest

model = IsolationForest(contamination='auto', random_state=42)
model.fit(df_model)

Porcentaje de Anomalías Automático

Utilizando la ecuación matemática que ha optimizado el algoritmo, calculamos los datos anómalos para visualizar el porcentaje de anomalías.

¿Conoces a alguien que podría interesarle este artículo? Compártelo con ellos.

df['anomaly'] = model.predict(df_model)

(df
 .anomaly
 .value_counts(normalize=True)
 .rename(index={1: 'Normal', -1: 'Anomaly'})
 .plot.pie()
)
Análisis del porcentaje de ofertas consideradas anómalas según la configuración automática del algoritmo Isolation Forest, destacando la proporción de datos etiquetados como normales frente a anómalos.
F4. Porcentaje de anomalías automáticas

Un 65.4% de las ofertas de ADXVD04 son anómalas según la configuración automática del modelo.

Especificar Porcentaje de Anomalías

No es lógico que la mayoría de los datos sean considerados anómalos. Por tanto, ajustamos el parámetro contamination a 0.01 para que el modelo detecte el 1% de los datos como anómalos.

model = IsolationForest(contamination=.01, random_state=42)
model.fit(df_model)
  
df['anomaly'] = model.predict(df_model)

Visualizar Serie Temporal con Anomalías

Finalmente, seleccionamos los datos anómalos:

s_anomaly = df.query('anomaly == -1').energy

Y los visualizamos con puntos sobre la serie temporal original utilizando la sublibrería graph_objects de plotly.

import plotly.graph_objects as go

go.Figure(
    data=[
        go.Scatter(x=s_anomaly.index, y=s_anomaly, mode='markers'),
        go.Scatter(x=df.index, y=df.energy, mode='lines')
    ]
)
Detalle de la serie temporal de ofertas energéticas de ADXVD04 con las anomalías detectadas por el modelo Isolation Forest resaltadas, permitiendo una visualización directa de los puntos atípicos sobre el patrón general de las ofertas.
F5. Serie temporal con anomalías marcadas

Podemos observar que el modelo detecta observaciones anómalas, sobretodo, en los picos de la serie temporal.

¿Qué más podríamos hacer para analizar las anomalías? Te leo en los comentarios.

Conclusiones

  1. Extracción de Propiedades Temporales: df.assign para crear columnas month y hour a partir del DateTimeIndex.
  2. Algoritmo IsolationForest: sklearn tiene el algoritmo registrado en su framework de Machine Learning.
  3. Ajuste del Modelo para Porcentaje Específico de Anomalías: IsolationForest(contamination=0.01) ajusta la sensibilidad del modelo para identificar el 1% de los datos como anómalos.
  4. Técnicas para Visualizar Datos Anómalos: plotly.graph_objects.Figure nos permite combinar en una visualización los datos anómalos y la serie temporal original.

Me encantaría escuchar tus opiniones para mejorar nuestros futuros artículos.

¿Qué te pareció más interesante/valioso de este artículo?

¿Hay algún tema que te gustaría que cubriéramos en el futuro?

Tu feedback es crucial para generar contenido de alta calidad que se alinee con tus necesidades e intereses.

¡Gracias por tu atención y apoyo de antemano!

Great! You’ve successfully signed up.

Welcome back! You've successfully signed in.

You've successfully subscribed to datons.

Success! Check your email for magic link to sign-in.

Success! Your billing info has been updated.

Your billing was not updated.