15/9/20266 min de lectura

Modelos Ensemble y Validación Walk-Forward para Series Temporales Agroclimáticas

Análisis técnico sobre cómo combinar XGBoost, LightGBM y Random Forest en una arquitectura ensemble con validación temporal expandida (walk-forward) para mitigar el desbalance extremo y anticipar eventos climáticos adversos en el Altiplano.

#Machine Learning#Python#Series Temporales#XGBoost#LightGBM
Modelos Ensemble y Validación Walk-Forward para Series Temporales Agroclimáticas

Introducción al Problema: Fenómenos Extremos y Datos No Estacionarios

En regiones de gran altitud como el Altiplano andino, la predicción de heladas y eventos meteorológicos extremos presenta retos estadísticos que desafían los supuestos clásicos del aprendizaje automático:

  1. Fuerte estacionalidad no lineal: Ciclos diarios de temperatura combinados con variabilidad climática interanual.
  2. Severo desbalance de clases: Los eventos críticos (temperaturas bajo cero fuera de temporada) representan una fracción mínima del total de observaciones horarias.
  3. Autocorrelación temporal: Las observaciones sucesivas no son independientes e idénticamente distribuidas (i.i.d.).

Aplicar técnicas tradicionales como la validación cruzada aleatoria (K-Fold estándar) en este contexto produce data leakage (fuga de datos del futuro hacia el pasado), lo que infla artificialmente el rendimiento del modelo durante el entrenamiento.


1. Validación Temporal Walk-Forward (Expanding Window)

Para simular condiciones reales de producción en un sistema de alerta temprana, es mandatorio utilizar un esquema de validación temporal secuencial:

PYTHON
from sklearn.model_selection import TimeSeriesSplit
import numpy as np

# Configuración de validación temporal expandida
tscv = TimeSeriesSplit(n_splits=5, max_train_size=None)

for fold, (train_idx, test_idx) in enumerate(tscv.split(X)):
    X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
    y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
    print(f"Fold {fold + 1}: Train shape={X_train.shape}, Test shape={X_test.shape}")

Con este esquema, el modelo solo tiene acceso a información histórica previa a la ventana de predicción horizonte t+1, t+6, t+12 horas.


2. Ingeniería de Características (Feature Engineering)

Las variables meteorológicas crudas (T_min, humedad relativa, radiación solar, presión barométrica) adquieren poder predictivo al derivar retardos temporales (lag features) y agregaciones móviles:

  • Lags de temperatura: T(t-1), T(t-2), T(t-24) para capturar inercia térmica.
  • Rango diurno de temperatura: ΔT = T_max - T_min en ventanas de 24 horas.
  • Tasa de enfriamiento radiativo: Gradiente de descenso térmico durante las horas previas al anochecer.
  • Codificación cíclica temporal: Transformaciones seno y coseno del día del año y hora del día para preservar la continuidad circular.
PYTHON
# Transformación cíclica para capturar periodicidad estacional
df['hour_sin'] = np.sin(2 * np.pi * df['hour'] / 24.0)
df['hour_cos'] = np.cos(2 * np.pi * df['hour'] / 24.0)
df['doy_sin'] = np.sin(2 * np.pi * df['day_of_year'] / 365.25)
df['doy_cos'] = np.cos(2 * np.pi * df['day_of_year'] / 365.25)

3. Arquitectura del Modelo Ensemble

En lugar de depender de un único algoritmo, combinamos las ventajas estructurales de tres clasificadores basados en árboles de decisión mediante un Weighted Soft-Voting Ensemble:

  1. LightGBM: Excelente velocidad de convergencia y manejo eficiente de histogramas continuos con crecimiento por hojas (leaf-wise).
  2. XGBoost: Regularización L1 y L2 estricta en la función de pérdida para prevenir sobreajuste en subconjuntos de datos ruidosos.
  3. Random Forest: Reduce la varianza del ensamble al promediar árboles completamente desarrollados y descorrelacionados (bagging).
PYTHON
from lightgbm import LGBMClassifier
from xgboost import XGBClassifier
from sklearn.ensemble import VotingClassifier

# Inicialización de estimadores calibrados
lgbm = LGBMClassifier(
    n_estimators=300,
    learning_rate=0.03,
    num_leaves=31,
    scale_pos_weight=4.5, # Compensación del desbalance
    random_state=42
)

xgb = XGBClassifier(
    n_estimators=300,
    learning_rate=0.03,
    max_depth=6,
    scale_pos_weight=4.5,
    eval_metric="logloss",
    random_state=42
)

# Ensamble ponderado por desempeño en validación
ensemble = VotingClassifier(
    estimators=[('lgbm', lgbm), ('xgb', xgb)],
    voting='soft',
    weights=[0.55, 0.45]
)

ensemble.fit(X_train, y_train)

4. Métricas de Evaluación y Calibración de Umbral

Frente a eventos extremos desbalanceados, la precisión global (Accuracy) es engañosa. Evaluamos mediante:

MétricaModelo Base (Regresión Logística)XGBoost IndividualEnsemble Híbrido
Precision (Clase Helada)0.620.780.84
Recall / Sensibilidad0.580.810.86
F1-Score Ponderado0.600.790.85
Brier Score (Calibración)0.180.090.06

El ajuste fino del umbral de decisión (threshold tuning) con base en la curva Precision-Recall optimiza la captura de heladas sin saturar al productor agrícola con falsas alarmas.


Conclusiones

La combinación de validación temporal estricta, ingeniería de factores microclimáticos y ensembles basados en árboles gradient boosted demuestra que es posible alcanzar una alta tasa de anticipación (Lead Time de hasta 24 horas), sentando una base sólida para sistemas de alerta temprana reproducibles e indexables en la literatura científica.