Keras di previsione di serie storiche multidimensionali e multivariate (RNN / LSTM)


12

Ho cercato di capire come rappresentare e dati di forma per fare un multidimensionale e multivariata tempo serie previsione utilizzando Keras (o tensorflow), ma sono ancora molto poco chiaro dopo aver letto molti post del blog / tutorial / documentazione su come presentare i dati nel forma corretta (la maggior parte degli esempi è leggermente inferiore

Il mio set di dati:

  • diverse città
  • per il quale ho informazioni su come dire temperatura, traffico automobilistico, umidità
  • per esempio gli ultimi 2 anni (un record per ogni giorno)

Cosa voglio fare: vorrei prevedere per ogni città le temperature che posso aspettarmi per il prossimo anno usando una versione forse in ritardo di temperatura, traffico automobilistico e umidità (ovviamente ci sarebbero molte altre funzionalità, ma questa è solo una esempio di pensiero).

Di cosa sono confuso: se ho 2 città, per le quali ho registrato 3 funzioni per 365 giorni. Come devo modellare il mio input in modo che il modello possa generare una previsione per 365 giorni per queste due città (ovvero 2 serie temporali di temperature per 365 giorni)?

Intuitivamente la forma del tensore sarebbe (?, 365, 3)per 365 giorni e 3 funzioni. Ma non sono sicuro di cosa restare nella prima dimensione e, soprattutto, sarei sorpreso se dovesse essere per il numero di città. Allo stesso tempo, non ho idea di come specificare nel modello che deve comprendere correttamente le dimensioni.

Eventuali suggerimenti saranno utili. Conosco il resto del problema (ad es. Come si costruisce una rete in Keras ecc. Da quando l'ho fatto per altre reti neurali, ma più specificamente come codificare la sequenza per l'input desiderato)

Oh, e anche , immagino che potrei allenarmi e prevedere in modo indipendente per ogni città, ma sono sicuro che tutti saranno d'accordo sul fatto che probabilmente ci sono cose da imparare che non sono particolari per nessuna città ma che possono essere viste solo se si considerano molte di esse, quindi perché penso sia importante codificarlo nel modello.


1
Ecco un bel tutorial su questo argomento: tensorflow.org/beta/tutorials/text/time_series
CubeBot88

Risposte:


13

La forma di input per un LSTM deve essere (num_samples, num_time_steps, num_features). Nel tuo esempio, combinando entrambe le città come input, num_featuressarà 2x3 = 6.

Se raccogli tutti i tuoi 365 intervalli temporali in un campione, la prima dimensione sarà 1 - un singolo campione! È inoltre possibile eseguire il controllo di integrità utilizzando il numero totale di punti dati. Hai 2 città, ognuna con 365 fasi temporali e 3 caratteristiche: 2x365x3 = 2190. Questo è ovviamente lo stesso di 1x365x6 (come ho detto sopra) - quindi sarebbe una possibilità (Keras funzionerà) - ma ovviamente non imparerà affatto a generalizzare, dandogli solo un campione.

Dai un'occhiata a questa domanda pertinente , a cui ho recentemente risposto. Lì parlo un po 'dell'uso di una finestra mobile (controlla i commenti della risposta per maggiori informazioni). Questo ti comprerà più campioni se ne avrai bisogno.

Se vuoi formare un singolo modello con i dati per entrambe le città come input, quindi fare previsioni per entrambe le città in ogni fase è semplice come definire un Denselivello finale , che genera 2 unità. I dati di validazione / test devono quindi ovviamente contenere una tupla di (città1, città2).

Un modo forse più sofisticato per avvicinarsi a questo sarebbe quello di creare set di dati su una singola città, quindi addestrare diversi sottomodelli su ciascuna città individualmente (diciamo per 5 livelli), quindi Merge/ Concatenateloro e mettere molti altri livelli in cima. Ciò significa che stai combinando le caratteristiche apprese di ogni città, che a loro volta vengono combinate a un livello superiore di astrazione. Ecco la prima immagine che ho ottenuto da un motore di ricerca , che abbozza l'idea.


Grazie mille per il tempo dedicato a rispondere in modo così chiaro! Adesso ha molto senso. Ma, in effetti, ciò di cui avevo paura è che fare la prima soluzione che hai spiegato impedirà molta generalizzazione. L'approccio a finestre scorrevoli consentirebbe davvero molta generalizzazione tra le città?
Bastien,

Prego! Le reti profonde beneficiano sempre di più dati. I miei suggerimenti sopra contengono molti parametri: con solo 365 punti, corri il rischio di adattarti a quelle città (cioè senza generalizzazioni)! Puoi provare ad aumentare i dati , come dipende dai tuoi dati. Se avessi abbastanza dati, potresti generalizzare bene - Potrei immaginare un risultato di tipo Word2Vec (comune nell'analisi del testo / PNL), in cui le relazioni tra le variabili diventano interpretabili. Dai un'occhiata a questo per informazioni e questo per più intuizione / divertimento . I tuoi risultati potrebbero tracciare una mappa meteorologica!
n1k31t4,

sì ha senso, quindi lavorare su alcune finestre scorrevoli in qualche modo ingannerebbe "più dati" se capissi cosa hai detto?
Bastien,

Supponendo che tu preveda domani in base agli ultimi 100 giorni, lo stato del sistema non sarà probabilmente cambiato in modo così estremo rispetto a ieri (se si eseguono finestre scorrevoli), rispetto a un anno fa (non utilizzando finestre scorrevoli). Sebbene tecnicamente crei più campioni, non stai creando nuovi punti dati, ma piuttosto prevedi di consentire al modello di concentrarsi su blocchi più piccoli uno alla volta. Questa maggiore granularità ti consentirà di formulare dichiarazioni statistiche migliori (più fluide) sui risultati, rispetto all'adattamento di tutti i dati e alla previsione. Riduci l'incertezza nei risultati.
n1k31t4,

concordato! E la finestra mobile non impedirebbe alla cellula di memoria di apprendere dipendenze di rabbia lunga?
Bastien,
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.