Utilizzo della convalida incrociata di k-fold per la selezione del modello di serie storiche


70

Domanda: voglio essere sicuro di qualcosa, l'uso della convalida incrociata di k-fold con le serie temporali è semplice o è necessario prestare particolare attenzione prima di utilizzarlo?

Contesto: sto modellando una serie temporale di 6 anni (con catena semi-markov), con un campione di dati ogni 5 minuti. Per confrontare diversi modelli, sto usando una validazione incrociata di 6 volte separando i dati in 6 anni, quindi i miei set di allenamento (per calcolare i parametri) hanno una durata di 5 anni e i set di test hanno una lunghezza di 1 anno. Non sto prendendo in considerazione l'ordine dei tempi, quindi i miei diversi set sono:

  • piega 1: allenamento [1 2 3 4 5], prova [6]
  • fold 2: training [1 2 3 4 6], test [5]
  • piega 3: allenamento [1 2 3 5 6], prova [4]
  • piega 4: allenamento [1 2 4 5 6], prova [3]
  • fold 5: training [1 3 4 5 6], test [2]
  • piega 6: allenamento [2 3 4 5 6], prova [1].

Faccio l'ipotesi che ogni anno siano indipendenti l'uno dall'altro. Come posso verificarlo? C'è qualche riferimento che mostra l'applicabilità della validazione incrociata di k-fold con le serie temporali.


Dai un'occhiata a questo articolo, che ho trovato utile francescopochetti.com/…
Henok S Mengistu,

Risposte:


69

Le serie temporali (o altri dati intrinsecamente ordinati) possono essere problematici per la convalida incrociata. Se qualche modello emerge nell'anno 3 e rimane per 4-6 anni, allora il tuo modello può riprenderlo, anche se non faceva parte degli anni 1 e 2.

Un approccio che a volte è più basato sui principi delle serie temporali è il concatenamento diretto, in cui la procedura potrebbe essere simile a questa:

  • fold 1: training [1], test [2]
  • fold 2: training [1 2], test [3]
  • fold 3: training [1 2 3], test [4]
  • piega 4: allenamento [1 2 3 4], prova [5]
  • fold 5: training [1 2 3 4 5], test [6]

Ciò modella in modo più accurato la situazione che vedrai al momento della previsione, in cui modellerai su dati passati e prevederai su dati previsionali. Ti darà anche un'idea della dipendenza della tua modellazione dalla dimensione dei dati.


1
Grazie. Capisco, come ha detto Zach, è il modo canonico per farlo. E capisco perché. Il problema che ho con questo, è esattamente il fatto che terrà conto della variazione della dimensione dei dati, quindi non otterrò il "vero" errore di generalizzazione del mio modello. Ma un errore misto: generalizzazione e dimensione dei dati. Conosci altri ref (diversi da M.Hyndman) che si occupano della validazione incrociata nelle serie temporali? Non fraintendetemi, non mi fido di quello che stai dicendo e di quello che dice M. Hyndman, ha perfettamente senso. Mi piace semplicemente avere diversi punti di vista su un problema
Mickaël S

Temo di non conoscere un riferimento del genere, ma sarei interessato a vederne uno se qualcun altro ne conosce uno.
Ken Williams

1
@Wayne, intendo dire che questa soluzione utilizza sempre più anni di dati di allenamento per ogni piega. Nei miei dati ci sono sicuramente differenze tra gli anni, ma nessuna tendenza apparente o stagionalità.
Mickaël S

3
@Mickael: potresti usare fold 1: train [1 2] test [3]; piega 2: test treno [2 3] [4]; fold 3: train [3 4] test [5], ecc., se sei preoccupato di utilizzare sempre più dati con ogni fold. La mia ipotesi è che con una tecnica semi-MC non si riesca davvero a mescolare gli anni, anche se non c'è tendenza.
Wayne,

3
@ MickaëlS: ho trovato questo documento sciencedirect.com/science/article/pii/S0020025511006773 e ho pensato che potesse interessare. Confrontano questo approccio "canonico" con altri due metodi: un "boostrap a blocchi" e un approccio "a prescindere dalla dipendenza".
thebigdog,

26

Il metodo che utilizzo per la convalida incrociata del mio modello di serie temporali è la convalida incrociata su base continuativa. Iniziare con un piccolo sottoinsieme di dati a scopo di addestramento, prevedere i punti dati successivi e quindi verificare l'accuratezza dei punti dati previsti. Gli stessi punti dati previsti vengono quindi inclusi come parte del successivo set di dati di addestramento e vengono previsti i punti dati successivi.

Per rendere le cose intuitive, ecco un'immagine per lo stesso:

inserisci qui la descrizione dell'immagine

Un codice R equivalente sarebbe:

i <- 36    #### Starting with 3 years of monthly training data 
pred_ets <- c()
pred_arima <- c()
while(i <= nrow(dt)){
  ts <- ts(dt[1:i, "Amount"], start=c(2001, 12), frequency=12)

  pred_ets <- rbind(pred_ets, data.frame(forecast(ets(ts), 3)$mean[1:3]))
	  pred_arima <- rbind(pred_arima, data.frame(forecast(auto.arima(ts), 3)$mean[1:3]))

  i = i + 3
}
names(pred_arima) <- "arima"
names(pred_ets) <- "ets"

