5.9 Valutazione dell’accuratezza della previsione della distribuzione

Le misure precedenti valutano tutte l’accuratezza delle previsioni puntuali. Quando si valutano le previsioni distributive, dobbiamo usare altre misure.

Punteggi quantili (quantile score)

Si consideri l’esempio del prezzo delle azioni Google del paragrafo precedente. La figura 5.23 mostra un intervallo di previsione dell’80% per le previsioni del metodo naive.

google_fc %>%
  filter(.model == "Naive") %>%
  autoplot(bind_rows(google_2015, google_jan_2016), level=80)+
  labs(y = "$US",
       title = "Prezzo di chiusura azioni Google")
Previsioni naive del prezzo delle azioni di Google per gennaio 2016, insieme agli intervalli di previsione dell’80%.

Figura 5.23: Previsioni naive del prezzo delle azioni di Google per gennaio 2016, insieme agli intervalli di previsione dell’80%.

Il limite inferiore di questo intervallo di previsione dà il decimo percentile (o quantile di ordine 0.1) della distribuzione della previsione; ci si aspetterebbe quindi che il valore effettivo si trovi sotto il limite inferiore circa il 10% delle volte, e che si trovi sopra il limite inferiore circa il 90% delle volte. Nel confrontare il valore effettivo con questo percentile, è necessario tenere conto del fatto che è più probabile che sia sopra che sotto.

Più in generale, si supponga di essere interessati alla previsione del quantile con probabilità \(p\) al tempo futuro \(t\), e che questo sia denotato da \(f_{p,t}\). Ci si aspetta cioè che l’osservazione \(y_t\) sia inferiore a \(f_{p,t}\) con probabilità \(p\). Per esempio, il decimo percentile sarebbe \(f_{0.10,t}\). Se \(y_{t}\) indica l’osservazione al tempo \(t\), allora il Quantile Score è:

\[ Q_{p,t} = \begin{cases} 2(1 - p) \big(f_{p,t} - y_{t}\big), & \text{se $y_{t} < f_{p,t}$}\\ 2p \big(y_{t} - f_{p,t}\big), & \text{se $y_{t} \ge f_{p,t}$} \end{cases} \]

Questa è talvolta chiamata la “funzione di perdita del flipper” perché il suo grafico assomiglia alla traiettoria di una palla su un tavolo da flipper. Il coefficiente moltiplicativo “2” è spesso omesso, anche se includendolo l’interpretazione è un po’ più semplice. Un valore basso di \(Q_{p,t}\) indica una migliore stima del quantile.

Il Quantile Score può essere interpretato come un errore assoluto. Infatti, quando \(p=0.5\), il punteggio quantile \(Q_{0.5,t}\) è uguale all’errore assoluto. Per altri valori di \(p\), l’“errore” \((y_t - f_{p,t})\) è ponderato per tenere conto di quanto è probabile che sia positivo o negativo. Se \(p>0.5\), \(Q_{p,t}\) dà una penalità più pesante quando l’osservazione è maggiore del quantile stimato rispetto a quando l’osservazione è minore del quantile stimato. È vero il contrario per \(p<0.5\).

In figura 5.23, la previsione per il quantile 0.10 ad un passo avanti (per il 4 gennaio 2016) è \(f_{0.1,t} = 744.54\) e il valore osservato è \(y_t = 741.84\). Allora

\[ Q_{0.1,t} = 2(1-0.1) (744.54 - 741.84) = 4.86. \]

Questo si calcola facilmente usando accuracy() con la funzione quantile_score():

google_fc %>%
  filter(.model == "Naive", Date == "2016-01-04") %>%
  accuracy(google_stock, list(qs=quantile_score), probs=0.10)
#> # A tibble: 1 × 4
#>   .model Symbol .type    qs
#>   <chr>  <chr>  <chr> <dbl>
#> 1 Naive  GOOG   Test   4.86

Punteggio Winkler (Winkler score)

Spesso è interessante valutare un intervallo di previsione, piuttosto che alcuni quantili, e il Winkler Score proposto da Winkler (1972) è progettato per questo scopo. Se l’intervallo di previsione di \(100\,(1- \alpha)\)% al tempo \(t\) è dato da \([\ell_{\alpha,t}, u_{\alpha,t}]\), allora il Winkler Score è definito come la lunghezza dell’intervallo più una penalità se l’osservazione è fuori dall’intervallo:

\[ W_{\alpha,t} = \begin{cases} (u_{\alpha,t} - \ell_{\alpha,t}) + \frac{2}{\alpha} (\ell_{\alpha,t} - y_t) & \text{se } y_t < \ell_{\alpha,t} \\ (u_{\alpha,t} - \ell_{\alpha,t}) & \text{se } \ell_{\alpha,t} \le y_t \le u_{\alpha,t} \\ (u_{\alpha,t} - \ell_{\alpha,t}) + \frac{2}{\alpha} (y_t - u_{\alpha,t}) & \text{se } y_t > u_{\alpha,t}. \end{cases} \]

Per le osservazioni che rientrano nell’intervallo, il Winkler score è semplicemente la lunghezza dell’intervallo. Quindi punteggi bassi sono associati ad intervalli stretti. Tuttavia, se l’osservazione cade fuori dall’intervallo, si applica una penalità proporzionale a quanto l’osservazione è fuori dall’intervallo.

