Analisi di serie temporali di convalida incrociata


37

Ho usato il pacchetto caret in R per costruire modelli predittivi per la classificazione e la regressione. Caret fornisce un'interfaccia unificata per mettere a punto gli iperparametri del modello mediante validazione incrociata o avvio del boot. Ad esempio, se stai costruendo un semplice modello di "vicini più vicini" per la classificazione, quanti vicini dovresti usare? 2? 10? 100? Caret ti aiuta a rispondere a questa domanda ricampionando i tuoi dati, provando diversi parametri e quindi aggregando i risultati per decidere quale produce la migliore precisione predittiva.

Mi piace questo approccio perché fornisce una solida metodologia per la scelta degli iperparametri del modello e, una volta scelti gli iperparametri finali, fornisce una stima incrociata di quanto sia buono il modello, usando l'accuratezza per i modelli di classificazione e RMSE per i modelli di regressione.

Ora ho alcuni dati di serie temporali per i quali voglio costruire un modello di regressione, probabilmente usando una foresta casuale. Qual è una buona tecnica per valutare la precisione predittiva del mio modello, data la natura dei dati? Se le foreste casuali non si applicano davvero ai dati delle serie temporali, qual è il modo migliore per costruire un modello di ensemble accurato per l'analisi delle serie temporali?


Ho trovato davvero interessante la domanda. C'è un modo in cui posso contrassegnare una domanda per seguirla?
Mariana Soffer,

1
@mariana soffer Fai clic sull'icona 'Stella' sotto le frecce su / giù.
Zach,

4
Caret ora supporta la convalida incrociata di serie storiche
r-bloggers.com/time-series-cross-validation-5

1
@Zach Questo e 'un vecchio post ma mi chiedo se hai qualche nuovo pensiero? Sei a conoscenza di qualche recente lavoro sulla convalida del modello sequenziale?
Orazio

Risposte:


10

La tecnica di convalida incrociata k-times "classica" si basa sul fatto che ogni campione nel set di dati disponibile viene utilizzato (k-1) volte per addestrare un modello e 1 volta per testarlo. Poiché è molto importante convalidare i modelli di serie temporali su dati "futuri", questo approccio non contribuirà alla stabilità del modello.

Una proprietà importante di molte (più?) Serie temporali è la correlazione tra i valori adiacenti. Come sottolineato da IrishStat, se usi le letture precedenti come variabili indipendenti del tuo candidato modello, questa correlazione (o mancanza di indipendenza) gioca un ruolo significativo ed è un altro motivo per cui la convalida incrociata k-times non è una buona idea.

Un modo per superare questo problema è "sovracampionare" i dati e decorrelarli. Se il processo di decorrelazione ha esito positivo, l'utilizzo della convalida incrociata su serie temporali diventa meno problematico. Tuttavia, non risolverà il problema della convalida del modello utilizzando dati futuri

chiarimenti

Convalidando il modello su dati futuri intendo costruire il modello, aspettare nuovi dati che non erano disponibili durante la costruzione del modello, test, messa a punto, ecc. e convalidarlo su quei nuovi dati.

per sovracampionamento dei dati intendo raccogliere dati relativi a serie temporali con frequenza molto più elevata di quanto praticamente necessario. Ad esempio: campionare i prezzi delle azioni ogni 5 secondi, quando si è veramente interessati alle variazioni orarie. Qui, quando dico "campionamento" non intendo "interpolazione", "stima" ecc. Se i dati non possono essere misurati a una frequenza più elevata, questa tecnica non ha senso


Qual è il modo "classico" per convalidare un modello su dati futuri? Cosa intendi con "sovracampionamento?" Grazie!
Zach,

TppT

@bgbg Sto affrontando un problema molto simile e ho appena trovato il tuo post. Puoi citare alcuni riferimenti sul sovracampionamento e la decorrelazione dei dati delle serie temporali? Penserei che se la memoria della serie temporale fosse abbastanza breve (potrebbe mostrare che si adatta un arima), si potrebbero semplicemente prendere campioni "non sovrapposti" e fare la solita validazione incrociata. Ogni pensiero è apprezzato.
Orazio

9

