RNNs sind hervorragend dafür geeignet, zukünftige Sequenzen
vorherzusagen.
Im Folgenden werden wir uns mit der Vorhersage des Stromverbrauchs
beschäftigen.
Der benötigte Strom lässt sich umso kostengünstiger und effizienter
sowohl bereitstellen als auch übertragen, je genauer die zu erwartende
Last abgeschätzt werden kann.
Die Lastprognosen können von Stromnetzbetreibern oder Erzeugern von
Stunden bis hin zu Jahren im Voraus benötigt werden.
Langfristige Lastprognosen sind zum Beispiel für die Entscheidung zum
Bau von neuen Kraftwerken und Netzen von Bedeutung.
Als Basis für die Lastprognose dient eine Vielzahl von
unterschiedlichen Daten, wie das Wetter, der Wochentag, Feiertage
sowie besondere Ereignisse wie die Fußball-Weltmeisterschaft.
In dieser Grafik sehen Sie den durchschnittlichen Verlauf des
Stromverbrauchs über zwei Wochen in Deutschland.
Wir erkennen eine wöchentliche und eine tägliche Periodizität dieser
Kurve.
Zeitreihen haben häufig sogenannte Sessionalitäten wie diese, das
heißt, sie zeigen im Jahresverlauf wiederkehrende typische Strukturen.
LSTM-Modelle können jedoch besser prognostizieren, wenn die Daten
stationär sind, das heißt, je weniger Schwankungen sie unterliegen.
Unser erster Schritt ist daher, den Einfluss der Sessionalität der
Zeitreihe zu entfernen.
Zeitreihen können in verschiedenen Komponenten zerlegt werden.
Eine Trendkomponente als allgemeine Grundrichtung der Zeitreihe, eine
periodische Komponente, die zyklisch wiederholt wird, und eine Rest-
oder irreguläre Komponente, hierunter fallen Ausreißer und
Zufallsschwankungen, die normalerweise schwer zu erklären sind.
Diese drei Komponenten können additiv oder multiplikativ die Zeitreihe
bilden.
Betrachten wir das folgende Beispiel.
Wir haben einen Trend, eine periodische und eine irreguläre
Komponente.
Bilden sie additiv eine Zeitreihe, weist sie so einen Verlauf auf.
Ist die Zeitreihe eine Zusammensetzung dieser Komponenten in einer
multiplikativen Form, hat die Zeitreihe die folgende Form.
Betrachtet man die Kurve des Stromverbrauchs in Deutschland, kann ein
additiver Aufbau der Komponenten angenommen werden.
Auf Basis davon werden wir unsere Zeitreihe in ihrer Komponenten
zerlegen.
Dazu verwenden wir die Funktion seasonal decompose der Python Library
Stats Models.
Die Funktion nimmt als Eingang die Zeitreihe, also unsere
Stromlastwerte, und ein Modell, additiv oder multiplikativ, in diesem
Fall additiv.
Andere Parameter können, falls notwendig, hinzugefügt werden.
Für mehr Informationen werfen Sie bitte einen Blick in die
Dokumentation dieser Funktion.
Als Ausgang erhält man ein Objekt mit den drei erwarteten Komponenten
der Zeitreihe.
Wir können dann die Saisonalität über eine einfache Subtraktion
ermitteln und so einen stationären Datensatz erhalten.
Als nächster Schritt müssen wir die Zeitreihe in einem passenden
Format für überwachtes Lernen umwandeln, und zwar indem wir die
Eingangsvariablen und Labels vorbereiten.
Danach wird die Architektur unseres Modells definiert, um die Anzahl
der Eingangs- und Ausgangselemente zu bestimmen.
Unser Prognosemodell wird die letzten zwölf Stunden der
Stromverbrauchswerte als Eingang verwenden, um genug Informationen des
vergangenen Verlaufs zu berücksichtigen.
Ob das die beste Eingangslänge für dieses Problem ist, wissen wir
nicht a priori.
Sie können unterschiedliche Eingangslängen ausprobieren, bis Sie eine
gute Lösung gefunden haben.
Das Modell wird auf der anderen Seite den nächsten Schritt
prognostizieren.
Für unseren Datensatz bedeutet das einen 15-Minuten-Blick in die
Zukunft.
Da wir eine Prognose von einer Woche möchten, werden wir das Modell
mehrmals laufen lassen, bis die ganze Woche vorhergesagt wurde, und
zwar 672 Mal.
Wir füttern das Netz bei jedem Lauf mit seinem letzten Ausgang, sodass
es weiß, was in den letzten Schritten vorhergesagt wurde.
Diese Methode funktioniert normalerweise gut für kurzfristige
Prognosen.
Für langfristige Prognosen ist die Fehlerfortpflanzung ein Problem.
In diesem Fall sollte eine andere Architektur des Netzes in Betracht
gezogen werden.
Wir benutzen die letzten zwölf Stunden als Eingang, was also 48
Elementen entspricht, und einen Vorhersageschritt von 15 Minuten als
Ausgang, also ein Element.
Die Dimensionen unserer Eingangs- und Ausgangsvariablen müssen wir
entsprechend für überwachtes Lernen anpassen.
In diesem Beispiel betrachten wir eine Zeitreihe mit Werten von 1 bis
100.
Wir können diese Daten in 48 Elemente für die Eingänge des Modells und
ein Element für die erwarteten Ausgänge verwenden.
Der letzte Schritt der Datenvorverarbeitung ist die Normalisierung.
Neuronale Netze lernen besser, wenn sie keine beliebige große Werte
verarbeiten müssen, sondern wenn sich die Werte innerhalb eines
definierten Bereichs befinden.
Die Normalisierung skaliert alle Werte der Zeitreihe zwischen 0 und 1,
was für das Netz deutlich einfacher zu bearbeiten ist.
Nachdem wir die Daten vorbereitet haben, können wir nun beginnen,
unsere LSTM zu programmieren.
Dafür verwenden wir die Keras Library.
Zunächst definieren wir ein sequenzielles Modell mit model.sequential
und definieren dann die Schichten, die wir im Netz benötigen.
Das machen wir mit model.add.lstm.
Diese Funktion erwartet die Schichtenparameter für das LSTM, unter
anderem die Anzahl an LSTM-Zellen, die Aktivierungsfunktion und die
Dimension der Eingangsvariablen.
Falls wir mehrere LSTM-Schichten in unserem RNN haben, ist es wichtig,
die Option returnSequences auf true zu setzen.
Warum ist das so?
Weil die Eingänge der LSTM-Schichten immer drei Dimensionen haben
müssen.
Wenn returnSequences gleich false ist, gibt die Schicht einen
zweidimensionalen Ausgang aus, was nicht kompatibel mit der nächsten
Schicht ist.
Sobald alle LSTM-Schichten definiert wurden, sollten wir eine voll
verbundene Schicht als Ausgang hinzufügen.
In Keras eine denseLayer.
Nun fehlt nur noch, das Modell zu kompilieren und zu trainieren.
Wir verwenden erstmal die Funktion model.compile und definieren damit
die Verlustfunktion, meanSquareError zum Beispiel, und die Art der
Optimizer.
Danach lassen wir Keras das Modell trainieren.
Wir müssen die Funktion model.fit aufrufen und die folgenden Parameter
eingeben.
Trainingsdatensatz und Labels, die Anzahl an Epochen und die
Batchgröße.
Nach dem Training haben wir ein fertiges Modell, welches den
Stromverbrauch in Deutschland prognostiziert.
Diese Kurve ist ein Vorhersagebeispiel von einem simplem LSTM-Modell
mit nur einer Schicht und 50 Zellen.
Sie können natürlich unterschiedliche Einstellungen des Netzes
ausprobieren.
Mehr Schichten, andere Anzahl an Zellen, eine andere
Aktivierungsfunktion.
Sie können sogar alle Möglichkeiten mittels einer CRID oder Random
Search testen und am Ende nur mit dem besten Modell arbeiten.
Wichtig ist, dass Sie jetzt ein neues nützliches Werkzeug haben.
Immer wenn Sie Prognosen in die Zukunft erstellen möchten, bauen Sie
sich einfach ein LSTM.
Nur müssen Sie sich an folgende Schritte erinnern.
Die Saisonalität der Zeitreihe entfernen.
Die Daten normalisieren.
Die Form der Eingangs- und Ausgangsvariablen definieren.
Die Zeitreihe entsprechend umwandeln.
Das Modell definieren, trainieren und zum Schluss prognostizieren.