UAX
← Datos Estructurados
5

UD5: Facebook Prophet

Áreas de aplicación y casos de uso en entornos con datos estructurados

Temas: 1. Modelo aditivo de Prophet · 2. Changepoints y detección automática · 3. Parámetros del modelo · 4. Implementación en Python · 5. Validación cruzada temporal

Introducción

Una vez comprendidos los modelos ARIMA, que se basan en la suposición de estacionariedad y requieren una cuidadosa selección de parámetros (p, d, q), surge la necesidad de contar con herramientas más flexibles y automatizadas. Especialmente cuando se trabaja con series temporales que presentan estacionalidades múltiples, festivos u otras irregularidades.

Facebook Prophet es un modelo desarrollado por el equipo de ingeniería de Meta (Facebook) diseñado específicamente para pronosticar series temporales de tipo empresarial: datos con fuertes efectos estacionales, tendencias a largo plazo y posibles interrupciones abruptas. A diferencia de ARIMA, Prophet adopta un enfoque aditivo.

Tema 1: El Modelo Aditivo de Prophet

1.1 Ecuación fundamental

Prophet descompone la serie temporal en tres componentes principales más un término de error:

y(t) = g(t) + s(t) + h(t) + εₜ
  • g(t): función de tendencia, modela cambios no periódicos a largo plazo
  • s(t): cambios periódicos (estacionalidad semanal, anual, etc.)
  • h(t): efectos de los días festivos, que pueden afectar uno o más días
  • εₜ: término de error, representa variaciones no explicadas (se asume distribución normal)

1.2 Ventajas principales

  • Maneja automáticamente los cambios de tendencia mediante detección de changepoints
  • Incorpora fácilmente variables externas como días festivos
  • No requiere un conocimiento estadístico profundo por parte del usuario
  • Muy robusto ante datos faltantes y valores atípicos
  • Produce intervalos de confianza de forma nativa

Tema 2: Changepoints — Detección Automática de Cambios de Tendencia

2.1 ¿Qué son los changepoints?

Los changepoints (puntos de cambio) son momentos en el tiempo donde el comportamiento de la tendencia cambia significativamente. Por ejemplo, un producto que empieza a crecer más rápido tras un lanzamiento viral, o una empresa cuyas ventas caen bruscamente por la pandemia.

Prophet detecta automáticamente los posibles changepoints al entrenar el modelo, colocando por defecto 25 candidatos en el primer 80% de la serie y seleccionando los más relevantes mediante regularización (Laplace prior sobre los cambios de pendiente).

2.2 Código para visualizar changepoints

# Listing all the change points in the model
deltas = m.params['delta'].mean(0)
cp = pd.DataFrame(m.changepoints)
cp['deltas'] = deltas
fig = go.Figure()
fig.add_trace(go.Bar(x=cp['ds'], y=cp['deltas'], name='CPs'))

Tema 3: Parámetros del Modelo Prophet

ParámetroDescripción
HolidaysDataFrame con los días festivos relevantes para el modelo
SeasonalityDefine si se consideran estacionalidades anuales, semanales o diarias (True/False)
Seasonality_modeTipo de estacionalidad: aditiva o multiplicativa
Seasonality_prior_scaleControla la fuerza de la estacionalidad. Valores más altos permiten mayor flexibilidad
Holiday_prior_scaleValores más altos permiten al modelo ajustarse más a los efectos de festivos
Changepoint_prior_scaleDetermina qué tan fácil es que el modelo detecte cambios en la tendencia. Valor alto → cambios más bruscos

Usar Hyperopt o GridSearch ayuda a automatizar la optimización de hiperparámetros, explorando un mayor número de configuraciones de forma eficiente.

Tema 4: Implementación en Python

4.1 Uso básico

Prophet espera que el DataFrame tenga exactamente dos columnas: ds (fecha) e y (valor a predecir).

# 1. Instanciar y entrenar el modelo
m = Prophet()
m.fit(dataset)  # dataset debe tener columnas 'ds' y 'y'

# 2. Crear DataFrame futuro (180 días hacia adelante)
future = m.make_future_dataframe(periods=180, freq='D')

# 3. Generar predicciones
forecast = m.predict(future)

# 4. Columnas clave del resultado:
# ds: fecha, yhat: predicción, yhat_lower: límite inferior, yhat_upper: límite superior

4.2 Ejemplo de salida de predicción

dsyhatyhat_loweryhat_upper
2020-11-1279.2462.9194.52
2020-11-1373.7658.4289.83
2020-11-1460.9546.0775.92

4.3 Prophet con variables exógenas

# Añadir festivos del país y regresores externos
m = Prophet(holidays=holidays)
m.add_country_holidays(country_name='ES')
m.add_regressor('rain')
m.add_regressor('temp')

m.fit(dataset)
future = m.make_future_dataframe(periods=0, freq='D')
future = future.merge(dataset, on='ds')
forecast = m.predict(future)

4.4 Prophet con hyperparameter tuning

m = Prophet(
    holidays=holidays,
    changepoint_prior_scale=0.01,
    changepoint_range=0.8,
    seasonality_prior_scale=0.5,
    holidays_prior_scale=1.0,
    yearly_seasonality=20,
    weekly_seasonality=5,
    seasonality_mode='additive'
)

Tema 5: Validación Cruzada Temporal

5.1 El problema con la validación cruzada estándar

A diferencia de otros tipos de datos, las series temporales tienen un orden cronológico: no podemos mezclar aleatoriamente los datos de entrenamiento y prueba. Si lo hiciéramos, estaríamos "mirando al futuro" durante el entrenamiento, lo que produce evaluaciones optimistas e irrealistas.

5.2 Validación temporal progresiva (Walk-Forward)

Prophet resuelve esto con una técnica de validación temporal progresiva: se entrena el modelo en una ventana inicial de tiempo y luego se prueba en una ventana futura (el horizon), repitiendo esto varias veces avanzando en el tiempo.

df_cv = cross_validation(
    m,
    initial='730 days',   # 2 años de datos iniciales de entrenamiento
    period='31 days',     # cada 31 días avanza la ventana
    horizon='365 days'    # predice 1 año hacia adelante en cada iteración
)
  • initial: Los primeros 730 días (2 años) se usan para entrenar inicialmente
  • horizon: Después de cada entrenamiento, el modelo predice 365 días
  • period: Cada 31 días, Prophet avanza en el tiempo y hace una nueva división

ARIMA vs Prophet: Comparativa

CaracterísticaARIMAProphet
Tipo de modeloEstadístico clásicoModelo aditivo basado en descomposición
Supone estacionariedadSíNo necesariamente
Tratamiento de tendenciaDiferenciación manualAutomático, con changepoints
EstacionalidadIncluida como SARIMAModelada explícitamente y flexible
Incorporación de festivosManual y complejaNativa y sencilla
Curva de aprendizajeAlta (requiere estadística)Baja (intuitivo y automatizado)
Parámetros principalesp, d, q (y P,D,Q para SARIMA)growth, seasonality, changepoints