Multi-dimensionale und multivariate Zeitreihenprognose (RNN / LSTM) Keras

12

Ich habe versucht zu verstehen, wie man Daten darstellt und formt, um eine multidimentionale und multivariate Zeitreihenvorhersage mit Keras (oder TensorFlow) zu erstellen, aber ich bin immer noch sehr unklar, nachdem ich viele Blogposts / Tutorials / Dokumentationen gelesen habe, wie man die Daten im Internet präsentiert richtige Form (die meisten Beispiele sind etwas weniger

Mein Datensatz:

  • mehrere Städte
  • wofür ich Infos über zB Temperatur, Autoverkehr, Luftfeuchtigkeit habe
  • zum Beispiel die letzten 2 Jahre (ein Datensatz für jeden Tag)

Was ich tun möchte: Ich möchte für jede Stadt die Temperaturen vorhersagen, die ich für das nächste Jahr erwarten kann, wobei ich eine möglicherweise verzögerte Version von Temperatur, Autoverkehr und Luftfeuchtigkeit verwende (natürlich gibt es mehrere weitere Funktionen, aber dies ist nur eine Beispiel zum Nachdenken).

Was mich verwirrt: Wenn ich 2 Städte habe, für die ich 365 Tage lang 3 Features aufgenommen habe. Wie soll ich meine Eingabe gestalten, damit das Modell eine Prognose für 365 Tage für diese beiden Städte ausgeben kann (dh 2 Zeitreihen von Temperaturen für 365 Tage)?

Intuitiv wäre die Tensorform (?, 365, 3)für 365 Tage und 3 Merkmale. Aber ich bin mir nicht sicher, was ich in der ersten Dimension halten soll, und vor allem wäre ich überrascht, wenn es die Anzahl der Städte geben müsste. Gleichzeitig habe ich aber keine Ahnung, wie ich in dem Modell angeben soll, dass es die Dimensionen richtig verstehen muss.

Hinweise sind hilfreich. Ich bin mit dem Rest des Problems ziemlich vertraut (dh wie Sie ein Netzwerk in Keras usw. erstellen, da ich dies für andere neuronale Netzwerke getan habe, aber genauer gesagt, wie die Sequenz für die gewünschte Eingabe am besten codiert werden kann.)

Oh und auch , ich denke, ich könnte für jede Stadt einzeln trainieren und vorhersagen, aber ich bin sicher, jeder wird zustimmen, dass es wahrscheinlich Dinge zu lernen gibt, die für keine Stadt spezifisch sind, die aber nur gesehen werden können, wenn mehrere davon in Betracht gezogen werden. Daher halte ich es für wichtig, es im Modell zu kodieren.

Bastien
quelle
1
Hier ist ein nettes Tutorial zu diesem Thema: tensorflow.org/beta/tutorials/text/time_series
CubeBot88

Antworten:

13

Die Eingabeform für einen LSTM muss sein (num_samples, num_time_steps, num_features). In Ihrem Beispiel ist die Kombination beider Städte als Eingabe num_features2x3 = 6.

Wenn Sie alle 365 Zeitschritte in einer Stichprobe zusammenfassen, ist die erste Dimension 1 - eine einzelne Stichprobe! Sie können auch anhand der Gesamtzahl der Datenpunkte die Richtigkeit prüfen. Sie haben 2 Städte mit jeweils 365 Zeitschritten und 3 Funktionen: 2x365x3 = 2190. Dies ist offensichtlich dasselbe wie 1x365x6 (wie ich oben sagte) - es wäre also eine Möglichkeit (Keras wird ausgeführt) - aber es wird offensichtlich nicht lernen, überhaupt zu verallgemeinern, indem es nur ein Beispiel gibt.

Schauen Sie sich diese relevante Frage an , die ich kürzlich beantwortet habe. Dort spreche ich ein wenig über die Verwendung eines rollenden Fensters (weitere Informationen finden Sie in den Kommentaren der Antwort). Dadurch erhalten Sie mehr Proben, wenn Sie diese benötigen.

Wenn Sie ein einzelnes Modell mit Daten für beide Städte als Eingabe trainieren möchten, müssen Sie für beide Städte zu jedem Zeitschritt lediglich eine endgültige DenseEbene definieren, die 2 Einheiten ausgibt. Ihre Validierungs- / Testdaten müssen dann natürlich ein Tupel von (city1, city2) enthalten.

Ein vielleicht ausgefeilterer Weg, dies zu erreichen, wäre, Datensätze auf Einzelstadtbasis zu erstellen, dann mehrere Untermodelle für jede Stadt einzeln zu trainieren (z. B. für 5 Schichten), dann Merge/ Concatenatesie und mehrere weitere Schichten darüber zu legen. Dies bedeutet, dass Sie die erlernten Merkmale jeder Stadt kombinieren, die wiederum zu einer höheren Abstraktionsebene kombiniert werden. Hier ist das erste Bild, das ich von einer Suchmaschine bekommen habe , die die Idee skizziert.

n1k31t4
quelle
Vielen Dank, dass Sie sich die Zeit genommen haben, so deutlich zu antworten! Das macht jetzt sehr viel Sinn. Was ich befürchtet habe, ist jedoch, dass die erste Lösung, die Sie erklärt haben, keine Verallgemeinerung zulässt. Würde der Schiebefenster-Ansatz tatsächlich eine starke Verallgemeinerung über Städte hinweg ermöglichen?
Bastien
Bitte! Tiefe Netze profitieren immer von mehr Daten. Meine obigen Vorschläge würden eine Menge Parameter enthalten - mit nur 365 Punkten laufen Sie Gefahr, diese Städte überzurüsten (dh keine Verallgemeinerung)! Sie können versuchen , Daten augmentation- wie , auf Ihre Daten abhängt. Wenn Sie genügend Daten hätten, könnten Sie gut verallgemeinern - ich könnte mir ein Ergebnis vom Typ Word2Vec vorstellen (üblich in der Textanalyse / NLP), bei dem die Beziehungen zwischen Variablen interpretierbar werden. Schauen Sie sich diesbezüglich Informationen an und erfahren Sie mehr über Intuition und Spaß . Ihre Ergebnisse können eine Wetterkarte darstellen!
n1k31t4
Ja, das macht Sinn. Wenn ich verstehe, was Sie gesagt haben, würde die Arbeit mit einigen rollenden Fenstern "mehr Daten" in gewisser Weise verfälschen.
Bastien
Vorausgesetzt, Sie sagen morgen basierend auf den letzten 100 Tagen voraus, hat sich der Status des Systems seit gestern wahrscheinlich nicht mehr so ​​stark geändert (wenn Sie Fenster rollen lassen) wie vor einem Jahr (wenn Sie keine Fenster rollen lassen). Es werden zwar technisch gesehen mehr Samples erstellt, es werden jedoch keine neuen Datenpunkte erstellt, sondern es wird vorausgesagt, dass sich das Modell nacheinander auf kleinere Chunks konzentrieren kann. Diese höhere Granularität ermöglicht es Ihnen, statistische Aussagen über die Ergebnisse besser (flüssiger) zu machen, als alle Daten zu kombinieren und eine Vorhersage zu treffen. Sie verringern die Unsicherheit der Ergebnisse.
n1k31t4
einverstanden! Und würde das fortlaufende Fenster die Speicherzelle nicht daran hindern, überhaupt lange Wutabhängigkeiten zu lernen?
Bastien