pred_ets <- ts(pred_ets$ets, start=c(2005, 01), frequency = 12)
	pred_arima <- ts(pred_arima$arima, start=c(2005, 01), frequency =12)

accuracy(pred_ets, ts_dt)
accuracy(pred_arima, ts_dt)

Esiste un modo per farlo per metodi come la regressione logistica utilizzando R?
Hlyates,

1
@hlyates, a mio avviso è possibile, devi solo modificare un po 'il codice sopra. Includi pred_lr (previsioni per regressione logistica) e modifica il nome delle colonne di conseguenza.
Jatin Garg,

22

Il modo "canonico" per eseguire la convalida incrociata di serie temporali (almeno come descritto da @Rob Hyndman) è "scorrere" nel set di dati.

vale a dire:

  • fold 1: training [1], test [2]
  • fold 2: training [1 2], test [3]
  • fold 3: training [1 2 3], test [4]
  • piega 4: allenamento [1 2 3 4], prova [5]
  • fold 5: training [1 2 3 4 5], test [6]

Fondamentalmente, il set di allenamento non deve contenere informazioni che si verificano dopo il set di test.


13

Non c'è nulla di sbagliato nell'utilizzare blocchi di dati "futuri" per la validazione incrociata di serie storiche nella maggior parte delle situazioni. Nella maggior parte dei casi mi riferisco a modelli per dati stazionari, che sono i modelli che usiamo normalmente. Ad esempio quando si adatta un , con a una serie, si prendono differenze della serie e si adatta un modello per i dati stazionari ai residui.d > 0 dARIMA(p,d,q)d>0d

Affinché la convalida incrociata funzioni come strumento di selezione dei modelli, è necessaria un'indipendenza approssimativa tra i dati di training e test. Il problema con i dati delle serie temporali è che i punti dati adiacenti sono spesso altamente dipendenti, quindi la convalida incrociata standard fallirà. Il rimedio è lasciare un divario tra il campione di prova e i campioni di addestramento, su entrambi i lati del campione di prova . Il motivo per cui è anche necessario lasciare un vuoto prima del campione di prova è che la dipendenza è simmetrica quando ci si sposta in avanti o indietro nel tempo (si pensi alla correlazione).

Questo approccio è chiamato convalida incrociata (tralascia , elimina osservazioni su entrambi i lati del campione di prova) ed è descritto in questo documento. Nel tuo esempio, questo sarebbe simile al seguente:v hhvvh

  • piega 1: allenamento [1 2 3 4 5h], prova [6]
  • piega 2: allenamento [1 2 3 4h h6], prova [5]
  • piega 3: allenamento [1 2 3h h5 6], prova [4]
  • piega 4: allenamento [1 2h h4 5 6], prova [3]
  • piega 5: allenamento [1h h3 4 5 6], prova [2]
  • fold 6: training [h2 3 4 5 6], test [1]

Dove la h indica che le osservazioni h del campione di addestramento sono eliminate su quel lato.


3

Come commentato da @thebigdog, "Sull'uso della convalida incrociata per la valutazione dei predittori di serie temporali" di Bergmeir et al. discute la convalida incrociata nel contesto di serie temporali stazionarie e ritiene che il concatenamento diretto (proposto da altri risponditori) non sia di aiuto. Nota, Forward Chaining è chiamato Valutazione dell'ultimo blocco in questo documento:

Utilizzando la validazione incrociata standard di 5 volte, non è stato possibile trovare alcun effetto pratico delle dipendenze all'interno dei dati, per quanto riguarda se l'errore finale è sottovalutato o sopravvalutato. Al contrario, la valutazione dell'ultimo blocco tende a produrre misure di errore meno solide rispetto alla convalida incrociata e alla convalida incrociata bloccata.

" Valutazione dei modelli di previsione di serie storiche: uno studio empirico sui metodi di stima delle prestazioni " di Cerqueira et al. concorda con questa valutazione. Tuttavia, per le serie temporali non stazionarie, raccomandano invece di utilizzare una variante di Hold-Out, chiamata Rep-Holdout. In Rep-Holdout, anelle serie temporali viene scelto un punto Yper contrassegnare l'inizio dei dati di test. Il punto aè determinato per essere all'interno di una finestra. Questo è illustrato nella figura seguente:

illustrazione rep-holdout

Questo documento di cui sopra è lungo ed esamina in modo esaustivo quasi tutti gli altri metodi citati nelle risposte a questa domanda con codice disponibile al pubblico . Ciò include l'affermazione di @Matthias Schmidtblaicher di includere lacune prima e dopo i dati dei test. Inoltre, ho riassunto solo il documento. La conclusione effettiva del documento riguarda un albero decisionale per la valutazione dei modelli di serie storiche!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.