12.2 Il modello Prophet

Una recente proposta è il modello Prophet, disponibile tramite il pacchetto fable.prophet. Questo modello è stato introdotto da Facebook (S. J. Taylor & Letham, 2018), originariamente per la previsione di dati giornalieri con stagionalità settimanale e annuale, più gli effetti delle vacanze. In seguito è stato esteso per coprire più tipi di dati stagionali. Funziona meglio con serie temporali che hanno una forte stagionalità e diverse stagioni di dati storici.

Prophet può essere considerato un modello di regressione non lineare (capitolo 7), della forma \[ y_t = g(t) + s(t) + h(t) + \varepsilon_t, \] dove \(g(t)\) descrive un trend lineare a tratti (o “termine di crescita”), \(s(t)\) descrive i vari andamenti stagionali, \(h(t)\) cattura gli effetti delle feste, e \(\varepsilon_t\) è un termine di errore white noise.

  • I nodi (o punti di cambiamento) per il trend lineare a tratti sono selezionati automaticamente se non specificati esplicitamente. Opzionalmente, si può usare una funzione logistica per impostare un limite superiore al trend.
  • La componente stagionale consiste in termini di Fourier dei periodi rilevanti. Di default, si usa l’ordine 10 per la stagionalità annuale e l’ordine 3 per quella settimanale.
  • Gli effetti delle vacanze sono aggiunti come semplici variabili dummy.
  • Il modello è stimato utilizzando un approccio bayesiano per consentire la selezione automatica dei punti di cambiamento e altre caratteristiche del modello.

Illustriamo l’approccio utilizzando due serie di dati: un semplice esempio trimestrale e i dati sulla domanda di energia elettrica descritti nella sezione precedente.

Esempio: La produzione trimestrale di cemento

Per il semplice esempio trimestrale, ripeteremo l’analisi dalla sezione 9.10, in cui abbiamo confrontato un modello ARIMA ed ETS, ma aggiungeremo un modello Prophet per il confronto.

library(fable.prophet)
cement <- aus_production %>%
  filter(year(Quarter) >= 1988)
train <- cement %>%
  filter(year(Quarter) <= 2007)
fit <- train %>%
  model(
    arima = ARIMA(Cement),
    ets = ETS(Cement),
    prophet = prophet(Cement ~ season(period = 4, order = 2,
                                    type = "multiplicative"))
  )

Si noti che il termine stagionale deve avere period completamente specificato per i dati trimestrali e mensili, poiché i valori di default assumono che i dati siano osservati almeno giornalmente.

fc <- fit %>% forecast(h = "2 years 6 months")
fc %>% autoplot(cement)
Prophet messo a confronto con ETS e ARIMA sui dati della produzione di cemento, con un test set di 10 trimestri.

Figura 12.9: Prophet messo a confronto con ETS e ARIMA sui dati della produzione di cemento, con un test set di 10 trimestri.

In questo esempio, le previsioni Prophet sono peggiori delle previsioni ETS o ARIMA.

fc %>% accuracy(cement)
#> # A tibble: 3 × 10
#>   .model  .type    ME  RMSE   MAE   MPE  MAPE  MASE RMSSE  ACF1
#>   <chr>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 arima   Test  -161.  216.  186. -7.71  8.68  1.27  1.26 0.387
#> 2 ets     Test  -171.  222.  191. -8.07  8.85  1.30  1.29 0.579
#> 3 prophet Test  -176.  248.  216. -8.36  9.89  1.47  1.44 0.699

Esempio: La domanda semi-oraria di energia elettrica

Adatteremo un modello simile al modello di regressione armonica dinamica (DHR) della sezione precedente, ma questa volta utilizzando un modello Prophet. Per i dati giornalieri e sub-giornalieri, i periodi di default sono specificati correttamente, per cui possiamo semplicemente specificare il periodo utilizzando una stringa di caratteri come segue.

fit <- elec %>%
  model(
    prophet(Demand ~ Temperature + Cooling + Working_Day +
            season(period = "day", order = 10) +
            season(period = "week", order = 5) +
            season(period = "year", order = 3))
  )
fit %>%
  components() %>%
  autoplot()
Componenti di un modello Prophet adattato ai dati sulla domanda di energia elettrica nel Victoria.

Figura 12.10: Componenti di un modello Prophet adattato ai dati sulla domanda di energia elettrica nel Victoria.

La Figura 12.10 mostra le componenti di trend e stagionalità del modello stimato.

La specificazione del modello è molto simile al modello DHR della sezione precedente, anche se il risultato è diverso per parecchi, importanti aspetti. Il modello Prophet aggiunge un trend temporale lineare a tratti che non pare davvero appropriato in questo caso, poiché non ci aspettiamo che le previsioni a lungo termine continuino a seguire la tendenza lineare verso il basso alla fine della serie.

Inoltre, nei residui è presente una non trascurabile autocorrelazione,

fit %>% gg_tsresiduals()
Residui del modello Prophet per la domanda di energia elettrica nel Victoria.

Figura 12.11: Residui del modello Prophet per la domanda di energia elettrica nel Victoria.

Di conseguenza, gli intervalli di previsione sono probabilmente troppo stretti.

fc <- fit %>%
  forecast(new_data = elec_newdata)
fc %>%
  autoplot(elec %>% tail(10 * 48)) +
  labs(x = "Data", y = "Domanda (MWh)")
Due giorni di previsioni dal modello Prophet per la domanda di energia elettrica del Victoria.

Figura 12.12: Due giorni di previsioni dal modello Prophet per la domanda di energia elettrica del Victoria.

Prophet ha il vantaggio di essere molto più veloce da stimare rispetto ai modelli DHR che abbiamo considerato in precedenza, ed è completamente automatizzato. Tuttavia, raramente fornisce un’accuratezza previsiva migliore degli approcci alternativi, come questi due esempi hanno illustrato.

Bibliografia

Taylor, S. J., & Letham, B. (2018). Forecasting at scale. The American Statistician, 72(1), 37–45. [DOI]