Evaluar modelos de pronóstico: train/test, cross-validation de series de tiempo y métricas de error
Que un modelo ajuste bien su historia de entrenamiento dice poco sobre cómo va a pronosticar. Los residuales se calculan sobre datos que el modelo ya vio, y los modelos flexibles pueden ajustar ruido — por eso el error in-sample subestima sistemáticamente el error real de pronóstico (Hyndman & Athanasopoulos, FPP3 §5.8). Toda afirmación sobre precisión debe venir de datos que el modelo nunca vio. Este post cubre las tres herramientas que lo hacen posible: la división train/test, la cross-validation de series de tiempo y las métricas de error que calculas encima.
División train/test: temporal, nunca aleatoria
En series de tiempo, la división es un corte en el tiempo: entrenas con el pasado, evalúas con el segmento más reciente. Una ventana de prueba de alrededor del 20% de la serie es un default común, y debe ser al menos tan larga como el horizonte que piensas pronosticar (FPP3 §5.8).
Lo que no debes hacer es barajar observaciones en folds aleatorios, como en la k-fold cross-validation estándar. Las observaciones adyacentes de una serie están correlacionadas; barajar mete el “futuro” dentro del set de entrenamiento y fuga información. La excepción es estrecha: en configuraciones puramente autorregresivas con errores no correlacionados, k-fold puede seguir siendo válida (Bergmeir, Hyndman & Koo, 2018) — pero para pipelines generales con tendencia, estacionalidad o variables exógenas, mantén la división temporal (Bergmeir & Benítez, 2012).
Cross-validation de origen rodante
Una sola división evalúa el modelo en un solo punto del tiempo. La evaluación de origen rodante — la forma de cross-validation para series de tiempo — la repite: entrenas hasta un origen, pronosticas la siguiente ventana, avanzas el origen, repites, y promedias los errores entre folds (Tashman, 2000; FPP3 §5.10). El diagrama de arriba es exactamente eso: la ventana de entrenamiento se expande y el bloque de prueba siempre va adelante.
Obtienes un estimado de error más robusto, una curva de error contra horizonte, y protección contra el problema de la división con suerte. En Python, sklearn.model_selection.TimeSeriesSplit implementa el esquema de ventana expansiva.
Qué métrica de error, y cuándo
Todas se calculan sobre los folds de prueba. Responden preguntas distintas (Hyndman & Koehler, 2006):
| Métrica | Tipo | Fortalezas | Debilidades |
|---|---|---|---|
| MAE | Dependiente de escala | Robusta, interpretable en unidades | No comparable entre series |
| RMSE | Dependiente de escala | Penaliza los errores grandes | Sensible a outliers |
| MAPE | Porcentual | Familiar para usuarios de negocio | Indefinida en ceros; penaliza más el sobre-pronóstico |
| sMAPE | Porcentual | Acotada; usada en las competencias M | Aún inestable cerca de cero |
| MASE | Escalada | Definida con ceros; comparable entre series | Menos intuitiva de explicar |
MASE escala el error por el MAE in-sample de un pronóstico naïve, de modo que MASE < 1 significa “le gana al naïve” en cualquier serie, incluida demanda intermitente con ceros — la razón por la que Hyndman & Koehler la propusieron como default para comparar entre series. Para agregar el error de un portafolio de SKUs en términos que pesan dinero, el complemento del lado de negocio es WMAPE — cubierto en nuestro post de métricas.
Checklist
- Divide temporalmente; ventana de prueba ≥ horizonte de pronóstico.
- Sin fugas: escaladores, encoders de features y tuning de hiperparámetros se ajustan solo con train.
- Usa evaluación de origen rodante en lugar de una sola división cuando la serie lo permita.
- Reporta una métrica escalada (MASE) junto a una métrica de negocio (WMAPE).
- Compara todo modelo contra un baseline naïve — si no le gana al naïve fuera de muestra, no está agregando valor.
Esta es la disciplina de evaluación detrás de Forecast Studio: después de cada entrenamiento, el visor de la app muestra las métricas de error y te deja comparar variables lado a lado, para que el modelo que promuevas sea el que ganó con datos nunca vistos — puedes reproducir todo lo de este post en el tenant público del plan Free.
Fuentes: Hyndman & Athanasopoulos, Forecasting: Principles and Practice (3.ª ed.), §5.8 y §5.10 · Hyndman & Koehler (2006), IJF · Tashman (2000), IJF · Bergmeir & Benítez (2012), Information Sciences · Bergmeir, Hyndman & Koo (2018), CSDA · scikit-learn TimeSeriesSplit