Tutorial: Predicción de Series de Tiempo con LSTM en Python paso a paso

Tutorial: Predicción de Series de Tiempo con LSTM en Python
El forecasting de series de tiempo es una de las aplicaciones más demandadas en el ecosistema de datos latinoamericano. Desde startups fintech en Bogotá hasta empresas de energía en Medellín, la capacidad de predecir comportamientos futuros a partir de datos históricos se ha convertido en una ventaja competitiva real. En este tutorial aprenderás a construir un modelo de Long Short-Term Memory (LSTM) desde cero usando Python, TensorFlow y Keras, con ejemplos prácticos y código listo para ejecutar.
¿Qué es una Red LSTM y por qué usarla para Series de Tiempo?
Las redes LSTM (Long Short-Term Memory) son un tipo especial de red neuronal recurrente (RNN) diseñada para aprender dependencias a largo plazo en secuencias de datos. A diferencia de las RNN tradicionales, las LSTM resuelven el problema del vanishing gradient mediante una arquitectura de celdas con tres compuertas: la compuerta de olvido (forget gate), la compuerta de entrada (input gate) y la compuerta de salida (output gate).
En el contexto colombiano, los casos de uso más frecuentes incluyen:
- Predicción de demanda eléctrica para empresas como EPM o Enel Colombia.
- Forecasting de ventas en plataformas de e-commerce como Rappi o Mercado Libre Colombia.
- Análisis de precios en el mercado de criptomonedas y acciones de la BVC (Bolsa de Valores de Colombia).
- Predicción de tráfico web para agencias digitales y medios como El Tiempo o Semana.
Requisitos Previos
Antes de comenzar, asegúrate de tener instaladas las siguientes librerías en tu entorno de Python:
pip install tensorflow numpy pandas matplotlib scikit-learnSe recomienda usar Python 3.8 o superior y trabajar en un entorno virtual. Si eres estudiante en Colombia, plataformas como Google Colab te permiten ejecutar este código de forma gratuita sin necesidad de GPU propia.
Paso 1: Preparación y Exploración de los Datos
Para este tutorial usaremos un dataset de consumo energético diario, un escenario muy relevante para el sector industrial colombiano. Comenzamos importando las librerías necesarias y cargando los datos:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping
# Cargar datos (puedes usar cualquier CSV con columna de fecha y valor)
df = pd.read_csv('consumo_energia.csv', parse_dates=['fecha'], index_col='fecha')
print(df.head())
df['consumo'].plot(figsize=(12, 5), title='Consumo Energético Diario')
plt.show()La visualización inicial es fundamental. Busca patrones de estacionalidad, tendencias y posibles outliers que puedan afectar el entrenamiento del modelo.
Paso 2: Preprocesamiento de Datos
Las redes LSTM son sensibles a la escala de los datos. Por eso, normalizamos los valores entre 0 y 1 usando MinMaxScaler:
scaler = MinMaxScaler(feature_range=(0, 1))
data_scaled = scaler.fit_transform(df[['consumo']])
# Función para crear secuencias
def create_sequences(data, seq_length=60):
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 = 60 # Usamos 60 días como ventana de tiempo
X, y = create_sequences(data_scaled, SEQ_LENGTH)
# División entrenamiento / prueba (80% / 20%)
split = int(len(X) * 0.8)
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]
print(f'Forma de X_train: {X_train.shape}')
print(f'Forma de X_test: {X_test.shape}')El parámetro seq_length define cuántos pasos de tiempo pasados usa el modelo para predecir el siguiente valor. Para datos diarios, 30 a 90 días suele ser un buen punto de partida.
Paso 3: Construcción del Modelo LSTM
Ahora construimos la arquitectura de la red. Usaremos dos capas LSTM apiladas con Dropout para evitar el sobreajuste:
model = Sequential([
LSTM(units=64, return_sequences=True, input_shape=(SEQ_LENGTH, 1)),
Dropout(0.2),
LSTM(units=64, return_sequences=False),
Dropout(0.2),
Dense(units=32, activation='relu'),
Dense(units=1)
])
model.compile(
optimizer='adam',
loss='mean_squared_error',
metrics=['mae']
)
model.summary()Algunos consejos clave sobre la arquitectura:
- return_sequences=True en la primera capa LSTM es necesario cuando apilamos múltiples capas LSTM.
- El Dropout del 20% ayuda a regularizar el modelo y mejorar la generalización.
- La capa Dense final con una neurona produce la predicción del siguiente valor.
Paso 4: Entrenamiento del Modelo
Entrenamos el modelo con EarlyStopping para detener el entrenamiento cuando la pérdida de validación deje de mejorar:
early_stop = EarlyStopping(
monitor='val_loss',
patience=10,
restore_best_weights=True
)
history = model.fit(
X_train, y_train,
epochs=100,
batch_size=32,
validation_split=0.1,
callbacks=[early_stop],
verbose=1
)
# Visualizar curvas de aprendizaje
plt.figure(figsize=(10, 4))
plt.plot(history.history['loss'], label='Pérdida Entrenamiento')
plt.plot(history.history['val_loss'], label='Pérdida Validación')
plt.title('Curvas de Aprendizaje del Modelo LSTM')
plt.legend()
plt.show()Si las curvas de entrenamiento y validación convergen sin una brecha significativa, el modelo está aprendiendo correctamente sin sobreajuste.
Paso 5: Evaluación y Predicciones
Evaluamos el rendimiento del modelo en el conjunto de prueba y visualizamos las predicciones:
# Predicciones
y_pred_scaled = model.predict(X_test)
# Desnormalizar
y_pred = scaler.inverse_transform(y_pred_scaled)
y_real = scaler.inverse_transform(y_test.reshape(-1, 1))
# Métricas
from sklearn.metrics import mean_squared_error, mean_absolute_error
mse = mean_squared_error(y_real, y_pred)
mae = mean_absolute_error(y_real, y_pred)
rmse = np.sqrt(mse)
print(f'RMSE: {rmse:.4f}')
print(f'MAE: {mae:.4f}')
# Visualización
plt.figure(figsize=(14, 5))
plt.plot(y_real, label='Valores Reales', color='blue')
plt.plot(y_pred, label='Predicciones LSTM', color='red', linestyle='--')
plt.title('Predicción vs Realidad - Modelo LSTM')
plt.legend()
plt.show()Buenas Prácticas y Optimización
Para mejorar el rendimiento de tu modelo LSTM en proyectos reales, considera estas estrategias:
Ajuste de Hiperparámetros
Usa herramientas como Keras Tuner o Optuna para encontrar la combinación óptima de unidades LSTM, tasa de aprendizaje y tamaño de batch. En proyectos colombianos con recursos computacionales limitados, Optuna es especialmente eficiente por su búsqueda bayesiana.
Ingeniería de Características
Agrega variables exógenas relevantes como variables de calendario (día de la semana, festivos colombianos), indicadores económicos o datos climáticos del IDEAM. Un modelo multivariado suele superar significativamente a uno univariado.
Validación Temporal
Nunca uses validación cruzada estándar en series de tiempo. Implementa TimeSeriesSplit de scikit-learn para respetar el orden temporal de los datos y evitar data leakage.
Aplicaciones en el Ecosistema Tecnológico Colombiano
El mercado de inteligencia artificial en Colombia ha crecido significativamente. Según MinTIC, el sector TIC representa más del 3% del PIB nacional y continúa en expansión. Las LSTM tienen aplicaciones directas en:
- Sector financiero: Bancolombia, Davivienda y neobancos como Nequi usan modelos de series de tiempo para detección de fraude y scoring crediticio.
- Agroindustria: Predicción de precios de commodities como café y flores en la Bolsa Mercantil de Colombia.
- Salud pública: Modelado de curvas epidemiológicas para el INS (Instituto Nacional de Salud).
- Logística: Optimización de rutas y predicción de demanda para empresas como Coordinadora o TCC.
Preguntas Frecuentes (FAQ)
¿Cuántos datos necesito para entrenar un modelo LSTM?
Como regla general, necesitas al menos 1000 observaciones para obtener resultados confiables. Con menos datos, considera modelos estadísticos como ARIMA o Prophet, que son más robustos con series cortas.
¿LSTM es mejor que ARIMA para series de tiempo?
No necesariamente. ARIMA es más interpretable y eficiente con series lineales y estacionarias. LSTM brilla cuando hay patrones no lineales complejos y suficientes datos históricos. Para proyectos en Colombia con datos limitados, a veces ARIMA o Prophet ofrecen mejores resultados con menor costo computacional.
¿Cómo manejo los valores faltantes en mi serie de tiempo?
Puedes usar interpolación lineal (df.interpolate()), imputación con la media móvil o modelos de imputación más sofisticados. Evita eliminar filas con valores nulos ya que romperías la continuidad temporal.
¿Puedo usar LSTM para predicción multivariada?
Sí. Solo necesitas ajustar la dimensión de entrada en input_shape=(SEQ_LENGTH, n_features) donde n_features es el número de variables. Esto es especialmente útil cuando tienes múltiples sensores o indicadores correlacionados.
¿Qué frameworks alternativos puedo usar además de TensorFlow/Keras?
PyTorch es una excelente alternativa, especialmente popular en investigación. También puedes explorar Darts, una librería especializada en series de tiempo que incluye implementaciones de LSTM, N-BEATS y Transformers con una API muy amigable.
Conclusión
Las redes LSTM representan una herramienta poderosa para el forecasting de series de tiempo, con aplicaciones que van desde la predicción financiera hasta la optimización energética. A lo largo de este tutorial hemos cubierto todo el pipeline: desde la preparación de datos y construcción del modelo hasta la evaluación y visualización de resultados. El ecosistema tecnológico colombiano está en un momento de madurez ideal para adoptar estas técnicas, con una comunidad de desarrolladores e ingenieros de datos cada vez más activa en ciudades como Bogotá, Medellín y Cali. Te invitamos a experimentar con tus propios datasets, compartir tus resultados en los comentarios y explorar variantes como las redes Bidirectional LSTM o los Transformers para series de tiempo, que representan el siguiente nivel en este fascinante campo. ¿Tienes preguntas sobre la implementación o quieres compartir un caso de uso específico? ¡Déjanos tu comentario!
