Dies ist eine alte Version des Dokuments!




Navigation: 📈 Teil 1 - 📈 Teil 2 Loading ⌛Loading ⌛

📈 Zeitreihenvorhersage mit TensorFlow 1

🎯 In dieser Reihe erfährst du, wie du mit neuronalen Netzen Zeitreihen vorhersagen kannst und erhältst Einblicke in das Programmier-Framework „TensorFlow“.

💡 Dieses Thema setzt Grundwissen bezüglich neuronaler Netze voraus (dieses Grundwissen wird z.B. in Künstliche Intelligenz für echte Fische vermittelt).

inlinetoc_2-3

1. Einfache Zeitreihenvorhersage

💡 Eine Zeitreihe vorherzusagen kann für vieles nützlich sein, z.B. eine Vorhersage von Wetter- oder Klimamesswerten, von Börsenkursen, Hochwasserständen etc.

Zeitreihe der stündlichen Messgrösse X. Horizontal sind die Tagesstunden ersichtlich, vertikal die Werte der Messgrösse X. Orange: beobachtete Vergangenheit, Grün: vorherzusagende Zukunft 1)

💡 Im Folgenden betrachten wir die fiktive stündliche Zeitreihe der ominösen Messgrösse X, welche sich alle 24 Stunden wiederholt (siehe nebenstehende Abbildung). Wir nutzen ein neuronales Netz, um diese Zeitreihe zu lernen und zukünftige Werte vorherzusagen (das funktioniert nicht nur mit neuronalen Netzen, sondern auch mit anderen Verfahren). Konkret soll das neuronale Netz mit den orangen Werten in der Abbildung trainiert werden und danach die „unbekannten“ grünen Werte vorhersagen. Da wir die Zeitreihe konstruiert haben, wissen wir, wie die Zeitreihe in der Zukunft aussehen muss und können so die Güte der Vorhersage überprüfen.

⚠️ Eine digital erfasste Zeitreihe besteht aus mehreren einzelnen Messpunkten, welche in einem gewissen zeitlichen Abstand voneinander aufgezeichnet wurden. Die untenstehenden Abbildungen zeigen dies im Detail.

🤔 Wie lässt sich nun eine solche digitale Zeitreihe vorhersagen?

💡 Eine einfache Idee ist die Folgende. Wir verwenden z.B. jeweils die letzten vier bekannten Werte der Zeitreihe (diese können gemessen oder auch vorhergesagt sein) als Eingangswerte für ein neuronales Netz. Diese vier Messpunkte sind in den Abbildungen unten blau eingezeichnet. Das neuronale Netz wird zuvor so trainiert, dass es immer den nächsten, unbekannten Zeitschritt (+1 Stunde) vorhersagt. Der vorhergesagte Punkt ist grün eingezeichnet. Ist ein grüner Punkt vorhergesagt, so kann auch dieser als Eingang für das neuronale Netz genommen werden. D.h. das neuronale Netz sagt einen Zeitpunkt voraus, rutscht eine Position weiter und sagt den nächsten Zeitpunkt voraus (dies ist in den drei Abbildungen von links nach rechts ersichtlich).

Zeitreihenvorhersage für Zeitschritt 342)
Zeitreihenvorhersage für Zeitschritt 353)
Zeitreihenvorhersage für Zeitschritt 364)


🤔 Wie kann ein neuronales Netz aber für so was trainiert werden?

💡 Im Prinzip genau gleich. Es werden fünf nacheinander folgende Zeitpunkte der bereits bekannten Zeitreihe genommen. Die ersten vier stellen die Eingangswerte dar, der letzte den Desired Output. Basierend auf den ersten vier Zeitpunkten lernt das neuronale Netz auf diese Art den nächsten (fünften) Zeitpunkt vorherzusagen.

🤔 Und wie können wir sagen, wie gut die Vorhersage ist?

💡 Wir schauen uns für die Prognose zum Zeitpunkt +1 Stunde an, wie gross der Betrag der Differenz zwischen der Vorhersage $v$ und dem beobachteten Wert $b$ ist: $|v - b|$. Diesen Differenzbetrag berechnen wir ebenfalls für die Prognose zum Zeitpunkt +2 Stunden, +3 Stunden etc.

