13.4 Combinazione di previsioni

Un modo semplice di incrementare l’accuratezza delle previsioni è quello di utilizzare diversi metodi sulla stessa serie e di mediare le previsioni che ne derivano. Oltre 50 anni fa, John Bates and Clive Granger scrissero un famoso articolo (Bates & Granger, 1969), che dimostrava che combinare diverse previsioni spesso conduce ad una migliore accuratezza previsiva. Vent’anni dopo, Clemen (1989) scrisse

I risultati sono stati virtualmente unanimi: combinare insieme diverse previsioni produce un miglioramento nell’accuratezza previsiva. In molti casi, si può ottenere un notevole miglioramento della peformance semplicemente facendo la media delle previsioni.

Sebbene si sia sviluppata una intensa attività di ricerca sull’utilizzo di medie pesate, o di altri approcci più complessi alla combinazione, l’utilizzo di una semplice media è ancora il riferimento da battere.

Ecco un esempio che si riferisce ai ricavi relativi al cibo da asporto in Australia, da Aprile 1982 a Dicembre 2018. In questo caso, vengono utilizzate le previsioni dai seguenti modelli: ETS, STL-ETS, e ARIMA; e vengono confrontati i risultati con le osservazioni degli ultimi 5 anni (60 mesi).

auscafe <- aus_retail %>%
  filter(stringr::str_detect(Industry, "Takeaway")) %>%
  summarise(Turnover = sum(Turnover))
train <- auscafe %>%
  filter(year(Month) <= 2013)
STLF <- decomposition_model(
  STL(log(Turnover) ~ season(window = Inf)),
  ETS(season_adjust ~ season("N"))
)
cafe_models <- train %>%
  model(
    ets = ETS(Turnover),
    stlf = STLF,
    arima = ARIMA(log(Turnover))
  ) %>%
  mutate(combination = (ets + stlf + arima) / 3)
cafe_fc <- cafe_models %>%
  forecast(h = "5 years")

Si noti che nella funzione mutate() la combinazione è ottenuta semplicemente considerando una funzione linearae dei modelli stimati. Questa semplicissima sintassi, permette di trattare automaticamente e in modo appropriato la distribuzione predittiva, tenendo conto delal correlazione tra gli errori di previsione dei modelli che vengono inclusi. Tuttavia, al fine di avere un grafico più semplice, gli intervalli vengono omessi.

cafe_fc %>%
  autoplot(auscafe %>% filter(year(Month) > 2008),
           level = NULL) +
  labs(y = "Milioni di $",
       title = "Spesa mensile australiana per mangiare fuori casa.")
Previsione puntuale da vari metodi applicati alla spesa mensile australiana per mangiare fuori.

Figura 13.6: Previsione puntuale da vari metodi applicati alla spesa mensile australiana per mangiare fuori.

cafe_fc %>%
  accuracy(auscafe) %>%
  arrange(RMSE)
#> # A tibble: 4 × 10
#>   .model      .type     ME  RMSE   MAE    MPE  MAPE  MASE RMSSE  ACF1
#>   <chr>       <chr>  <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 combination Test    8.09  41.0  31.8  0.401  2.19 0.776 0.790 0.747
#> 2 arima       Test  -25.4   46.2  38.9 -1.77   2.65 0.949 0.890 0.786
#> 3 stlf        Test  -36.9   64.1  51.7 -2.55   3.54 1.26  1.23  0.775
#> 4 ets         Test   86.5  122.  101.   5.51   6.66 2.46  2.35  0.880

Il modello ARIMA funziona particolarmente bene su questa serie, ma l’approccio basato sulla combinazione fa ancora meglio (in riferimento alla maggior parte delle misure, icluse RMSE and MAE). Su altri dati, il modella ARIMA potrebbe fornire risultati modesti, mentre la combinazione di previsioni solitamente è non molto peggiore, o addirittura migliore, del migliore tra i metodi considerati.

Distribuzioni di combinazioni di previsioni

L’oggetto cafe_fc contiene le distribuzioni di predittive, da cui si può calcolare qualsiasi intervallo predittivo. Consideriamo gli intervalli per il primo periodo.

cafe_fc %>% filter(Month == min(Month))
#> # A fable: 4 x 4 [1M]
#> # Key:     .model [4]
#>   .model         Month           Turnover .mean
#>   <chr>          <mth>             <dist> <dbl>
#> 1 ets         2014 Jan      N(1289, 1118) 1289.
#> 2 stlf        2014 Jan t(N(7.2, 0.00063)) 1326.
#> 3 arima       2014 Jan t(N(7.2, 0.00061)) 1283.
#> 4 combination 2014 Jan               1299 1299.

I primi tre sono una mistura di distribuzioni normali e di normali trasformate. Il pacchetto software non combina ancora queste diverse distribuzioni, cosicché l’output combination è semplicemente la media dei primi tre.

Tuttavia, se si lavora con serie storiche simulate, è possibile creare delle distribuzioni predittive anche per la previsione combinata.

cafe_futures <- cafe_models %>%
  # Generate 1000 future sample paths
  generate(h = "5 years", times = 1000) %>%
  # Compute forecast distributions from future sample paths
  as_tibble() %>%
  group_by(Month, .model) %>%
  summarise(
    dist = distributional::dist_sample(list(.sim))
  ) %>%
  ungroup() %>%
  # Create fable object
  as_fable(index = Month, key = .model,
           distribution = dist, response = "Turnover")
# Forecast distributions for h=1
cafe_futures %>% filter(Month == min(Month))
#> # A fable: 4 x 3 [1M]
#> # Key:     .model [4]
#>      Month .model              dist
#>      <mth> <chr>             <dist>
#> 1 2014 Jan arima       sample[1000]
#> 2 2014 Jan combination sample[1000]
#> 3 2014 Jan ets         sample[1000]
#> 4 2014 Jan stlf        sample[1000]

Ora tutti e quattro i modelli, inclusa la combinazione, sono statia salvati come distribuzioni empiriche, e possiamo tracciare gli intervali di previsione anche per la previsione combinata, come mostrato in Figura 13.7.

cafe_futures %>%
  filter(.model == "combination") %>%
  autoplot(auscafe %>% filter(year(Month) > 2008)) +
  labs(y = "Milioni di $",
       title = "Spesa australiana mensile per mangiare fuori casa.")
Intervals predittivi per la previsione combinata della spesa australiana mensile per mangiare fuori casa.

Figura 13.7: Intervals predittivi per la previsione combinata della spesa australiana mensile per mangiare fuori casa.

Per verificae l’accuratezza degli intervalli predittivi al 95%, possiamo utilizzare il punteggio (score, CHECK) di Winkler (definito nella Sezione 5.9).

cafe_futures %>%
  accuracy(auscafe, measures = interval_accuracy_measures,
    level = 95) %>%
  arrange(winkler)
#> # A tibble: 4 × 3
#>   .model      .type winkler
#>   <chr>       <chr>   <dbl>
#> 1 combination Test     420.
#> 2 stlf        Test     596.
#> 3 ets         Test     731.
#> 4 arima       Test     766.

Più basso è il punteggio meglio è, quindi la previone combinazione anche in questo caso è migliore di tutti i modelli componenti.

Bibliografia

Bates, J. M., & Granger, C. W. J. (1969). The combination of forecasts. Operational Research Quarterly, 20(4), 451–468. [DOI]
Clemen, R. (1989). Combining forecasts: A review and annotated bibliography. International Journal of Forecasting, 5(4), 559–583. [DOI]