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.


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.


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)

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.


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.


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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.