Usando validação cruzada k-fold para seleção de modelos de séries temporais

70

Pergunta: Quero ter certeza de alguma coisa, o uso da validação cruzada k-fold com séries temporais é direto ou é necessário prestar atenção especial antes de usá-lo?

Antecedentes: estou modelando uma série temporal de 6 anos (com cadeia semi-markov), com uma amostra de dados a cada 5 minutos. Para comparar vários modelos, estou usando uma validação cruzada 6 vezes, separando os dados em 6 anos, para que meus conjuntos de treinamento (para calcular os parâmetros) tenham duração de 5 anos e os conjuntos de teste com 1 ano. Como não estou levando em consideração a ordem do tempo, meus conjuntos diferentes são:

  • dobra 1: treinamento [1 2 3 4 5], teste [6]
  • dobra 2: treinamento [1 2 3 4 6], teste [5]
  • dobra 3: treinamento [1 2 3 5 6], teste [4]
  • dobra 4: treinamento [1 2 4 5 6], teste [3]
  • dobra 5: treinamento [1 3 4 5 6], teste [2]
  • dobra 6: treinamento [2 3 4 5 6], teste [1].

Estou fazendo a hipótese de que a cada ano são independentes um do outro. Como posso verificar isso? Existe alguma referência que mostre a aplicabilidade da validação cruzada com dobras k com séries temporais.

Mickaël S
fonte
Dê uma olhada neste artigo, que eu achei
helesc

Respostas:

69

Séries temporais (ou outros dados ordenados intrinsecamente) podem ser problemáticas para validação cruzada. Se algum padrão surgir no ano 3 e permanecer nos anos 4 a 6, seu modelo poderá segui-lo, mesmo que não faça parte dos anos 1 e 2.

Uma abordagem às vezes mais baseada em princípios para séries temporais é o encadeamento para a frente, onde seu procedimento seria algo como isto:

  • dobra 1: treinamento [1], teste [2]
  • dobra 2: treinamento [1 2], teste [3]
  • dobra 3: treinamento [1 2 3], teste [4]
  • dobra 4: treinamento [1 2 3 4], teste [5]
  • dobra 5: treinamento [1 2 3 4 5], teste [6]

Isso modela com mais precisão a situação que você verá no momento da previsão, em que modelará dados passados ​​e futuros. Também lhe dará uma noção da dependência da sua modelagem no tamanho dos dados.

Ken Williams
fonte
11
Obrigado. Eu entendo, como Zach disse, é a maneira canônica de fazer isso. E eu entendo o porquê. O problema que tenho com isso é exatamente o fato de levar em consideração a variação do tamanho dos dados, portanto, não receberei o erro de generalização "verdadeiro" do meu modelo. Mas um erro misto: generalização e tamanho dos dados. Você conhece outros árbitros (exceto M.Hyndman) que lidam com a validação cruzada em séries temporais? Não me interpretem mal, não é, não estou confiando no que você está dizendo e no que M. Hyndman está dizendo, faz todo o sentido. Eu simplesmente gostaria de ter vários pontos de vista sobre um problema #
Mickaël S
Acho que não conheço essa referência, mas estaria interessado em ver uma se outra pessoa a conhecer.
Ken Williams
11
@Wayne, quero dizer que esta solução usa mais e mais anos de dados de treinamento em cada dobra. Nos meus dados, existem definitivamente diferenças entre os anos, mas nenhuma tendência aparente ou sazonalidade.
Mickaël S
3
@Mickael: Você poderia usar a dobra 1: train [1 2] test [3]; dobra 2: teste de trem [2 3] [4]; dobra 3: teste de trem [3 4] [5] etc., se você estiver preocupado em usar mais e mais dados a cada dobra. Meu palpite é que, com uma técnica de semi-MC, você não pode competir nos próximos anos, mesmo que não haja tendência.
Wayne
3
@ MickaëlS: Encontrei este artigo em sciencedirect.com/science/article/pii/S0020025511006773 e achei que poderia ser interessante. Eles comparam essa abordagem "canônica" com dois outros métodos - uma abordagem "block boostrap" e uma abordagem "deixe de fora dependente".
thebigdog
26

O método usado para validar cruzadamente meu modelo de série temporal é a validação cruzada em uma base contínua. Comece com um pequeno subconjunto de dados para fins de treinamento, preveja os pontos de dados posteriores e verifique a precisão dos pontos de dados previstos. Os mesmos pontos de dados previstos são incluídos como parte do próximo conjunto de dados de treinamento e os pontos de dados subsequentes são previstos.