Mean Absolute Error (MAE)
Der Mean Absolute Error (MAE) ist der Mittelwert über mehrere Differenzbeträge $|v - b|$ zwischen Vorhersage $v$ und beobachteten Wert $b$. Er beschreibt, wie nahe die Prognose der Wirklichkeit im Mittel kommt. Je kleiner der MAE, desto besser. Der MAE hat dieselbe Einheit wie der vorhergesagte Wert.
✍ Auftrag – Teil 1

Hier trainierst du ein neuronales Netz, welches wie oben gezeigt eine Zeitreihe Schritt für Schritt insgesamt +120 Stunden in die Zukunft vorhersagt.

  1. Starte das untenstehende Programm und studiere die folgenden Punkte.
    • Während dem Training wird der Trainingsfehler „loss“ (mean squarred error mse) angezeigt.
    • Danach wird eine Grafik angezeigt mit
      • der wahren (observed) Zeitreihe (orange)
      • der vorhergesagten (forcasted) Zeitreihe (grün)
    • Du kannst nach dem Training zwischen einer Beschreibung des neuronalen Netzes, dem Trainingsfehler und der Vorhersage über die Register Model, Training und Results hin und her wechseln.
  2. Setze in der ersten Sektion im Programmcode den Parameter SHOW_DAILY_MAE auf true. Speichere das Programm über den Save-Button ab und wiederhole das Training.
    ⚠️ Neu wird nun der über jeweils einen Tag gemittelte MAE (blaugrau) angezeigt. In der Grafik weist die blaugraue Fehlerlinie mehrere Stufen auf. Jede Stufe stellt den über einen Tag gemittelte MAE dar. Da die Vorhersage mit fortschreitender Zeit immer schlechter wird, steigt auch der MAE.
  3. Loading ⌛Wenn du alles verstanden hast, so klicke auf „Erledigt“.

✍ Auftrag – Teil 2
  1. Ändere in der ersten Sektion im obigen Programmcode die Parameter ab und wiederhole das Training. Die Parameter sind die Folgenden:
    • TIMESERIES_FEATURES: Bestimmt, wie viele vergangene Zeitpunkte als Eingangsgrössen verwendet werden. In den einleitenden Grafiken werden vier vergangene Zeitpunkte verwendet (die blauen Punkte).
    • LERNRATE: Legt fest, wie stark sich die Gewichte des neuronalen Netzes pro Schritt ändern dürfen. Ist der Wert zu hoch, springt der Fehler (loss) während des Trainings hin und her, ist der Wert zu tief, brauchst du viel Geduld…
      ⚠️ Achtung! Bei einer viel zu hohen Lernrate kann es sogar sein, dass das neuronale Netz derart stark springt, dass die Zahlen grösser werden, als der Computer diese anzeigen kann. Dann wird keine grüne Linie gezeichnet und als Loss „NaN“ (not a number) ausgegeben. Dann ist einfach eine kleinere Lernrate zu wählen.
    • ANZAHL_HIDDEN_NEURONS: Bestimmt die Komplexität des neuronalen Netzes. Ist der Wert zu hoch, kann Overfitting auftreten, ist die Zahl zu klein, kann die Zeitreihe nicht genügend vorhergesagt werden.
    • ANZAHL_EPOCHEN: Legt die Anzahl der „Lerndurchgänge“ fest. Je grösser dieser Wert ist, desto länger wird trainiert.
  2. Notiere, mit welchen Parametereinstellungen du das beste Resultat erzielen konntest und beschreibe das Resultat in Worten. Loading ⌛

2. Fachwissen einbauen

🤔 Vermutlich waren deine Zeitreihenvorhersagen im vorangehenden Auftrag nicht ganz perfekt oder du musstest viele Eingangsgrössen (input features) verwenden.

⚠️ Für die Wahl der Eingangsgrössen ist es immer eine Gute Idee Fachwissen, d.h. Wissen über die zu vorhersagende Grösse zu berücksichtigen. Interessant ist, dass sich die Zeitreihe alle 24 Stunden wiederholt.

