Previsão de séries temporais multidimensional e multivariada (RNN / LSTM) Keras

12

Eu tenho tentado entender como representar e modelar dados para fazer uma previsão de séries temporais multidimensionais e multivariadas usando Keras (ou TensorFlow), mas ainda não sou muito claro depois de ler muitas postagens / tutoriais / documentação de blog sobre como apresentar os dados no forma correta (a maioria dos exemplos é um pouco menos

Meu conjunto de dados:

  • várias cidades
  • para as quais tenho informações sobre temperatura, tráfego de carros, umidade
  • por exemplo, nos últimos 2 anos (um registro por dia)

O que eu quero fazer: eu gostaria de prever para cada cidade as temperaturas que posso esperar para o próximo ano usando uma versão possivelmente atrasada de temperatura, tráfego de carros e umidade (é claro que haveria muitos outros recursos, mas isso é apenas uma exemplo para o pensamento).

Sobre o que estou confuso: se eu tiver duas cidades, para as quais gravei três recursos por 365 dias. Como devo moldar minha entrada para que o modelo possa gerar uma previsão de 365 dias para essas duas cidades (ou seja, duas séries temporais de temperaturas por 365 dias)?

Intuitivamente, o formato do tensor seria (?, 365, 3)de 365 dias e 3 recursos. Mas não tenho certeza do que aderir à primeira dimensão e, mais importante, ficaria surpreso se tivesse que ser pelo número de cidades. Mas, ao mesmo tempo, não tenho idéia de como especificar no modelo que ele precisa entender as dimensões corretamente.

Qualquer ponteiro será útil. Eu estou bem familiarizado com o resto do problema (ou seja, como você constrói uma rede no Keras etc., desde que eu fiz isso para outras redes neurais, mas mais especificamente como melhor codificar a sequência para a entrada desejada.)

Ah , também acho que eu poderia treinar e prever cada cidade de forma independente, mas tenho certeza de que todos concordarão que provavelmente há coisas a serem aprendidas que não são específicas de nenhuma cidade, mas que só podem ser vistas se considerarmos várias delas, Por isso, acho que é importante codificá-lo no modelo.

Bastien
fonte
1
Aqui está um bom tutorial sobre este assunto: tensorflow.org/beta/tutorials/text/time_series
CubeBot88

Respostas:

13

O formato de entrada para um LSTM deve ser (num_samples, num_time_steps, num_features). No seu exemplo de exemplo, a combinação das duas cidades como entrada num_featuresserá 2x3 = 6.

Se você agrupar todas as suas etapas do 365 tempo em uma amostra, a primeira dimensão será 1 - uma única amostra! Você também pode verificar a integridade usando o número total de pontos de dados. Você tem 2 cidades, cada uma com 365 intervalos de tempo e 3 recursos: 2x365x3 = 2190. Obviamente, é o mesmo que 1x365x6 (como eu disse acima) - então seria uma possibilidade (Keras será executado) - mas obviamente não aprenderá a generalizar, apenas fornecendo uma amostra.

Dê uma olhada nesta pergunta relevante , que eu respondi recentemente. Aqui falo um pouco sobre o uso de uma janela rolante (verifique os comentários da resposta para obter mais informações). Isso comprará mais amostras se você precisar delas.

Se você deseja treinar um único modelo com dados para ambas as cidades como entrada, fazer previsões para ambas as cidades a cada etapa do tempo é tão simples quanto definir uma Densecamada final , que gera 2 unidades. Seus dados de validação / teste devem, é claro, conter uma tupla de (cidade1, cidade2).

Uma maneira talvez mais sofisticada de abordar isso seria criar conjuntos de dados em uma única cidade, treinar vários submodelos em cada cidade individualmente (digamos, 5 camadas), então Merge/ Concatenateeles e colocar várias camadas adicionais por cima. Isso significa que você está combinando os recursos aprendidos de cada cidade, que por sua vez estão sendo combinados para um nível mais alto de abstração. Aqui está a primeira imagem que recebi de um mecanismo de pesquisa , que esboça a idéia.

n1k31t4
fonte
Muito obrigado por responder com tanta clareza! Faz muito sentido agora. Mas, de fato, o que eu temia é que fazer a primeira solução que você explicou impeça muita generalização. A abordagem da janela deslizante realmente permitiria muita generalização nas cidades?
Bastien
Seja bem-vindo! Redes profundas sempre se beneficiam de mais dados. Minhas sugestões acima conteriam muitos parâmetros - com apenas 365 pontos, você corre o risco de se ajustar demais a essas cidades (ou seja, sem generalização)! Você pode tentar a dados augmentation- como , depende de seus dados. Se você tivesse dados suficientes, poderia generalizar bem - eu poderia imaginar um resultado do tipo Word2Vec (comum em análise de texto / PNL), em que os relacionamentos entre variáveis ​​se tornam interpretáveis. Verifique isso para mais informações e para mais intuição / diversão . Seus resultados podem traçar um mapa do tempo!
N1k31t4
sim, faz sentido, então trabalhar em algumas janelas rolantes enganaria "mais dados", se eu entendesse o que você disse?
Bastien
Supondo que você preveja o amanhã com base nos últimos 100 dias, o estado do sistema provavelmente não terá mudado muito desde ontem (se estiver rodando janelas), em comparação com um ano atrás (sem usar janelas rolantes). Embora tecnicamente crie mais amostras, você não está criando novos pontos de dados, mas sim prevendo que o modelo se concentre em pedaços menores, um de cada vez. Essa granularidade mais alta permitirá que você faça declarações estatísticas melhores (mais suaves) sobre os resultados, em comparação com o ajuste de todos os dados e a previsão. Você diminui a incerteza nos resultados.
N1k31t4
acordado! E a janela rolante não impediria a célula de memória de aprender dependências de raiva longa?
Bastien