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. Konkret soll das neuronale Netz mit den orangen Werten in der Abbildung trainiert werden und danach die „unbekannten“ grünen Werte möglichst genau vorhersagen.
Eine digitale Zeitreihe besteht aus mehreren einzelnen Messpunkten, welche normalerweise in gleichen zeitlichen Abständen voneinander aufgezeichnet wurden. Die untenstehenden Abbildungen zeigen dies im Detail.
🤔 Wie lässt sich nun eine solche digitale Zeitreihe vorhersagen?
💡 Eine einfache Idee ist z.B. die Folgende. Wir verwenden jeweils die letzten vier Werte der Zeitreihe als Eingangswerte für ein neuronales Netz (die letzten vier Werte können gemessen oder auch vorhergesagte Werte sein). Diese vier Werte sind in den Abbildungen dunkelblau eingezeichnet. Das neuronale Netz wird zuvor so trainiert, dass es immer nur den nächsten, unbekannten Wert voraussagt. D.h. das neuronale Netz sagt nur einen Zeitschritt (+1 Stunde) voraus. Dieser vorhergesagte Wert ist grün eingezeichnet. Ist ein grüner Wert berechnet worden, so kann auch dieser für die Vorhersage des nächsten Zeitschritts ebenfalls als Eingangswert 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 usw. (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 jeweils vier nacheinander folgende Zeitpunkte der bereits bekannten Zeitreihe als Eingangswerte genommen und zusätzlich der nächste, fünfte Zeitpunkt als gewünschter Ausgangswert verwendet, der vorhergesagt werden sollte (Desired Output). Dafür muss der Wert dieses fünften Zeitpunkts natürlich bekannt sein. So kann das neuronale Netz lernen, welcher Wert jeweils nach vier Zeitpunkten als Nächstes kommt.
🤔 Und wie können wir sagen, wie gut die Vorhersage ist?
💡 Wir lassen das neuronale Netz eine Vorhersage für den nächsten Zeitpunkt (+1 Stunde) erstellen. Diesen vorhergesagten Wert nennen wir $v$. Da wir den richtigen Wert für die Vorhersage kennen (den Desired Output) können wir den Vorhersagewert $v$ mit dem richtigen, beobachteten Wert $b$ vergleichen.
Für uns spielen zwei Fehlermasse eine Rolle.
⚠️ Für die Beschreibung dafür, wie gut eine Zeitreihe vorhergesagt wird, verwenden wir den MAE, da dieser, im Gegensatz zum MSE, dieselbe Einheit wie die Zeitreihe hat. So lässt sich z.B. für eine Temperaturprognose sagen, dass diese im Mittel 2 °C abweicht. Für das Training des neuronalen Netzes verwenden wir den MSE, da dieser grosse Abweichungen zwischen vorhergesagten Wert $v$ und beobachteten Wert $b$ während des Trainings aufgrund des Quadrats stärker bestraft als der MAE (je grösser der Fehlerwert, desto grösser die Anpassung der Gewichte).
Hier trainierst du ein neuronales Netz, welches die Zeitreihe genau +1 Stunde in die Zukunft vorhersagt. Sobald das neuronale Netz trainiert ist, sagst du +1 Stunde voraus, verwendest die +1 Stundenprognose um, wie oben gezeigt, eine +2 Stundenprognose zu erzeugen etc. bis eine Prognose bis +120 Stunden in die Zukunft entsteht.
Modell
, Training
und Resultat
hin und her wechseln.x = 72
. Loading ⌛
TIMESERIES_FEATURES
: Bestimmt, wie viele vergangene Zeitpunkte als Eingangsgrössen verwendet werden. In den einleitenden Grafiken werden vier vergangene Zeitpunkte verwendet (die dunkelblauen 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 (was für dieses Beispiel, weniger ein Problem darstellt), 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).
Im nachfolgenden neuronalen Netz ist die Tagesstunde als zusätzliche Eingangsgrösse mit eingebaut. Bei der Wahl TIMESERIES_FEATURES = 12
besitzt das neuronale Netz daher 13 Eingangsgrössen.
🤔 Vermutlich hast du festgestellt, dass das neuronale Netz in „Auftrag 2“ manchmal besser und manchmal schlechter abschneidet als das neuronale Netz in „Auftrag 1 - Teil 1“, obwohl es eine Eingangsgrösse mehr besitzt. Es erscheint fast so, als würde die neue Eingangsgrösse das neuronale Netz manchmal „verwirren“.
⚠️ 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.
🤔 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 vergangenen Werten der Zeitreihe werden hier zusätzlich Sinus und Cosinus der Tagesstunde verwendet. Bei der Wahl TIMESERIES_FEATURES = 12
besitzt das neuronale Netz somit 14 Eingangsgrössen.
TIMESERIES_FEATURES
bekommst du eine MAE für die +72 Stundenprognose von weniger als 0.1 hin? Halte die MAE zusammen mit deiner neuronalen Netz Einstellung im Textfeld fest. Loading ⌛
🙂 So weit, so gut, du konntest dank Fachwissen (dem Einbauen von Sinus und Cosinus der Tagesstunde) bereits mit relativ wenigen Eingangsgrössen 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 ⌛