Predicción de Temperaturas mediante Redes Neuronales

Para la predicción de temperaturas, se utiliza un conjunto de datos que incluye características como temperaturas anteriores y promedios históricos. El objetivo es predecir la temperatura máxima actual.

Lectura y Preprocesamiento de Datos

Se importan las bibliotecas necesarias y se carga el archivo CSV con los datos meteorológicos.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
from sklearn.preprocessing import StandardScaler
import datetime

# Cargar datos desde CSV
data_set = pd.read_csv('ruta/al/archivo/temps.csv')

# Extraer componentes de fecha
anios = data_set['year']
meses = data_set['month']
dias = data_set['day']

# Formatear fechas
fechas = [str(int(a)) + '-' + str(int(m)) + '-' + str(int(d)) for a, m, d in zip(anios, meses, dias)]
fechas = [datetime.datetime.strptime(fecha, '%Y-%m-%d') for fecha in fechas]

# Visualización de datos con subplots
plt.style.use('ggplot')
fig, ejes = plt.subplots(nrows=2, ncols=2, figsize=(10, 10))
fig.autofmt_xdate(rotation=45)

ejes[0, 0].plot(fechas, data_set['actual'])
ejes[0, 0].set_ylabel('Temperatura')
ejes[0, 0].set_title('Temperatura Máxima Actual')

ejes[0, 1].plot(fechas, data_set['temp_1'])
ejes[0, 1].set_ylabel('Temperatura')
ejes[0, 1].set_title('Temperatura Máxima del Día Anterior')

ejes[1, 0].plot(fechas, data_set['temp_2'])
ejes[1, 0].set_xlabel('Fecha')
ejes[1, 0].set_ylabel('Temperatura')
ejes[1, 0].set_title('Temperatura Máxima de Hace Dos Días')

ejes[1, 1].plot(fechas, data_set['average'])
ejes[1, 1].set_xlabel('Fecha')
ejes[1, 1].set_ylabel('Temperatura')
ejes[1, 1].set_title('Temperatura Promedio Histórica')

plt.tight_layout(pad=2)
plt.show()

Preparación de Datos para el Modelo

Los datos categóricos se codifican en formato one-hot, se separan las etiquetas y se normalizan las características.

# Codificación one-hot para atributos categóricos
data_set = pd.get_dummies(data_set)

# Separar etiquetas y características
etiquetas = np.array(data_set['actual'])
atributos = data_set.drop('actual', axis=1)
nombres_atributos = list(atributos.columns)
atributos = np.array(atributos)

# Escalado de características
escalador = StandardScaler()
atributos = escalador.fit_transform(atributos)

# Conversión a tensores de PyTorch
X = torch.tensor(atributos, requires_grad=True, dtype=torch.double)
Y = torch.tensor(etiquetas, dtype=torch.double).unsqueeze(1)

# Dimensiones de entrada
dim_entrada = atributos.shape[1]

Construcción y Etnrenamiento de la Red Neuronal

Se definen los parámetros del modelo y se ejecuta el bucle de entrenamiento para minimizar el error cuadrático medio.

# Hiperparámetros
neuronas_ocultas = 32
tasa_aprendizaje = 0.005
epocas = 5000

# Inicialización de pesos y sesgos
pesos_capa1 = torch.randn((dim_entrada, neuronas_ocultas), dtype=torch.double, requires_grad=True)
sesgos_capa1 = torch.randn(neuronas_ocultas, dtype=torch.double, requires_grad=True)
pesos_capa2 = torch.randn((neuronas_ocultas, 1), dtype=torch.double, requires_grad=True)

# Almacenar pérdidas
historial_perdidas = []

# Entrenamiento
for epoca in range(epocas):
    # Propagación hacia adelante
    capa_oculta = torch.matmul(X, pesos_capa1) + sesgos_capa1
    activacion = torch.sigmoid(capa_oculta)
    predicciones = torch.matmul(activacion, pesos_capa2)
    
    # Cálculo de la pérdida
    perdida = torch.mean((predicciones - Y) ** 2)
    historial_perdidas.append(perdida.item())
    
    # Retropropagación y actualización
    perdida.backward()
    
    with torch.no_grad():
        pesos_capa1 -= tasa_aprendizaje * pesos_capa1.grad
        sesgos_capa1 -= tasa_aprendizaje * sesgos_capa1.grad
        pesos_capa2 -= tasa_aprendizaje * pesos_capa2.grad
    
    # Reiniciar gradientes
    pesos_capa1.grad.zero_()
    sesgos_capa1.grad.zero_()
    pesos_capa2.grad.zero_()
    
    # Registro periódico
    if epoca % 500 == 0:
        print(f'Época {epoca}, Pérdida: {perdida.item():.4f}')

El entrenamiento ajusta iterativamente los parámetros del modelo para reducir el error de predicción.

Etiquetas: PyTorch Redes Neuronales Predicción de Series Temporales Python Escalado de Características

Publicado el 6-7 21:58