http://robjhyndman.com/researchtips/crossvalidation/ contiene un suggerimento rapido per la convalida incrociata delle serie temporali. Per quanto riguarda l'uso della foresta casuale per i dati delle serie storiche ... non sono sicuro, sebbene sembri una scelta strana dato che il modello è montato usando campioni bootstrap. Esistono ovviamente metodi classici per le serie storiche (ad es. ARIMA), così come tecniche ML come Neural Nets (esempio esempio pdf ). Forse alcuni esperti delle serie storiche possono commentare quanto bene funzionano le tecniche ML rispetto agli algoritmi specifici delle serie storiche.


2
Questo colpisce praticamente l'unghia sulla testa. Sto cercando di capire come applicare le tecniche di Machine Learning all'analisi delle serie storiche.
Zach,

Ho avuto successo usando foreste casuali per la previsione prima. Check out: biomedcentral.com/1471-2105/15/276
captain_ahab

6

Ecco un esempio di codice per i modelli di serie temporali con convalida incrociata. Ho ampliato questo codice nel mio blog , incorporando il pacchetto foreach per accelerare le cose e consentire un possibile termine xreg nella convalida incrociata.

Ecco una copia del codice dal blog di Rob Hyndman:

library(fpp) # To load the data set a10
plot(a10, ylab="$ million", xlab="Year", main="Antidiabetic drug sales")
plot(log(a10), ylab="", xlab="Year", main="Log Antidiabetic drug sales")

k <- 60 # minimum data length for fitting a model
n <- length(a10)
mae1 <- mae2 <- mae3 <- matrix(NA,n-k,12)
st <- tsp(a10)[1]+(k-2)/12

for(i in 1:(n-k))
{
  xshort <- window(a10, end=st + i/12)
  xnext <- window(a10, start=st + (i+1)/12, end=st + (i+12)/12)
  fit1 <- tslm(xshort ~ trend + season, lambda=0)
  fcast1 <- forecast(fit1, h=12)
  fit2 <- Arima(xshort, order=c(3,0,1), seasonal=list(order=c(0,1,1), period=12), 
      include.drift=TRUE, lambda=0, method="ML")
  fcast2 <- forecast(fit2, h=12)
  fit3 <- ets(xshort,model="MMM",damped=TRUE)
  fcast3 <- forecast(fit3, h=12)
  mae1[i,1:length(xnext)] <- abs(fcast1[['mean']]-xnext)
  mae2[i,1:length(xnext)] <- abs(fcast2[['mean']]-xnext)
  mae3[i,1:length(xnext)] <- abs(fcast3[['mean']]-xnext)
}

plot(1:12, colMeans(mae1,na.rm=TRUE), type="l", col=2, xlab="horizon", ylab="MAE",
     ylim=c(0.65,1.05))
lines(1:12, colMeans(mae2,na.rm=TRUE), type="l",col=3)
lines(1:12, colMeans(mae3,na.rm=TRUE), type="l",col=4)
legend("topleft",legend=c("LM","ARIMA","ETS"),col=2:4,lty=1)

risultati


Ciao Zach Ho implementato una versione leggermente diversa del codice di Hyndman al fine di rilevare il numero appropriato di termini per un modello di regressione con serie temporali. Sfortunatamente, il grafico degli errori CV ha mostrato diversi minimi locali che mi hanno fatto dubitare di come selezionare correttamente il numero di termini. Il problema completo è descritto qui . Hai mai affrontato qualcosa di simile prima?
jroberayalas,

5

Se si dispone di dati di serie temporali, è possibile che si verifichi un "problema dei gradi di libertà". Ad esempio, se sono state prese 4 osservazioni a intervalli orari e si decide di utilizzare 241 osservazioni a intervalli di 1 minuto, si hanno 241 osservazioni ma non sono necessariamente indipendenti. Quando invii questi 241 valori / misurazioni a un pacchetto analitico, il pacchetto potrebbe aspettarsi che siano 241 valori indipendenti mentre procede per eseguire la sua magia particolare. Se disponi di dati sulle serie temporali, potresti dover aggiornare le tue analisi. Non conosco il programma a cui ti riferisci, ma è una mia ipotesi ragionevole (potrei sbagliarmi!) Che i suoi test (test F / test T ... ecc.) Probabilmente non si applicano al tuo set di problemi.


1

Posso consigliarvi 2 interessanti articoli da leggere che sono online 1.Streamed Learning: One-Pass SVMs, di Piyush Rai, Hal Daum´e III, Suresh Venkatasubramanian 2.Streaming approssimazione k-media, di Nir Ailon

Spero che ti chiarisca un po 'le tue idee


Potete fornire collegamenti a tali documenti? Grazie.
Zach,

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.