Phase 02 - Lesson 15
Fundamentos de series temporales
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
El rendimiento pasado predice resultados futuros, si primero verifica la estacionariedad.
Tipo: Construcción Idioma: Python Requisitos previos: Fase 2, Lecciones 01-09 Tiempo: ~90 minutos
Objetivos de aprendizaje
- Descomponer una serie de tiempo en tendencia, estacionalidad y componentes residuales y probar su estacionariedad.
- Implementar funciones de retraso y estadísticas continuas para convertir una serie de tiempo en un problema de aprendizaje supervisado.
- Construir un marco de validación que evite que datos futuros se filtren en la entrenamiento.
- Explicar por qué las divisiones aleatorias de tren/prueba no son válidas para las series temporales y demostrar la brecha de rendimiento frente a las divisiones temporales adecuadas.
El problema
Tienes datos ordenados por tiempo. Ventas diarias, temperatura horaria, uso de CPU por minuto, precios de acciones semanales. Quiere predecir el próximo valor, la próxima semana, el próximo trimestre.
Busque su kit de herramientas de machine learning estándar: división aleatoria de entrenamiento/prueba, validación cruzada, entrada de matriz de características, salida de predicción. Cada paso es incorrecto.
Las series temporales rompen los supuestos en los que se basa el machine learning estándar. Las muestras no son independientes: la temperatura de hoy depende de la de ayer. Las divisiones aleatorias filtran inentrenamiento futura al pasado. Las características que lucen excelentes en el backtest fallan en producción porque dependen de patrones que cambian con el tiempo.
Un modelo que obtiene un 95 % de precisión con validación cruzada aleatoria podría obtener un 55 % con una evaluación adecuada basada en el tiempo. La diferencia no es un tecnicismo. Es la diferencia entre un modelo que funciona en papel y uno que funciona en producción.
Esta lección cubre los fundamentos: qué hace que los datos de tiempo sean diferentes, cómo evaluar modelos honestamente y cómo convertir una serie de tiempo en características que los modelos de ML estándar puedan consumir.
El concepto
¿Qué hace que las series temporales sean diferentes?
El ML estándar supone i.i.d. -- independientes e idénticamente distribuidos. Cada muestra se extrae de la misma distribución, independientemente de otras muestras. La serie temporal viola ambos:
- No independiente. El precio de las acciones de hoy depende del de ayer. Las ventas de esta semana se correlacionan con las de la semana pasada.
- No distribuida de manera idéntica. La distribución cambia con el tiempo. Las ventas de diciembre son diferentes a las de marzo.
Estas violaciones no son menores. Cambian la forma en que se crean funciones, cómo se evalúan los modelos y qué algoritmos funcionan.
flowchart LR
subgraph IID["Standard ML (i.i.d.)"]
direction TB
S1[Sample 1] ~~~ S2[Sample 2]
S2 ~~~ S3[Sample 3]
end
subgraph TS["Time Series (not i.i.d.)"]
direction LR
T1[t=1] --> T2[t=2]
T2 --> T3[t=3]
T3 --> T4[t=4]
end
style S1 fill:#dfd
style S2 fill:#dfd
style S3 fill:#dfd
style T1 fill:#ffd
style T2 fill:#ffd
style T3 fill:#ffd
style T4 fill:#ffd
En ML estándar, las muestras son intercambiables. Mezclarlos no cambia nada. En las series temporales, el orden lo es todo. La mezcla destruye la señal.
Componentes de una serie temporal
Cada serie temporal es una combinación de:
flowchart TD
A[Observed Time Series] --> B[Trend]
A --> C[Seasonality]
A --> D[Residual/Noise]
B --> E[Long-term direction: up, down, flat]
C --> F[Repeating patterns: daily, weekly, yearly]
D --> G[Random variation after removing trend and seasonality]
- Tendencia: La dirección a largo plazo. Los ingresos crecen un 10% anual. Aumento de la temperatura global.
- Estacionalidad: patrones repetidos a intervalos fijos. Las ventas minoristas aumentan en diciembre. El uso del aire acondicionado alcanza su punto máximo en julio.
- Residual: Lo que queda después de eliminar tendencia y estacionalidad. Si el residuo parece ruido blanco, la descomposición capturó la señal.
Estacionariedad
Una serie de tiempo es estacionaria si sus propiedades estadísticas (media, varianza, autocorrelación) no cambian con el tiempo. La mayoría de los métodos de pronóstico asumen estacionariedad.
Por qué es importante: Una serie no estacionaria tiene una media que se desplaza. Un modelo entrenado con datos de enero ha aprendido una media diferente a la que mostrará febrero. Será sistemáticamente incorrecto.
Cómo comprobarlo: Calcule la media móvil y la desviación estándar móvil sobre las ventanas. Si se desvían, la serie no es estacionaria.
Cómo solucionarlo: Diferenciación. En lugar de modelar los valores brutos, modele el cambio entre valores consecutivos:
diff[t] = value[t] - value[t-1]
Si una ronda de diferenciación no hace que la serie sea estacionaria, aplíquela nuevamente (diferenciación de segundo orden). La mayoría de las series del mundo real necesitan como máximo dos rondas.
Ejemplo:
Serie original: [100, 102, 106, 112, 120] Primera diferencia: [2, 4, 6, 8] (todavía con tendencia ascendente) Segunda diferencia: [2, 2, 2] (constante - estacionaria)
La serie original tenía una tendencia cuadrática. La primera diferenciación la convirtió en una tendencia lineal. La segunda diferenciación lo hizo plano. En la práctica, rara vez se necesitan más de dos rondas.
Prueba formal: La prueba Dickey-Fuller aumentada (ADF) es la prueba estadística estándar de estacionariedad. La hipótesis nula es "la serie no es estacionaria". Un valor p inferior a 0,05 significa que puede rechazar el valor nulo y concluir que es estacionario. No implementamos ADF desde cero (requiere tablas de distribución asintóticas), pero el enfoque de estadísticas continuas en nuestro código brinda una verificación visual práctica.
Autocorrelación
La autocorrelación mide cuánto se correlaciona un valor en el momento t con el valor en el momento t-k (k pasos en el pasado). La función de autocorrelación (ACF) traza esta correlación para cada retraso k.
ACF te dice:
- Qué tan atrás recuerda la serie. Si ACF cae a cero después del retraso 5, los valores de hace más de 5 pasos son irrelevantes.
- Si existe estacionalidad. Si el ACF aumenta en el desfase 12 (datos mensuales), hay estacionalidad anual.
- Cuántas funciones de retraso crear. Utilice retrasos hasta que el ACF se vuelva insignificante.
PACF (Función de Autocorrelación Parcial) elimina correlaciones indirectas. Si hoy se correlaciona con hace 3 días solo porque ambos se correlacionan con ayer, PACF en el retraso 3 será cero mientras que ACF en el retraso 3 no lo será.
Funciones de retraso: convertir series temporales en aprendizaje supervisado
Los modelos de ML estándar necesitan una matriz de características X y un objetivo y. Las series de tiempo le brindan una sola columna de valores. El puente tiene características de retraso.
Tome la serie [10, 12, 14, 13, 15] y cree funciones de retraso 1 y retraso 2:
| retraso_2 | retraso_1 | objetivo |
|---|---|---|
| 10 | 12 | 14 |
| 12 | 14 | 13 |
| 14 | 13 | 15 |
Ahora tienes un problema de regresión estándar. Cualquier modelo de ML (regresión lineal, random forest, aumento de gradiente) puede predecir el objetivo a partir de los retrasos.
Funciones adicionales que puede diseñar:
- Estadísticas continuas: media, estándar, mín., máx. sobre los últimos k valores
- Características del calendario: día de la semana, mes, is_holiday, is_weekend
- Valores diferenciados: cambio desde el paso anterior
- Estadísticas en expansión: media acumulada, suma acumulada
- Características de la relación: valor actual/media móvil (a qué distancia del promedio reciente)
- Características de interacción: lag_1 * day_of_week (efectos de los días laborables en el impulso)
¿Cuántos retrasos? Utilice la función de autocorrelación. Si el ACF es significativo hasta el desfase 10, utilice al menos 10 desfases. Si hay estacionalidad semanal, incluya el desfase 7 (y posiblemente el 14). Más retrasos le dan al modelo más historia pero también más características que ajustar, lo que aumenta el riesgo de sobreajuste.
La trampa de alineación del objetivo. Al crear funciones de retraso, el objetivo debe ser el valor en el momento t, y todas las funciones deben usar valores en el momento t-1 o antes. Si incluye accidentalmente el valor en el momento t como característica, tendrá un predictor perfecto y un modelo completamente inútil. Este es el error más común en la ingeniería de características de series temporales.
Validación de avance
Este es el concepto más importante de esta lección. La validación cruzada estándar k-fold asigna aleatoriamente muestras para entrenar y probar. Para series temporales, esto filtra inentrenamiento futura.
flowchart TD
subgraph WRONG["Random Split (WRONG)"]
direction LR
W1[Jan] --> W2[Mar]
W2 --> W3[Feb]
W3 --> W4[May]
W4 --> W5[Apr]
style W1 fill:#fdd
style W3 fill:#fdd
style W5 fill:#fdd
style W2 fill:#dfd
style W4 fill:#dfd
end
subgraph RIGHT["Walk-Forward (CORRECT)"]
direction LR
R1["Train: Jan-Mar"] --> R2["Test: Apr"]
R3["Train: Jan-Apr"] --> R4["Test: May"]
R5["Train: Jan-May"] --> R6["Test: Jun"]
style R1 fill:#dfd
style R2 fill:#fdd
style R3 fill:#dfd
style R4 fill:#fdd
style R5 fill:#dfd
style R6 fill:#fdd
end
Validación directa:
- Entrene con datos hasta el momento t
- Predecir en el momento t+1 (o t+1 a t+k para varios pasos)
- Desliza la ventana hacia adelante.
- Repetir
Cada pliegue de prueba solo contiene datos que vienen después de todos los datos de entrenamiento. Sin fugas futuras. Esto le brinda una estimación honesta de cómo funcionará el modelo cuando se implemente.
Ventana en expansión utiliza todos los datos históricos para el entrenamiento (la ventana crece). Ventana deslizante utiliza una ventana de entrenamiento de tamaño fijo (ventana deslizante). Utilice la expansión cuando crea que los datos más antiguos aún son relevantes. Utilice el deslizamiento cuando el mundo cambie y los datos antiguos duelan.
ARIMA Intuición
ARIMA es el modelo clásico de series temporales. Tiene tres componentes:
- AR (Autoregresivo): Predecir a partir de valores pasados. AR(p) utiliza los últimos valores de p.
- I (Integrado): Diferenciación para lograr estacionariedad. I(d) aplica d rondas de diferenciación.
- MA (promedio móvil): Predice a partir de errores de pronóstico anteriores. MA(q) utiliza los últimos q errores.
ARIMA(p, d, q) combina los tres. Usted elige p, d, q según el análisis ACF/PACF o la búsqueda automática (auto-ARIMA).
No implementaremos ARIMA desde cero; requiere una optimización numérica que está más allá del alcance de esta lección. La idea clave es comprender qué hace cada componente para poder interpretar los resultados de ARIMA y saber cuándo usarlo.
Cuándo usar qué
| Enfoque | Mejor para | Maneja la estacionalidad | Maneja características externas |
|---|---|---|---|
| Funciones de retraso + ML | Tabular con muchas características externas | Con funciones de calendario | Sí |
| ARIMA | Serie única univariada, a corto plazo | Variante SARIMA | No (ARIMAX limitado) |
| Suavizado exponencial | Tendencia simple + estacionalidad | Sí (Holt-Winters) | No |
| Profeta | Previsión de negocios, vacaciones | Sí (términos de Fourier) | Limitado |
| Redes neuronales (LSTM, Transformer) | Secuencias largas, muchas series | Aprendido | Sí |
Para la mayoría de los problemas prácticos, las características de retraso + aumento de gradiente son el punto de partida más sólido. Maneja funciones externas de forma natural, no requiere estacionariedad y es fácil de depurar.
Previsión de horizontes y estrategias
El pronóstico de un solo paso predice un paso adelante. La previsión de varios pasos predice varios pasos. Hay tres estrategias:
Recursivo (iterado): Predice un paso adelante, usa la predicción como entrada para el siguiente paso. Simple, pero los errores se acumulan: cada predicción utiliza la predicción anterior, por lo que los errores se acumulan.
Directo: Entrene un modelo separado para cada horizonte. El Modelo 1 predice t+1, el Modelo 5 predice t+5. No hay acumulación de errores, pero cada modelo tiene menos muestras de entrenamiento y no comparten inentrenamiento.
Salida múltiple: Entrene un modelo que genere todos los horizontes simultáneamente. Comparte inentrenamiento entre horizontes, pero requiere un modelo que admita múltiples resultados (o una función de pérdida personalizada).
Para la mayoría de los problemas prácticos, comience con recursivo para horizontes cortos (1 a 5 pasos) y directo para horizontes más largos.
Errores comunes en series temporales
| Error | Por qué sucede | Cómo solucionarlo |
|---|---|---|
| División aleatoria de tren/prueba | Hábito del ML estándar | Utilice el avance o la división temporal |
| Uso de funciones futuras | Característica en el momento t incluida por error | Audite cada característica para la alineación temporal |
| Sobreadaptación a la estacionalidad | Modelo memoriza patrones de calendario | Mantenga un ciclo estacional completo en el conjunto de prueba |
| Ignorar los cambios de escala | Los ingresos se duplican pero los patrones se mantienen | Cambio porcentual del modelo en lugar de absoluto |
| Demasiadas funciones de retraso | "Más historia es mejor" | Utilice ACF para determinar retrasos relevantes |
| Sin diferenciar | "El modelo lo resolverá" | Los modelos de árbol manejan las tendencias; los modelos lineales necesitan estacionariedad |
Constrúyelo
El código en code/time_series.py implementa los componentes básicos desde cero.
Creador de funciones de retraso
def make_lag_features(series, n_lags):
n = len(series)
X = np.full((n, n_lags), np.nan)
for lag in range(1, n_lags + 1):
X[lag:, lag - 1] = series[:-lag]
valid = ~np.isnan(X).any(axis=1)
return X[valid], series[valid]
Esto convierte una serie 1D en una matriz de características donde cada fila tiene los últimos valores n_lags como características y el valor actual como objetivo.
Validación cruzada avanzando
def walk_forward_split(n_samples, n_splits=5, min_train=50):
assert min_train < n_samples, "min_train must be less than n_samples"
step = max(1, (n_samples - min_train) // n_splits)
for i in range(n_splits):
train_end = min_train + i * step
test_end = min(train_end + step, n_samples)
if train_end >= n_samples:
break
yield slice(0, train_end), slice(train_end, test_end)
Cada división garantiza que los datos de entrenamiento lleguen estrictamente antes que los datos de prueba. La ventana de entrenamiento se expande con cada pliegue.
Modelo autorregresivo simple
Un modelo AR puro es simplemente una regresión lineal sobre características de retraso:
class SimpleAR:
def __init__(self, n_lags=5):
self.n_lags = n_lags
self.weights = None
self.bias = None
def fit(self, series):
X, y = make_lag_features(series, self.n_lags)
# Solve via normal equations
X_b = np.column_stack([np.ones(len(X)), X])
theta = np.linalg.lstsq(X_b, y, rcond=None)[0]
self.bias = theta[0]
self.weights = theta[1:]
return self
Esto es conceptualmente idéntico a la regresión lineal de la Lección 02, pero se aplica a versiones retrasadas de la misma variable.
Verificación de estacionariedad
El código calcula estadísticas móviles para evaluar visual y numéricamente la estacionariedad:
def check_stationarity(series, window=50):
rolling_mean = np.array([
series[max(0, i - window):i].mean()
for i in range(1, len(series) + 1)
])
rolling_std = np.array([
series[max(0, i - window):i].std()
for i in range(1, len(series) + 1)
])
return rolling_mean, rolling_std
Si la media móvil se desplaza o la estándar móvil cambia, la serie no es estacionaria. Aplique la diferenciación y verifique nuevamente.
El código también verifica la estacionariedad comparando la primera mitad y la segunda mitad de la serie. Si las medias difieren en más de la mitad de una desviación estándar o el índice de varianza excede 2x, la serie se marca como no estacionaria.
Autocorrelación
def autocorrelation(series, max_lag=20):
n = len(series)
mean = series.mean()
var = series.var()
acf = np.zeros(max_lag + 1)
for k in range(max_lag + 1):
cov = np.mean((series[:n-k] - mean) * (series[k:] - mean))
acf[k] = cov / var if var > 0 else 0
return acf
Úsalo
Con sklearn, utilizas funciones de retraso directamente con cualquier regresor:
from sklearn.linear_model import Ridge
from sklearn.ensemble import GradientBoostingRegressor
X, y = make_lag_features(series, n_lags=10)
for train_idx, test_idx in walk_forward_split(len(X)):
model = Ridge(alpha=1.0)
model.fit(X[train_idx], y[train_idx])
predictions = model.predict(X[test_idx])
Para ARIMA, utilice modelos de estadísticas:
from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(train_series, order=(5, 1, 2))
fitted = model.fit()
forecast = fitted.forecast(steps=30)
El código en time_series.py demuestra ambos enfoques y los compara mediante validación directa.
aprender TimeSeriesSplit
sklearn proporciona TimeSeriesSplit que implementa la validación directa:
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
model.fit(X_train, y_train)
score = model.score(X_test, y_test)
Esto es equivalente a nuestro walk_forward_split desde cero pero está integrado en el marco de validación cruzada de sklearn. Puedes usarlo con cross_val_score:
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=TimeSeriesSplit(n_splits=5))
print(f"Mean score: {scores.mean():.4f} +/- {scores.std():.4f}")
Métricas de evaluación
El pronóstico de series de tiempo utiliza métricas de regresión, pero con un contexto temporal:
- MAE (Error absoluto medio): Promedio de |y_true - y_pred|. Fácil de interpretar en unidades originales. "En promedio, las predicciones están equivocadas en 3,2 grados".
- RMSE (Error cuadrático medio): Raíz cuadrada del error cuadrático medio. Penaliza los grandes errores más que MAE. Úselo cuando los errores grandes sean peores que muchos errores pequeños.
- MAPE (Error porcentual absoluto medio): Promedio de |error / valor_verdadero| * 100. Independiente de la escala, útil para comparar diferentes series. Pero indefinido cuando los valores verdaderos son cero.
- Comparación ingenua de líneas de base: Compare siempre con líneas de base simples. La línea de base ingenua estacional predice el valor de hace un período (ayer, la semana pasada). Si su modelo no puede vencer a los ingenuos, algo anda mal.
Funciones rodantes
El código demuestra cómo agregar estadísticas continuas (media, estándar, mínima, máxima en períodos de 7 y 14 días) a las funciones de retraso. Estos brindan al modelo inentrenamiento sobre las tendencias recientes y la volatilidad que las características de rezago por sí solas no capturan.
Por ejemplo, si la media móvil aumenta, sugiere una tendencia ascendente. Si el estándar móvil está aumentando, sugiere una volatilidad creciente. Estos son los tipos de patrones de los que los modelos basados en árboles pueden aprender, pero los modelos lineales no.
Envíalo
Esta lección produce:
outputs/prompt-time-series-advisor.md: un mensaje para encuadrar problemas de series temporalescode/time_series.py-- funciones de retraso, validación anticipada, modelo AR, comprobaciones de estacionariedad
Líneas de base que debes superar
Antes de construir cualquier modelo, establezca líneas de base:
- Último valor (persistencia). Predice que mañana será igual que hoy. Para muchas series, esto es sorprendentemente difícil de superar.
- Ingenuo estacional. Predice que hoy será el mismo día de la semana pasada (o del año pasado). Si su modelo no puede superar esto, no ha aprendido ningún patrón útil más allá de la estacionalidad.
- Promedio móvil. Predice el promedio de los últimos k valores. Suaviza el ruido pero no puede capturar cambios repentinos.
Si su sofisticado modelo de ML pierde frente a la base ingenua estacional, tiene un error. Lo más común es: fugas futuras de funciones, método de evaluación incorrecto o la serie es verdaderamente aleatoria e impredecible.
Consejos prácticos
Empiece por trazar. Antes de cualquier modelado, trace la serie sin procesar. Busque tendencias, estacionalidad, valores atípicos, rupturas estructurales (cambios repentinos de comportamiento). Una inspección visual de 30 segundos a menudo proporciona más de una hora de análisis automatizado.
Primero la diferencia, después el modelo. Si la serie tiene una tendencia clara, diferénciala antes de crear características de retraso. Los modelos basados en árboles pueden manejar tendencias, pero los modelos lineales no, y diferenciar nunca está de más.
Mantenga al menos un ciclo estacional completo. Si tiene estacionalidad semanal, su equipo de prueba necesita al menos una semana completa. Si es mensual, al menos un mes completo. De lo contrario, no se puede evaluar si el modelo captó el patrón estacional.
Monitor en producción. Los modelos de series temporales se degradan con el tiempo a medida que el mundo cambia. Realice un seguimiento de los errores de predicción de forma continua. Cuando los errores comiencen a aumentar, vuelva a entrenar el modelo con datos recientes.
Cuidado con los cambios de régimen. Un modelo entrenado con datos prepandémicos no predecirá el comportamiento pospandémico. Incluya indicadores de cambios de régimen conocidos como características o utilice una ventana deslizante que olvide datos antiguos.
Series asimétricas de transentrenamiento logarítmica. Los ingresos, los precios y los recuentos suelen estar asimétricos a la derecha. Tomar el registro estabiliza la varianza y hace que los patrones multiplicativos sean aditivos, algo que los modelos lineales pueden manejar. Pronosticar en el espacio logarítmico y luego exponenciar para volver a las unidades originales.
Ejercicios
Experimento de estacionariedad. Genera una serie con una tendencia lineal. Verifique la estacionariedad con estadísticas móviles. Aplicar la primera diferenciación. Compruébalo de nuevo. ¿Cuántas rondas de diferenciación se necesitan para obtener una tendencia cuadrática?
Selección de retardo. Calcule el ACF en una serie estacional (período=7). ¿Qué rezagos tienen la mayor autocorrelación? Cree funciones de retraso utilizando solo esos retrasos (no retrasos consecutivos). ¿Mejora la precisión en comparación con el uso de retrasos del 1 al 7?
Avance versus división aleatoria. Entrene una regresión Ridge en características de retraso. Evalúe con división aleatoria 80/20 y con validación directa. ¿Cuánto sobreestima el rendimiento la división aleatoria?
Ingeniería de características. Agregue funciones de media móvil (ventana = 7), estándar móvil (ventana = 7) y día de la semana a las funciones de retraso. Compare la precisión con y sin estos extras mediante la validación directa.
Pronóstico de varios pasos. Modifique el modelo AR para predecir 5 pasos adelante en lugar de 1. Compare dos estrategias: (a) predecir un paso, usar la predicción como entrada para el siguiente paso (recursivo) y (b) entrenar modelos separados para cada horizonte (directo). ¿Cuál es más preciso?
Términos clave
| Término | Lo que dice la gente | Lo que realmente significa |
|---|---|---|
| Estacionariedad | "Las estadísticas no cambian con el tiempo" | Una serie cuya estructura de media, varianza y autocorrelación son constantes en el tiempo |
| Diferenciación | "Restar valores consecutivos" | Calcular y[t] - y[t-1] para eliminar tendencias y lograr estacionariedad |
| Autocorrelación (ACF) | "Cómo se correlaciona una serie consigo misma" | La correlación entre una serie temporal y una copia rezagada de sí misma, en función del rezago |
| Autocorrelación parcial (PACF) | "Sólo correlación directa" | Autocorrelación en el rezago k después de eliminar el efecto de todos los rezagos más cortos |
| Funciones de retraso | "Valores pasados como entradas" | Usando y[t-1], y[t-2], ..., y[t-k] como características para predecir y[t] |
| Validación directa | "Validación cruzada respetuosa del tiempo" | Evaluación donde los datos de entrenamiento siempre preceden cronológicamente a los datos de prueba |
| ARIMA | "El modelo clásico de series temporales" | Media móvil integrada autorregresiva: combina valores pasados (AR), diferenciación (I) y errores pasados (MA) |
| Estacionalidad | "Patrones de calendario repetidos" | Ciclos regulares y predecibles en una serie temporal vinculada a períodos del calendario (diario, semanal, anual) |
| Tendencia | "La dirección a largo plazo" | Un aumento o disminución persistente del nivel de la serie a lo largo del tiempo |
| Ventana desplegable | "Usar todo el historial" | Validación directa donde el conjunto de entrenamiento crece con cada pliegue |
| Ventana corredera | "Historial de tamaño fijo" | Validación directa donde el conjunto de entrenamiento es una ventana de longitud fija que se desliza hacia adelante |
Lectura adicional
- Hyndman y Athanasopoulos, Forecasting: Principios y práctica (3ª ed.) -- el mejor libro de texto gratuito sobre pronóstico de series temporales
- scikit-learn División de serie temporal -- divisor de avance de sklearn
- statsmodels ARIMA docs -- Implementación de ARIMA con diagnóstico
- Makridakis et al., The M5 Competition (2022) -- competencia de pronóstico a gran escala que muestra métodos de ML versus métodos estadísticos