💡 Also bauen wir die Tagesstunde 0 - 23 als zusätzliche Eingangsgrösse mit ein (24 Uhr wäre ja wieder 0 Uhr).

✍ Auftrag

Neben den „timeseries features“ ist nun die Tagesstunde als zusätzliche Eingangsgrösse mit eingebaut. Bei der Wahl TIMESERIES_FEATURES = 5 besitzt das neuronale Netz daher 6 Eingangsgrössen.

  1. Starte wiederum das Programm und spiele mit den Parametern herum. Ist das Resultat besser oder schlechter als im letzten Auftrag? Halte deine Eindrücke fest.Loading ⌛

3. Dem neuronalen Netzwerk helfen

🤔 Vermutlich hattest du mithilfe der Tagesstunde weniger timeseries features gebraucht als ohne. Das ist erstaunlich, denn in Wahrheit hatten wir es dem neuronalen Netz nicht einfach gemacht.

⚠️ Das Problem ist der Sprung in der Stundenangabe (siehe unten). Für das neuronale Netz ist der Minimalwert 0 Uhr und der Maximalwert 23 etwas komplett anderes. Für uns (und in der Zeitreihe) sind 0 Uhr und 23 Uhr fast dasselbe. Mit der direkten Eingabe der Tagesstunde verwirren wir das neuronale Netz vermutlich auch ein bisschen.

Blau: Tagesstunde5)


🤔 Aber wie können wir 24 Stunden mit einer Zahl so darstellen, dass es keinen Sprung gibt, jedoch jede Tagesstunde einen anderen Wert bekommt?

💡 Bevor du dir den Kopf zerbrichst, das ist mit einer Zahl nicht möglich, jedoch mit zwei Zahlen schon! Die Idee besteht darin, die Tagesstunde durch den Sinus UND den Cosinus der Tagesstunde zu ersetzen, d.h. durch zwei Eingangsgrössen.6). So wird jede Tagesstunde durch ein anderes Sinus / Cosinus Wertepaar dargestellt (siehe unten).

Blau: Tagesstunde; Orange: Sinus der Tagesstunde; Grau: Cosinus der Tagesstunde7)


💡 Also bauen wir statt der Tagesstunde, die Sinus- und Cosinuswerte der Tagesstunde als zusätzliche Eingangsgrössen mit ein.

✍ Auftrag

Neben den „timeseries features“ werden hier zusätzlich Sinus und Cosinus der Tagesstunde verwendet. Bei der Wahl TIMESERIES_FEATURES = 4 besitzt das neuronale Netz somit 6 Eingangsgrössen.

  1. Starte wiederum das Programm und passe die Parameter an. Ist das Resultat besser oder schlechter als im letzten Auftrag bei gleicher Anzahl Eingangsgrössen? Halte deine Eindrücke fest.Loading ⌛

4. Technisches Wissen nutzen

🙂 So weit, so gut, du konntest dank Fachwissen (dem Einbauen von Sinus und Cosinus der Tagesstunde) bereits mit relativ wenigen Eingangsgrössen einigermassen gute Resultate erzielen.

🕵️ Wie du aber dem Titel entnehmen kannst, ist dies jedoch nur „Teil 1“ der „Zeitreihenvorhersage“. Zudem steht im Titel noch etwas von „TensorFlow“.

💡 TensorFlow ist ein Programmierer-Framework mit ganz vielen bereits geschriebenen Funktionen, welche dir beim Erstellen, Trainieren und Auswerten von neuronalen Netzen helfen können. Damit kannst du relativ einfach auch technisches Wissen bezüglich neuronalen Netzen mit in deine Zeitreihenvorhersage einbauen. Wird es dir damit gelingen, alles noch viel besser zu machen?

📈 Finde es heraus im 📈 Teil 2!

Eigene Notizen

Loading ⌛

1) , 2) , 3) , 4) , 5) , 7)
eigene Darstellung, CC0 1.0
6)
Genauer gesagt verwenden wir sin(2*π*hour/24) und cos(2*π*hour/24) als zusätzliche Eingangsgrössen. Das 2*π/24 sorgt dafür, dass der Sinus und der Cosinus nach 24 Stunden wieder die Anfangswerte einnimmt.