En este módulo, aplicaremos los conocimientos adquiridos en los módulos anteriores para abordar un problema de pronóstico de series temporales utilizando PyTorch. Este proyecto te permitirá consolidar tus habilidades en el manejo de datos, construcción de modelos y entrenamiento de redes neuronales recurrentes (RNNs).

Objetivos del Proyecto

  1. Comprender los conceptos básicos del pronóstico de series temporales.
  2. Preprocesar y preparar los datos de series temporales para el modelado.
  3. Construir y entrenar una RNN para el pronóstico de series temporales.
  4. Evaluar el rendimiento del modelo y realizar ajustes para mejorar la precisión.

  1. Introducción al Pronóstico de Series Temporales

¿Qué es una Serie Temporal?

Una serie temporal es una secuencia de datos puntos, típicamente consistentes en mediciones sucesivas hechas a intervalos de tiempo uniformes. Ejemplos comunes incluyen datos de ventas mensuales, temperaturas diarias, y precios de acciones.

Características de las Series Temporales

  • Tendencia: Componente a largo plazo que muestra un aumento o disminución general.
  • Estacionalidad: Patrones que se repiten a intervalos regulares.
  • Ciclo: Fluctuaciones que ocurren a intervalos irregulares.
  • Ruido: Variaciones aleatorias que no siguen un patrón específico.

  1. Preprocesamiento de Datos

Carga de Datos

Para este proyecto, utilizaremos un conjunto de datos de ejemplo que contiene las temperaturas diarias de una ciudad durante varios años.

import pandas as pd

# Cargar el conjunto de datos
data = pd.read_csv('daily_temperatures.csv', parse_dates=['date'], index_col='date')
print(data.head())

Normalización de Datos

La normalización es crucial para mejorar la convergencia del modelo.

from sklearn.preprocessing import MinMaxScaler

# Normalizar los datos
scaler = MinMaxScaler(feature_range=(0, 1))
data['temperature'] = scaler.fit_transform(data['temperature'].values.reshape(-1, 1))

Creación de Secuencias de Entrenamiento

Convertimos la serie temporal en secuencias de entrada y salida para el modelo.

import numpy as np

def create_sequences(data, seq_length):
    xs, ys = [], []
    for i in range(len(data) - seq_length):
        x = data[i:i+seq_length]
        y = data[i+seq_length]
        xs.append(x)
        ys.append(y)
    return np.array(xs), np.array(ys)

seq_length = 30  # Usamos 30 días de datos para predecir el siguiente día
X, y = create_sequences(data['temperature'].values, seq_length)

  1. Construcción y Entrenamiento del Modelo

Definición del Modelo

Utilizaremos una RNN simple con LSTM para el pronóstico.

import torch
import torch.nn as nn
import torch.optim as optim

class LSTMModel(nn.Module):
    def __init__(self, input_size, hidden_layer_size, output_size):
        super(LSTMModel, self).__init__()
        self.hidden_layer_size = hidden_layer_size
        self.lstm = nn.LSTM(input_size, hidden_layer_size)
        self.linear = nn.Linear(hidden_layer_size, output_size)
        self.hidden_cell = (torch.zeros(1,1,self.hidden_layer_size),
                            torch.zeros(1,1,self.hidden_layer_size))

    def forward(self, input_seq):
        lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq) ,1, -1), self.hidden_cell)
        predictions = self.linear(lstm_out.view(len(input_seq), -1))
        return predictions[-1]

# Parámetros del modelo
input_size = 1
hidden_layer_size = 100
output_size = 1

model = LSTMModel(input_size, hidden_layer_size, output_size)

Entrenamiento del Modelo

Definimos la función de pérdida y el optimizador, y entrenamos el modelo.

loss_function = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

epochs = 100
for i in range(epochs):
    for seq, labels in zip(X, y):
        optimizer.zero_grad()
        model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size),
                        torch.zeros(1, 1, model.hidden_layer_size))

        y_pred = model(torch.FloatTensor(seq))
        single_loss = loss_function(y_pred, torch.FloatTensor([labels]))
        single_loss.backward()
        optimizer.step()

    if i%10 == 1:
        print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')

  1. Evaluación del Modelo

Predicción y Visualización

Evaluamos el modelo utilizando un conjunto de datos de prueba y visualizamos los resultados.

import matplotlib.pyplot as plt

# Generar predicciones
model.eval()
test_inputs = data['temperature'].values[-seq_length:].tolist()

for i in range(30):  # Predecir los próximos 30 días
    seq = torch.FloatTensor(test_inputs[-seq_length:])
    with torch.no_grad():
        model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size),
                        torch.zeros(1, 1, model.hidden_layer_size))
        test_inputs.append(model(seq).item())

# Invertir la normalización
actual_predictions = scaler.inverse_transform(np.array(test_inputs[seq_length:]).reshape(-1, 1))

# Visualizar los resultados
plt.plot(data.index[-60:], scaler.inverse_transform(data['temperature'].values[-60:].reshape(-1, 1)), label='Actual')
plt.plot(pd.date_range(start=data.index[-1], periods=31, closed='right'), actual_predictions, label='Predicted')
plt.legend()
plt.show()

Conclusión

En este proyecto, hemos cubierto los pasos esenciales para el pronóstico de series temporales utilizando PyTorch. Desde la carga y preprocesamiento de datos hasta la construcción, entrenamiento y evaluación de un modelo LSTM, hemos aplicado técnicas clave para abordar problemas de series temporales. Este proyecto no solo refuerza los conceptos aprendidos en módulos anteriores, sino que también proporciona una base sólida para abordar problemas más complejos en el futuro.

Resumen de Conceptos Clave

  • Series Temporales: Comprensión de sus componentes y características.
  • Preprocesamiento: Normalización y creación de secuencias de datos.
  • Modelado: Construcción y entrenamiento de una RNN con LSTM.
  • Evaluación: Predicción y visualización de resultados.

Próximos Pasos

  • Experimentar con diferentes arquitecturas de RNN y parámetros de hiperajuste.
  • Implementar técnicas avanzadas de preprocesamiento y manejo de datos faltantes.
  • Explorar otros tipos de series temporales y problemas de pronóstico.

¡Felicidades por completar este proyecto! Ahora estás mejor preparado para enfrentar desafíos de pronóstico de series temporales en el mundo real.

© Copyright 2024. Todos los derechos reservados