Dies ist eine alte Version des Dokuments!
Navigation: 📈 Teil 1 - 📈 Teil 2 Loading ⌛Loading ⌛
🎯 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).
💡 Eine Zeitreihe vorherzusagen kann für vieles nützlich sein, z.B. eine Vorhersage von Wetter- oder Klimamesswerten, von Börsenkursen, Hochwasserständen etc.
💡 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).
🤔 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.
Hier trainierst du ein neuronales Netz, welches wie oben gezeigt eine Zeitreihe Schritt für Schritt insgesamt +120 Stunden in die Zukunft vorhersagt.
Model
, Training
und Results
hin und her wechseln.SHOW_DAILY_MAE
auf true
. Speichere das Programm über den Save
-Button ab und wiederhole das Training.
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…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.🤔 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).
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.
🤔 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.
🤔 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).
💡 Also bauen wir statt der Tagesstunde, die Sinus- und Cosinuswerte der Tagesstunde als zusätzliche Eingangsgrössen mit ein.
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.
🙂 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!
Loading ⌛