Como dividir o conjunto de dados para previsão de séries temporais?

22

Tenho dados históricos de vendas de uma padaria (diariamente, mais de 3 anos). Agora, quero criar um modelo para prever vendas futuras (usando recursos como dia da semana, variáveis ​​climáticas, etc.).

Como devo dividir o conjunto de dados para ajustar e avaliar os modelos?

  1. Precisa ser uma divisão cronológica de trem / validação / teste?
  2. Eu faria o ajuste do hiperparâmetro com o conjunto de trem e validação?
  3. A validação cruzada (aninhada) é uma estratégia ruim para um problema de série temporal?


EDIT

Aqui estão alguns links que encontrei após seguir o URL sugerido por @ ene100:

  • Rob Hyndman descrevendo "origem da previsão progressiva" na teoria e na prática (com código R)
  • outros termos para a origem da previsão rotativa são "otimização para a frente" ( aqui ou aqui ), "horizonte rotativo" ou "origem móvel"
  • parece que essas técnicas não serão integradas ao scikit-learn em um futuro próximo, porque "a demanda e a seminalidade dessas técnicas não são claras" (declaradas aqui ).

E essa é outra sugestão para validação cruzada de séries temporais.

manobrar
fonte

Respostas:

8

Este link do blog de Rob Hyndman tem algumas informações que podem ser úteis: http://robjhyndman.com/hyndsight/crossvalidation/

Na minha experiência, dividir dados em conjuntos cronológicos (ano 1, ano 2, etc.) e verificar a estabilidade dos parâmetros ao longo do tempo é muito útil na construção de algo robusto. Além disso, se seus dados são sazonais ou têm outra maneira óbvia de dividir em grupos (por exemplo, regiões geográficas), a verificação da estabilidade dos parâmetros nesses subgrupos também pode ajudar a determinar a robustez do modelo e se faz sentido encaixar modelos separados para categorias separadas de dados.

Penso que os testes estatísticos podem ser úteis, mas o resultado final também deve passar no "teste do olfato".

ene100
fonte
3

1) Tecnicamente falando, você não precisa testar fora da amostra se usar o AIC e critérios semelhantes porque eles ajudam a evitar o ajuste excessivo.

3) Não vejo como é possível fazer o CV padrão, pois implica o treinamento de um modelo de série temporal com alguns valores ausentes. Em vez disso, tente usar uma janela rotativa para treinamento e prever a resposta em um ou mais pontos que seguem a janela.

James
fonte
3
A AIC em séries temporais geralmente é baseada em um erro de previsão do período seguinte. Não fala muito sobre o desempenho dinâmico da previsão do n-período à frente. Portanto, absolutamente não é suficiente.
Aksakal
Você poderia fornecer uma referência?
James
1

Costumo abordar problemas de uma perspectiva bayesiana. Nesse caso, eu consideraria o uso da superimputação como estratégia. Isso significa configurar uma probabilidade para seus dados, mas omita alguns de seus resultados. Trate esses valores como ausentes e modele esses resultados ausentes usando suas covariáveis ​​correspondentes. Em seguida, gire pelo qual os dados são omitidos. Você pode fazer isso dentro de, por exemplo, um procedimento CV de 10 vezes.

Quando implementado dentro de um programa de amostragem, isso significa que, em cada etapa, você desenha um valor candidato do seu valor de dados omitido (juntamente com seus parâmetros) e avalia sua probabilidade com relação ao modelo proposto. Depois de atingir estacionariedade, você tem contra-factuais valores amostrados dado o seu modelo que você pode usar para avaliar erro de previsão: "o que o meu modelo ter parecido na ausência desses valores" estas amostras responder à pergunta Observe que essas previsões também herdarão incerteza da incerteza presente nas estimativas de coeficiente. Portanto, quando você coletar todos os seus valores previstos para, por exemplo, 1º de março de 2010 juntos, você terá uma distribuição de previsões para essa data.

O fato de esses valores serem amostrados significa que você ainda pode usar termos de erro que dependem de ter uma série de dados completa disponível (por exemplo, média móvel), desde que você tenha um valor de resultado amostrado disponível a cada etapa.

Sycorax diz restabelecer Monica
fonte
1

No seu caso, você não tem muitas opções. Você só tem uma padaria, ao que parece. Portanto, para executar um teste fora da amostra, sua única opção é a separação do tempo, ou seja, a amostra do treinamento seria do início até algum momento recente, e o holdout seria desse ponto até hoje.

yt=f(t)+εtf(t)ys<t

Aksakal
fonte
Parece promissor. Qual é o índice "s" em y_s <= t?
tobip
tyss<t
Acho que minhas vendas de padaria dependem de fatores exógenos. Não acho que seja um modelo de série temporal estritamente dinâmico como, por exemplo, o preço das ações. Nos meus dados, o erro médio da média com um CV normal de 5 vezes é apenas um pouco maior que um CV de série temporal de 5 vezes que preserva a ordem cronológica das dobras, conforme descrito aqui (por exemplo, 30,7 vs. 33,8 para um ExtraTreesRegressor) . Não tem certeza se essa é uma maneira válida de testar empiricamente um modelo dinâmico?
Tobip
Algo como o ARIMA seria um modelo dinâmico. As vendas são geralmente persistentes, ou seja, as vendas de hoje são como as de ontem.
Aksakal
0

Isenção de responsabilidade: O método descrito aqui não se baseia na leitura completa da literatura. É minha melhor tentativa de improvisar um método CV de dobras K para uma análise multivariada de séries temporais com comprimentos de janela de entrada relativamente curtos (assumindo uma dependência baixa / baixa em períodos de tempo mais longos), onde havia um problema com a presença não homogênea de fontes de dados ao longo do tempo. o período de coleta de dados.

Primeiro, a série de observações é transformada em uma série de janelas de histórico de observações com o comprimento window_length e com a etapa 1 entre janelas (sem passada). Então, o princípio é dividir o conjunto de dados da janela em "shards" muitas vezes mais que o window_length (mas muito mais que o número de instâncias do modelo) e distribuir os shards (como cartas de baralho) como dados de validação para separar as instâncias do modelo. Para manter os modelos mais limpos, uma janela de quarentena de comprimento da janela no início de cada fragmento é mantida fora de todo o treinamento.

Os modelos são treinados em todos os shards, exceto os próprios, e a validação é feita em seus próprios shards. A validação da coleção / conjunto de modelos é feita somando o erro de validação em todos os shards, onde cada shard é tratado pelo seu submodelo correspondente. O teste de dados não vistos pode ser feito usando uma média (ou outra combinação adequada) das saídas de todos os modelos treinados.

Este método visa reduzir a dependência do sistema (e fontes de dados) ser o mesmo durante todo o período de coleta de dados. Também se destina a dar a cada parte aproximada dos dados a mesma influência no modelo. Observe que, para não permitir que as janelas de quarentena prejudiquem o treinamento, é um ponto em que o comprimento do fragmento não se alinha muito bem com os períodos que (espera-se) aparecem nos dados, como (normalmente) ciclos diários, semanais e anuais.

Talvez o modelo de conjunto possa manipular mal dados completamente novos. (Ainda não sei.)

Elias Hasle
fonte