Python Data Science Program
📓 Abrir notebook en GitHub

Clase 053 — Validación temporal: TimeSeriesSplit, walk-forward, blocking

Parte: 1 — Machine Learning Clásico · Fuente: Bergmeir & Benítez (2012) + sklearn TimeSeriesSplit docs. ⏱️ Duración estimada: 70 min.

🎯 Objetivo

Aplicar validación correcta para series temporales — donde KFold y train_test_split aleatorio causan leakage del futuro al pasado y métricas infladas. Cubrir TimeSeriesSplit, walk-forward validation (rolling y expanding), blocking para datos con dependencias intra-cluster, purged + embargoed CV (López de Prado, finanzas).

📚 Resultados de aprendizaje

Al finalizar, el estudiante podrá:

🗺️ Temas

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. TSSplit vs KFold leak: con serie sintética con tendencia, comparar score CV con KFold aleatorio vs TimeSeriesSplit. KFold infla.
  2. Walk-forward expanding: tscv = TimeSeriesSplit(n_splits=5). Iterar y reportar score por fold.
  3. Rolling window: con max_train_size=100, simular walk-forward de window fijo.
  4. gap: con feature y_t-1 (target lag), aplicar gap=1 para evitar que test "vea" su propio target.
  5. Score con dispersión: reportar mean ± std de RMSE por fold, no solo mean.

📝 Homework verificable

Forecasting con XGBoost en serie de retail:

  1. Feature engineering: lags 1, 7, 30 + rolling mean.
  2. CV con TimeSeriesSplit(5, gap=30).
  3. Reportar RMSE por fold + global.
  4. Comparar contra KFold ingenuo — mostrar inflación.

Criterio de aceptación: KFold subestima RMSE en ≥ 30 %; TimeSeriesSplit da estimación realista que se sostiene en test final.

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
Métrica CV mucho mejor que producción KFold sobre temporal. Fix: TimeSeriesSplit.
Feature y_t-1 y CV sin gap Target leak. Fix: gap = max_lag.
n_splits muy alto con serie corta Folds muy chicos. Fix: 3-5 folds.
Reportar solo mean Variabilidad oculta. Fix: mean ± std.
Rolling con max_train_size mal calibrado Train muy chico → ruido. Fix: ≥ 1 ciclo estacional.

❓ Preguntas frecuentes

❓ Expanding o rolling?

Expanding usa toda la historia (más data); rolling refleja "olvido" si crees que la dinámica cambia. Probá ambos.

❓ TimeSeriesSplit con feature engineering sobre toda la serie?

Leak. Fix: features con rolling/lag calculadas con min_periods=window para no usar futuro.

❓ Para crypto / trading?

Purged + embargoed (López de Prado Advances in Financial Machine Learning).

❓ Hyperparameter tuning con TimeSeriesSplit?

GridSearchCV con cv=TimeSeriesSplit(5). Funciona idéntico.

❓ Nested CV?

Recomendado para tuning + evaluation honesta. Outer TSSplit para reportar, inner para tunear.

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 054 — Proyecto end-to-end: visión, datos, exploración, preparación