Gli intervalli di previsione sono di solito costruiti dai quantili impostando \(\ell_{\alpha,t} = f_{\alpha/2,t}\) e \(u_{\alpha,t} = f_{1-\alpha/2,t}\). Se si sommano i corrispondenti punteggi quantili e si divide per \(\alpha\), si ottenie il punteggio di Winkler:

\[ W_{\alpha,t} = (Q_{\alpha/2,t} + Q_{1-\alpha/2,t})/\alpha. \]

L’intervallo di previsione all’80% un passo avanti mostrato in figura 5.23 per il 4 gennaio 2016 è [744.54, 773.22], mentre il valore effettivo era 741.84, quindi il Winkler score è

\[ W_{\alpha,t} = (773.22 - 744.54) + \frac{2}{0.2} (744.54 - 741.84) = 55.68. \]

Questo è facilmente calcolabile usando accuracy() con la funzione winkler_score():

google_fc %>%
  filter(.model == "Naive", Date == "2016-01-04") %>%
  accuracy(google_stock,
    list(winkler = winkler_score), level = 80)
#> # A tibble: 1 × 4
#>   .model Symbol .type winkler
#>   <chr>  <chr>  <chr>   <dbl>
#> 1 Naive  GOOG   Test     55.7

Continuous Ranked Probability Score

Spesso si è interessati all’intera distribuzione della previsione, piuttosto che a particolari quantili o intervalli di previsione. In questo caso, si può fare la media dei Quantile scores su tutti i valori di \(p\) per ottenere il Continuous Ranked Probability Score o CRPS (Gneiting & Katzfuss, 2014).

Nell’esempio del prezzo delle azioni Google, si può calcolare il valore medio del CRPS per tutti i giorni del test set. Un valore CRPS è un po’ come un errore assoluto ponderato calcolato dall’intera distribuzione delle previsioni, dove la ponderazione tiene conto delle probabilità.

google_fc %>%
  accuracy(google_stock, list(crps = CRPS))
#> # A tibble: 3 × 4
#>   .model Symbol .type  crps
#>   <chr>  <chr>  <chr> <dbl>
#> 1 Drift  GOOG   Test   33.5
#> 2 Mean   GOOG   Test   76.7
#> 3 Naive  GOOG   Test   26.5

Qui, il metodo naive fornisce previsioni distributive migliori rispetto ai metodi del drift o della media.

Confronti indipendenti dalla scala utilizzando skill scores

Come per le previsioni puntuali, è utile essere in grado di confrontare l’accuratezza distributiva delle previsioni di diversi metodi attraverso serie misurate su scale diverse. Per le previsioni puntuali, per le distribuzioni sono stati utilizzati gli scaled errors. Un altro approccio è quello di utilizzare gli skill score. Questi possono essere utilizzati sia per l’accuratezza delle previsioni puntuali che per l’accuratezza delle previsioni delle distribuzioni.

Con gli skill score, si calcola una misura di accuratezza della previsione rispetto a qualche metodo benchmark. Per esempio, se si utilizza il metodo naive come metodo benchmark e si calcolano anche le previsioni usando il metodo del drift, lo skill score CRPS del metodo del drift rispetto al metodo naive può essere calcolato come

\[ \frac{\text{CRPS}_{\text{Naive}} - \text{CRPS}_{\text{Drift}}}{\text{CRPS}_{\text{Naive}}}. \]

Questo indica di quanto il metodo del drift migliora rispetto al metodo naive basato su CRPS. Lo skill score è facile da calcolare usando la funzione accuracy().

google_fc %>%
  accuracy(google_stock, list(skill = skill_score(CRPS)))
#> # A tibble: 3 × 4
#>   .model Symbol .type  skill
#>   <chr>  <chr>  <chr>  <dbl>
#> 1 Drift  GOOG   Test  -0.266
#> 2 Mean   GOOG   Test  -1.90 
#> 3 Naive  GOOG   Test   0

Naturalmente, lo skill score per il metodo naive è 0 perché non può migliorare se stesso. Gli altri due metodi hanno valori di CRPS più grandi del naive, quindi gli skill score sono negativi; il metodo del drift, ad esempio, è peggiore del 26,6% rispetto al metodo naive.

La funzione skill_score(), calcolerà sempre il CRPS per le previsioni benchmark appropriate, anche se queste non sono incluse nell’oggetto fable. Quando i dati sono stagionali, il benchmark utilizzato è il metodo naive stagionale piuttosto che il metodo naive. Per assicurarsi che le previsioni benchmark siano ottenute sulla base dello stesso campione di addestramento, è importante che i dati forniti alla funzione accuracy() inizino nello stesso istante temporale del campione training.

La funzione skill_score() può essere usata con qualsiasi misura di accuratezza. Per esempio, skill_score(MSE) fornisce un modo per confrontare i valori MSE tra diverse serie. È tuttavia importante che l’insieme test sia abbastanza grande da permettere un calcolo affidabile della misura di errore, specialmente nel denominatore. Per questo motivo, il MASE o il RMSSE sono spesso misure scale-free preferibili per l’accuratezza della previsione puntuale.

Bibliografia

Gneiting, T., & Katzfuss, M. (2014). Probabilistic forecasting. Annual Review of Statistics and Its Application, 1(1), 125–151. [DOI]
Winkler, R. L. (1972). A decision-theoretic approach to interval estimation. Journal of the American Statistical Association, 67(337), 187–191. [DOI]