Para tornar as coisas intuitivas, aqui está uma imagem para o mesmo:

insira a descrição da imagem aqui

Um código R equivalente seria:

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)
Jatin Garg
fonte
Existe alguma maneira de fazer isso para métodos como regressão logística usando R?
precisa saber é o seguinte
11
@ hlyates, no meu entendimento, é possível, você só precisa modificar o código acima um pouco. Inclua o pred_lr (previsões por regressão logística) e altere o nome das colunas de acordo.
Jatin Garg
22

A maneira "canônica" de realizar a validação cruzada de séries temporais (pelo menos como descrito por @Rob Hyndman) é "rolar" o conjunto de dados.

ou seja:

  • dobra 1: treinamento [1], teste [2]
  • dobra 2: treinamento [1 2], teste [3]
  • dobra 3: treinamento [1 2 3], teste [4]
  • dobra 4: treinamento [1 2 3 4], teste [5]
  • dobra 5: treinamento [1 2 3 4 5], teste [6]

Basicamente, seu conjunto de treinamento não deve conter informações que ocorram após o conjunto de testes.

Zach
fonte
13

Não há nada errado em usar blocos de dados "futuros" para validação cruzada de séries temporais na maioria das situações. Na maioria das situações, refiro-me aos modelos para dados estacionários, que são os modelos que normalmente usamos. Por exemplo, quando você ajusta um , com a uma série, você pega diferenças da série e ajusta um modelo para dados estacionários aos resíduos.d > 0 dARIMA(p,d,q)d>0d

Para que a validação cruzada funcione como uma ferramenta de seleção de modelo, você precisa de independência aproximada entre o treinamento e os dados de teste. O problema com os dados de séries temporais é que os pontos de dados adjacentes geralmente são altamente dependentes; portanto, a validação cruzada padrão falha. O remédio para isso é deixar um espaço entre a amostra de teste e as amostras de treinamento, nos dois lados da amostra de teste . A razão pela qual você também precisa deixar uma lacuna antes da amostra de teste é que a dependência é simétrica quando você avança ou retrocede no tempo (pense na correlação).

Essa abordagem é chamada de validação cruzada (deixe fora, exclua observações de ambos os lados da amostra de teste) e é descrita neste documento. No seu exemplo, isso seria assim:v hhvvh

  • dobra 1: treinamento [1 2 3 4 5h], teste [6]
  • dobra 2: treinamento [1 2 3 4h h6], teste [5]
  • dobra 3: treinamento [1 2 3h h5 6], teste [4]
  • dobra 4: treinamento [1 2h h4 5 6], teste [3]
  • dobra 5: treinamento [1h h3 4 5 6], teste [2]
  • dobra 6: treinamento [h2 3 4 5 6], teste [1]

Onde h indica que h observações da amostra de treinamento são excluídas desse lado.

Matthias Schmidtblaicher
fonte
3

Como comentado por @thebigdog, "Sobre o uso da validação cruzada para avaliação de preditores de séries temporais" por Bergmeir et al. discute a validação cruzada no contexto de séries temporais estacionárias e determina que o encadeamento direto (proposto por outros respondentes) não é útil. Observe que o encadeamento direto é chamado Avaliação de Último Bloco neste documento:

Usando a validação cruzada padrão de 5 vezes, não foi encontrado nenhum efeito prático das dependências nos dados, sobre se o erro final está subestimado ou superestimado. Pelo contrário, a última avaliação de bloco tende a produzir medidas de erro menos robustas do que a validação cruzada e a validação cruzada bloqueada.

" Avaliando modelos de previsão de séries temporais: um estudo empírico sobre métodos de estimativa de desempenho " por Cerqueira et al. concorda com esta avaliação. No entanto, para séries temporais não estacionárias, eles recomendam o uso de uma variação no Hold-Out, chamada Rep-Holdout. No Rep-Holdout, um ponto aé escolhido na série temporal Ypara marcar o início dos dados de teste. O ponto aestá determinado a estar dentro de uma janela. Isto é ilustrado na figura abaixo:

ilustração de rep-holdout

Este artigo mencionado é longo e exaustivamente testa quase todos os outros métodos mencionados nas respostas a esta pergunta com código disponível ao público . Isso inclui a reivindicação de @Matthias Schmidtblaicher de incluir lacunas antes e depois dos dados do teste. Além disso, apenas resumi o artigo. A conclusão real do artigo envolve uma árvore de decisão para avaliar modelos de séries temporais!

Seanny123
fonte