Introducción

Las secuencias y series temporales son tipos de datos que se caracterizan por su dependencia temporal. En el contexto del Deep Learning, las Redes Neuronales Recurrentes (RNN) son especialmente adecuadas para manejar este tipo de datos debido a su capacidad para mantener información a lo largo del tiempo.

Objetivos de esta sección:

  1. Comprender qué son las secuencias y series temporales.
  2. Aprender cómo las RNN pueden ser utilizadas para modelar datos secuenciales.
  3. Explorar ejemplos prácticos y ejercicios para aplicar estos conceptos.

¿Qué son las Secuencias y Series Temporales?

Definición

  • Secuencias: Son conjuntos de datos ordenados donde el orden de los elementos es importante. Ejemplos incluyen texto, secuencias de ADN, y datos de sensores.
  • Series Temporales: Son secuencias de datos donde cada dato está asociado con un punto en el tiempo. Ejemplos incluyen precios de acciones, temperaturas diarias, y señales de ECG.

Características Clave

  • Dependencia Temporal: Los datos en una secuencia o serie temporal están correlacionados con sus valores anteriores y/o futuros.
  • Estacionalidad: En series temporales, puede haber patrones que se repiten en intervalos regulares.
  • Tendencia: Las series temporales pueden mostrar una tendencia general ascendente o descendente a lo largo del tiempo.

Redes Neuronales Recurrentes (RNN)

Estructura de una RNN

Las RNN son un tipo de red neuronal donde las conexiones entre nodos forman un grafo dirigido a lo largo de una secuencia temporal. Esto permite que la red tenga una "memoria" de estados anteriores.

Propagación hacia adelante en RNN

import numpy as np

# Ejemplo simplificado de una RNN
def rnn_step_forward(x, h_prev, Wx, Wh, b):
    """
    Un paso de la propagación hacia adelante en una RNN.
    
    x: Entrada en el tiempo t
    h_prev: Estado oculto en el tiempo t-1
    Wx: Matriz de pesos para la entrada
    Wh: Matriz de pesos para el estado oculto
    b: Sesgo
    """
    h_next = np.tanh(np.dot(x, Wx) + np.dot(h_prev, Wh) + b)
    return h_next

# Parámetros de ejemplo
x = np.array([1, 2])
h_prev = np.array([0.5, -0.5])
Wx = np.array([[0.1, 0.2], [0.3, 0.4]])
Wh = np.array([[0.5, 0.6], [0.7, 0.8]])
b = np.array([0.1, 0.2])

# Cálculo del siguiente estado oculto
h_next = rnn_step_forward(x, h_prev, Wx, Wh, b)
print(h_next)

Explicación del Código

  • x: Entrada en el tiempo t.
  • h_prev: Estado oculto en el tiempo t-1.
  • Wx: Matriz de pesos para la entrada.
  • Wh: Matriz de pesos para el estado oculto.
  • b: Sesgo.
  • h_next: Estado oculto en el tiempo t calculado usando la función de activación tanh.

Ejemplo Práctico: Predicción de Series Temporales

Dataset: Precios de Acciones

Vamos a utilizar un dataset de precios de acciones para predecir el precio futuro basado en los precios pasados.

Preparación del Dataset

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler

# Cargar el dataset
data = pd.read_csv('stock_prices.csv')
prices = data['Close'].values.reshape(-1, 1)

# Escalar los datos
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_prices = scaler.fit_transform(prices)

# Crear secuencias de entrenamiento
def create_sequences(data, seq_length):
    X = []
    y = []
    for i in range(len(data) - seq_length):
        X.append(data[i:i+seq_length])
        y.append(data[i+seq_length])
    return np.array(X), np.array(y)

seq_length = 50
X, y = create_sequences(scaled_prices, seq_length)

Construcción y Entrenamiento del Modelo RNN

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, SimpleRNN

# Definir el modelo
model = Sequential()
model.add(SimpleRNN(50, activation='tanh', input_shape=(seq_length, 1)))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mean_squared_error')

# Entrenar el modelo
model.fit(X, y, epochs=20, batch_size=32)

Predicción y Evaluación

# Hacer predicciones
predictions = model.predict(X)

# Desescalar las predicciones
predictions = scaler.inverse_transform(predictions)

# Evaluar el modelo
import matplotlib.pyplot as plt

plt.plot(data['Close'], label='Real')
plt.plot(range(seq_length, len(predictions) + seq_length), predictions, label='Predicción')
plt.legend()
plt.show()

Ejercicio Práctico

Ejercicio 1: Implementar una RNN para Predecir Temperaturas Diarias

  1. Cargar un dataset de temperaturas diarias.
  2. Escalar los datos.
  3. Crear secuencias de entrenamiento.
  4. Construir y entrenar una RNN.
  5. Evaluar el modelo y visualizar las predicciones.

Solución del Ejercicio 1

# Paso 1: Cargar el dataset
data = pd.read_csv('daily_temperatures.csv')
temperatures = data['Temperature'].values.reshape(-1, 1)

# Paso 2: Escalar los datos
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_temperatures = scaler.fit_transform(temperatures)

# Paso 3: Crear secuencias de entrenamiento
seq_length = 30
X, y = create_sequences(scaled_temperatures, seq_length)

# Paso 4: Construir y entrenar una RNN
model = Sequential()
model.add(SimpleRNN(50, activation='tanh', input_shape=(seq_length, 1)))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X, y, epochs=20, batch_size=32)

# Paso 5: Evaluar el modelo y visualizar las predicciones
predictions = model.predict(X)
predictions = scaler.inverse_transform(predictions)

plt.plot(data['Temperature'], label='Real')
plt.plot(range(seq_length, len(predictions) + seq_length), predictions, label='Predicción')
plt.legend()
plt.show()

Conclusión

En esta sección, hemos aprendido sobre secuencias y series temporales, y cómo las RNN pueden ser utilizadas para modelar estos datos. Hemos explorado un ejemplo práctico de predicción de precios de acciones y proporcionado un ejercicio para predecir temperaturas diarias. Con estos conocimientos, estás preparado para abordar problemas más complejos en el ámbito de las series temporales utilizando Deep Learning.

© Copyright 2024. Todos los derechos reservados