Pronóstico clásico vs. Machine Learning: ¿Cuándo ARIMA supera a una LSTM?
En el artículo anterior, el equipo de la panadería de Nora vio cómo su LSTM se estrellaba con dos años de datos de ventas de pan de masa madre. Un modelo clásico de ARIMA/SARIMA ganó cómodamente. ¿Fue un caso aislado o un patrón general? Ella está realizando el mismo enfrentamiento directo en un benchmark público — el clásico conjunto de datos de pasajeros de aerolíneas, un caso de prueba independiente que no son los propios datos de la panadería.
1. El enigma: ¿Por qué a veces gana el modelo más simple?
El Deep Learning ha sido llamado el rey de la ciencia de datos durante años. ¿Tienes un problema complejo? Lánzale una red neuronal. Pero en el pronóstico de series de tiempo, la historia cambia. Un modelo matemático de la década de 1970—ARIMA—suele superar a una red LSTM (Long Short-Term Memory) de vanguardia.
Piensa en una puerta. Si quieres predecir si se abrirá, no necesitas una supercomputadora simulando cada átomo. Solo necesitas entender la bisagra. ARIMA funciona como ese modelo de bisagra. Captura la mecánica básica de cómo se mueve un número a lo largo del tiempo.
Así que pongámoslos a competir cara a cara en un conjunto de datos clásico: el número mensual de pasajeros de aerolínea.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.metrics import mean_absolute_error
# Load data
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv'
df = pd.read_csv(url, index_col='Month', parse_dates=True)
data = df['Passengers'].values.astype('float32')
# Split: 80% train, 20% test
train_size = int(len(data) * 0.8)
train, test = data[:train_size], data[train_size:]
# 1. ARIMA Model
# We use a simple (5,1,0) configuration
arima_model = ARIMA(train, order=(5,1,0))
arima_result = arima_model.fit()
arima_pred = arima_result.forecast(steps=len(test))
# 2. LSTM Model
scaler = MinMaxScaler(feature_range=(0, 1))
train_scaled = scaler.fit_transform(train.reshape(-1, 1))
def create_dataset(dataset, look_back=1):
X, Y = [], []
for i in range(len(dataset)-look_back-1):
X.append(dataset[i:(i+look_back), 0])
Y.append(dataset[i + look_back, 0])
return np.array(X), np.array(Y)
look_back = 12
X_train, y_train = create_dataset(train_scaled, look_back)
X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1]))
lstm_model = Sequential([
LSTM(4, input_shape=(1, look_back)),
Dense(1)
])
lstm_model.compile(loss='mean_squared_error', optimizer='adam')
lstm_model.fit(X_train, y_train, epochs=50, batch_size=1, verbose=0)
# Prepare test data for LSTM
inputs = data[len(data) - len(test) - look_back:]
inputs = scaler.transform(inputs.reshape(-1, 1))
X_test, _ = create_dataset(inputs, look_back)
X_test = np.reshape(X_test, (X_test.shape[0], 1, X_test.shape[1]))
lstm_pred = scaler.inverse_transform(lstm_model.predict(X_test))
print(f"ARIMA MAE: {mean_absolute_error(test, arima_pred):.2f}")
print(f"LSTM MAE: {mean_absolute_error(test, lstm_pred):.2f}")
pd.read_csv(url, index_col='Month', parse_dates=True)— carga el CSV de la aerolínea con la columnaMonthanalizada como datetime y establecida como índice, para que pandas trate los datos como una serie de tiempo adecuada.data = df['Passengers'].values.astype('float32')— extrae los conteos de pasajeros como un arreglo de NumPy de flotantes de 32 bits, el dtype que prefiere Keras/TensorFlow.train_size = int(len(data) * 0.8)— divide un 80% de la serie para entrenamiento y un 20% para prueba;data[:train_size]ydata[train_size:]realizan el recorte correspondiente.ARIMA(train, order=(5,1,0))— ajusta un modelo ARIMA con rezagos autorregresivos, diferenciación, y términos de media móvil.arima_result.forecast(steps=len(test))— produce un pronóstico para el mismo número de pasos que el conjunto de prueba, para que podamos comparar directamente.MinMaxScaler(feature_range=(0, 1))— comprime los datos de entrenamiento en el intervalo [0, 1], lo que ayuda a que la optimización basada en gradientes de la LSTM converja.create_dataset— una función auxiliar que desliza una ventana delook_backvalores pasados a través de la serie, construyendo pares de entrada/salida para el formato supervisado de la LSTM.look_back = 12— utiliza 12 meses de historial como ventana de entrada para cada predicción, coincidiendo con el ciclo anual.Sequential([LSTM(4, input_shape=(1, look_back)), Dense(1)])— una LSTM mínima con 4 unidades ocultas que alimentan una sola neurona de salida densa.lstm_model.fit(..., epochs=50, batch_size=1, verbose=0)— entrena durante 50 pasadas sobre los datos, una muestra a la vez, con los registros de entrenamiento suprimidos.scaler.inverse_transform(lstm_model.predict(X_test))— convierte las predicciones escaladas de la LSTM de vuelta a conteos crudos de pasajeros para una comparación justa contra el conjunto de prueba.
En esta ejecución, el MAE de ARIMA suele ser menor que el de la LSTM. ARIMA podría fallar por 45 pasajeros, mientras que la LSTM falla por 60. El patrón es claro: para conjuntos de datos pequeños y estacionales, el modelo ‘elegante’ se sobreajusta al ruido. El modelo simple se mantiene enfocado en la tendencia.
2. Qué hace realmente ARIMA (en una frase)
ARIMA son las siglas de AutoRegressive Integrated Moving Average. Es un nombre largo de pronunciar, pero son solo tres ideas combinadas.
- Autorregresión (AR): El futuro se parece al pasado. Si llovió ayer, es muy probable que llueva hoy.
- Integrado (I): Si los datos muestran una tendencia al alza, no usamos los valores brutos. Usamos la diferencia entre hoy y ayer. Eso hace que los datos sean ‘estacionarios’: su media no se desplaza con el tiempo.
- Media Móvil (MA): Aprendemos de los errores del pasado. Si el pronóstico de ayer fue demasiado alto, ajustamos el de hoy a la baja.
Entonces, ¿cómo limpia la diferenciación (la parte ‘I’) un conjunto de datos con tendencia?
# Visualizing stationarity
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.plot(data)
plt.title("Original (Non-Stationary)")
plt.subplot(1, 2, 2)
plt.plot(np.diff(data))
plt.title("Differenced (Stationary)")
plt.tight_layout()
plt.show()
plt.subplot(1, 2, 1)— crea el panel izquierdo de una cuadrícula de 1×2 para la serie original.plt.plot(data)— grafica los recuentos brutos de pasajeros, que muestran una tendencia al alza y son claramente no estacionarios.np.diff(data)— diferenciación de primer orden: resta cada valor de su predecesor, generando la serie de cambios que fluctúa alrededor de cero.plt.subplot(1, 2, 2)— crea el panel derecho para la serie diferenciada.plt.tight_layout()— ajusta el espaciado de los subgráficos para que los dos paneles no se superpongan ni se recorten.
El segundo gráfico oscila alrededor de cero. Eso es lo que ARIMA busca. Predecir un valor que se mantiene dentro de un rango es mucho más fácil que predecir uno que se dispara hacia el infinito.
3. Lo que las redes neuronales hacen de forma diferente
Las redes neuronales como las LSTMs no asumen que el mundo es lineal. Piensa en ellas como chefs que aprenden una receta viendo a alguien cocinar mil veces. No necesitan que se les diga “el futuro se parece al pasado”. Descubren los patrones ocultos por sí mismas.
El problema es que las LSTMs son hambrientas de datos. Una red neuronal tiene miles de pequeñas ‘perillas’ (pesos) para ajustar. Dale solo 100 puntos de datos, y los memoriza perfectamente — y luego falla cuando ve algo nuevo. Eso es sobreajuste.
4. El régimen de datos es lo que más importa
Entonces, ¿cuándo recurrir a cada uno? Se reduce al compromiso entre sesgo y varianza.
- ARIMA tiene un sesgo alto: Asume que el mundo es simple. Si el mundo en realidad es complejo, ARIMA nunca será perfecto.
- Las redes neuronales tienen una varianza alta: Son lo suficientemente flexibles para adaptarse a cualquier forma. Pero podrían “alucinar” patrones en el ruido aleatorio.
Intenta simular un cambio de régimen—donde las reglas de los datos cambian de repente—y observa cómo cada modelo lo maneja.
# Synthetic data: 500 points of a simple wave, then a sudden jump
t = np.linspace(0, 100, 1000)
y = np.sin(t) + np.random.normal(0, 0.1, 1000)
y[500:] += 5 # The Regime Shift
# ARIMA usually struggles with sudden structural breaks
# LSTM can sometimes learn these if it has seen them before
plt.plot(y)
plt.axvline(x=500, color='r', linestyle='--', label='Regime Shift')
plt.legend()
plt.show()
np.linspace(0, 100, 1000)— genera 1000 puntos uniformemente espaciados de 0 a 100 como el eje de tiempo.np.sin(t) + np.random.normal(0, 0.1, 1000)— construye una onda sinusoidal con ruido gaussiano ligero para simular un patrón oscilante estable.y[500:] += 5— añade un salto vertical de 5 unidades comenzando en el punto 500, simulando una ruptura estructural o “cambio de régimen”.plt.axvline(x=500, color='r', linestyle='--', label='Regime Shift')— dibuja una línea vertical roja discontinua en el punto de ruptura como referencia visual.
Con 50,000 filas de datos y saltos extraños como este, la LSTM eventualmente aprende que los saltos ocurren. ARIMA simplemente se confunde y produce un error enorme.
5. Ingeniería de características: ARIMA vs. redes neuronales
ARIMA maneja información adicional —el clima, por ejemplo— a través de “ARIMAX”. Debes ser explícito al respecto. Una red neuronal simplemente toma otra columna en la matriz de entrada.
La contrapartida es la interpretabilidad. Si ARIMA predice un aumento de precio, puedes revisar los coeficientes: “Es la tendencia de la semana pasada”. La respuesta de una red neuronal se acerca más a “Porque así lo dicen estos 5,000 pesos”. En muchos negocios, el por qué importa más que el qué.
6. El verdadero trade-off: precisión vs. todo lo demás
| Característica | ARIMA | LSTM (Red Neuronal) |
|---|---|---|
| Velocidad de Entrenamiento | Segundos | Minutos/Horas |
| Datos Necesarios | Muy Pocos (50+) | Muchos (1000+) |
| Interpretabilidad | Alta | Baja |
| Hardware | Tu Laptop | A menudo necesita una GPU |
Si estás pronosticando 10,000 productos diferentes para una pequeña tienda de comestibles, no puedes esperar 10 horas para que una red neuronal entrene para cada uno. ARIMA gana en escala y velocidad siempre.
7. Un árbol de decisión: ¿cuál deberías usar?
Aquí tienes una regla general que puede ahorrarte semanas de trabajo:
- ¿Menos de 500 puntos de datos? Usa ARIMA.
- ¿El patrón es una onda estacional simple que sube y baja? Usa ARIMA.
- ¿10,000+ puntos con patrones extraños o no lineales? Prueba con un LSTM.
- ¿Necesitas explicarle el resultado a un jefe? Usa ARIMA.
Un movimiento más: prueba un ensamble. Promedia ambos modelos. Los errores de ARIMA y LSTM tienden a cancelarse entre sí.
8. Errores comunes: por qué la gente se equivoca con esto
¿El mayor error? Sesgo de ajuste. Un investigador pasa tres días ajustando la tasa de aprendizaje y las capas de una red neuronal, y luego ejecuta un modelo ARIMA predeterminado durante 30 segundos. La red neuronal gana. Para una comparación justa, utiliza herramientas como auto_arima para darle al modelo clásico su mejor oportunidad.
9. Un ejemplo del mundo real: pronóstico de demanda de energía
La demanda de electricidad es un punto intermedio. Presenta fuertes ciclos diarios — las personas despiertan, encienden las luces — y la temperatura añade su propia influencia.
Un enfoque híbrido suele ganar aquí. ARIMA maneja el ritmo diario básico. Una pequeña red neuronal detecta los choques provocados por los cambios de clima.
10. Cuándo replantear tu decisión
Los datos cambian. Esto se llama deriva de conceptos. Si tu empresa pasa de 10 clientes a 10,000, tus datos podrían volverse menos ruidosos y presentar más patrones. Ese es el momento de cambiar de ARIMA a una red neuronal. Por lo tanto, monitorea tus tasas de error. Si el error de ARIMA comienza a subir mes tras mes, la ‘bisagra simple’ podría haberse roto, y es posible que necesites un modelo más complejo.
11. Puntos clave y próximos pasos
- La complejidad no es una característica; es un costo. Solo paga ese costo si obtienes una mejora masiva en la precisión.
- ARIMA es la línea base. Nunca confíes en un pronóstico de red neuronal a menos que primero pueda superar a un modelo ARIMA simple.
- El tamaño de los datos dicta la herramienta. Datos pequeños = Clásico. Datos masivos = Aprendizaje automático.
El patrón se mantiene. Con datos limitados, lo más simple gana. Nora regresa para desarrollar adecuadamente las funciones de pronóstico de la panadería, y retomamos desde allí.
Comprueba tu comprensión
Las preguntas a continuación avanzan desde el simple recuerdo hasta el diseño abierto, siguiendo aproximadamente la Taxonomía de Bloom.
Recordar Según el árbol de decisión del artículo, ¿qué dos factores importan más al elegir entre ARIMA y un LSTM?
Entender Con tus propias palabras, explica por qué el artículo llama a ARIMA “Alto Sesgo” y a las Redes Neuronales “Alta Varianza”, conectándolo con el Compromiso de Sesgo y Varianza.
Aplicar Usando el árbol de decisión del artículo, ¿recurrirías a ARIMA o a un LSTM para pronosticar las ventas diarias de una tienda completamente nueva que tiene solo 200 días de historial con un claro patrón semanal? Analiza qué regla(s) se aplican.
Analizar El artículo dice que el mayor error es el “Sesgo de Ajuste” (Tuning Bias): pasar días ajustando una red neuronal pero solo segundos en un ARIMA con valores predeterminados. Explica por qué esta comparación es injusta incluso antes de mirar los números de precisión y qué requeriría una comparación justa de ambas partes.
Evaluar El “Consejo Profesional” del artículo sugiere ensamblar ARIMA y LSTM porque “los errores… se cancelan mutuamente”. Critica esto como una recomendación por defecto: ¿bajo qué circunstancia promediar un buen modelo (ARIMA) con un mal modelo sobreajustado (LSTM con muy pocos datos) haría que el pronóstico combinado fuera peor que ARIMA por sí solo?
Crear Diseña un plan de monitoreo para el escenario de “Deriva de Concepto” que describe el artículo — una empresa que crece de 10 a 10,000 clientes. ¿Qué señal específica en tu error de pronóstico te indicaría que es hora de reconsiderar ARIMA en favor de una red neuronal y con qué frecuencia lo revisarías?
Artículos relacionados
- ARIMA y SARIMA, de forma intuitiva: Cuándo gana el pronóstico clásico — el artículo anterior: el equipo de la panadería de Nora prueba una LSTM para la demanda de pan de masa madre y ve cómo fracasa frente a ARIMA.
- Ingeniería de características para series de tiempo: Rezagos, ventanas deslizantes y más — el siguiente artículo: Nora regresa a los datos de la propia panadería para construir características de rezago y ventanas deslizantes para las ventas diarias.
Referencias y lecturas adicionales
- Makridakis, E., Spiliotis, E., & Assimakopoulos, V. (2018). “Statistical and Machine Learning forecasting methods: Concerns and ways forward.” PLOS ONE, 13(3), e0194889. — el artículo de la competencia M4 que evaluó sistemáticamente los métodos de pronóstico clásicos frente a los de ML.
- Competencia de Kaggle “M5 Forecasting — Accuracy”: https://www.kaggle.com/competitions/m5-forecasting-accuracy — pronóstico de ventas minoristas de Walmart; un benchmark del mundo real donde tanto los métodos clásicos como los de ML fueron sometidos a pruebas de estrés.
- Documentación de ARIMA en statsmodels: https://www.statsmodels.org/stable/generated/statsmodels.tsa.arima.model.ARIMA.html
Esta traducción fue generada automáticamente y puede contener errores. Si el idioma inglés es tu preferencia, puedes leer el artículo original en inglés .
«Aplica lo que aprendiste» es para suscriptores Supporter e Insider.
Suscríbete para desbloquear los ejercicios de este artículo.
Ver planesArtículos relacionados
- Series Temporales En revisión
Por qué tu pronóstico falla en Navidad: Manejo de múltiples estacionalidades y picos navideños
Aprende a modelar estacionalidades superpuestas y el efecto halo navideño en Prophet con series de Fourier y el ajuste de la escala previa para que tus pronósticos sobrevivan al auge de la Navidad.
- Series Temporales En revisión
Prophet vs. Modelos Estadísticos: Un Enfrentamiento Práctico de Pronósticos
Compara Prophet y ARIMA cara a cara en series de tiempo reales y desordenadas con quiebres estructurales, feriados y múltiples estacionalidades para elegir el modelo correcto.
- Series Temporales En revisión
Referencia: Anatomía de las series de tiempo
Una referencia sobre la anatomía de las series de tiempo: tendencia, estacionalidad, residuos, autocorrelación y estacionariedad, con ejemplos de descomposición en Python y reglas de decisión.
- Aprendizaje Automático En revisión
¿Qué es la validación cruzada y cómo evitar hacerla mal?
Aprende a hacer validación cruzada de la manera correcta: evita el sobreajuste, previene la fuga de datos con pipelines, lee la desviación estándar y maneja las series de tiempo correctamente.
¿Buscas otra cosa?
Busca en todos los artículos por título, resumen o tema.