Introducción

La detección de anomalías es una tarea crucial en muchos campos, como la seguridad informática, la detección de fraudes y el mantenimiento predictivo. Los autoencoders, un tipo de red neuronal, son especialmente útiles para esta tarea debido a su capacidad para aprender representaciones compactas de los datos normales y detectar desviaciones significativas.

¿Qué es un Autoencoder?

Un autoencoder es una red neuronal que se entrena para copiar su entrada a su salida. Consiste en dos partes principales:

  • Codificador (Encoder): Reduce la dimensionalidad de los datos de entrada, creando una representación compacta (codificación).
  • Decodificador (Decoder): Reconstruye los datos originales a partir de la codificación.

La arquitectura básica de un autoencoder se puede representar de la siguiente manera:

Input -> [Encoder] -> Latent Space -> [Decoder] -> Output

Aplicación en Detección de Anomalías

En la detección de anomalías, el autoencoder se entrena con datos normales. Durante la fase de inferencia, cualquier dato que no se pueda reconstruir bien (es decir, que tenga un error de reconstrucción alto) se considera una anomalía.

Arquitectura de un Autoencoder

Codificador (Encoder)

El codificador reduce la dimensionalidad de los datos de entrada. Un ejemplo de codificador puede ser:

from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model

input_dim = 28 * 28  # Ejemplo para imágenes de 28x28 píxeles
encoding_dim = 64  # Dimensión de la codificación

input_layer = Input(shape=(input_dim,))
encoded = Dense(encoding_dim, activation='relu')(input_layer)

Decodificador (Decoder)

El decodificador intenta reconstruir los datos originales a partir de la codificación:

decoded = Dense(input_dim, activation='sigmoid')(encoded)

Modelo Completo

El modelo completo del autoencoder se define combinando el codificador y el decodificador:

autoencoder = Model(input_layer, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

Entrenamiento del Autoencoder

Para entrenar el autoencoder, se utilizan datos normales. Aquí hay un ejemplo utilizando el conjunto de datos MNIST:

from tensorflow.keras.datasets import mnist

(x_train, _), (x_test, _) = mnist.load_data()
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))

autoencoder.fit(x_train, x_train,
                epochs=50,
                batch_size=256,
                shuffle=True,
                validation_data=(x_test, x_test))

Detección de Anomalías

Después de entrenar el autoencoder, se puede utilizar para detectar anomalías. El proceso implica calcular el error de reconstrucción para cada dato de prueba y marcar aquellos con un error alto como anomalías.

Cálculo del Error de Reconstrucción

reconstructed = autoencoder.predict(x_test)
reconstruction_error = np.mean(np.square(x_test - reconstructed), axis=1)

Umbral de Anomalía

Se puede establecer un umbral para determinar qué errores de reconstrucción se consideran anomalías. Por ejemplo, se puede usar el percentil 95 del error de reconstrucción de los datos normales:

threshold = np.percentile(reconstruction_error, 95)
anomalies = reconstruction_error > threshold

Ejercicio Práctico

Ejercicio

  1. Entrena un autoencoder utilizando el conjunto de datos MNIST.
  2. Calcula el error de reconstrucción para los datos de prueba.
  3. Establece un umbral para detectar anomalías.
  4. Identifica y visualiza algunas de las anomalías detectadas.

Solución

import numpy as np
import matplotlib.pyplot as plt

# 1. Entrenamiento del autoencoder
autoencoder.fit(x_train, x_train,
                epochs=50,
                batch_size=256,
                shuffle=True,
                validation_data=(x_test, x_test))

# 2. Cálculo del error de reconstrucción
reconstructed = autoencoder.predict(x_test)
reconstruction_error = np.mean(np.square(x_test - reconstructed), axis=1)

# 3. Establecimiento del umbral
threshold = np.percentile(reconstruction_error, 95)
anomalies = reconstruction_error > threshold

# 4. Visualización de anomalías
anomalous_data_indices = np.where(anomalies)[0]

plt.figure(figsize=(10, 10))
for i, index in enumerate(anomalous_data_indices[:25]):
    plt.subplot(5, 5, i + 1)
    plt.imshow(x_test[index].reshape(28, 28), cmap='gray')
    plt.title(f"Error: {reconstruction_error[index]:.4f}")
    plt.axis('off')
plt.show()

Conclusión

En esta sección, hemos aprendido cómo utilizar autoencoders para la detección de anomalías. Hemos cubierto la arquitectura básica de un autoencoder, su entrenamiento y cómo utilizarlo para identificar datos anómalos. Los autoencoders son una herramienta poderosa en el arsenal de técnicas de deep learning para la detección de anomalías, y su capacidad para aprender representaciones compactas de datos normales los hace especialmente útiles en una variedad de aplicaciones.

En el siguiente módulo, exploraremos la creación de una GAN para la generación de imágenes, una técnica avanzada que ha revolucionado el campo del deep learning.

© Copyright 2024. Todos los derechos reservados