Niederschlagsvorhersage über 10 Tage Vorlaufzeit in Singapur mithilfe von Methoden des maschinellen Lernens.
Bemerkenswerte Fortschritte bei der Wettervorhersage im letzten halben Jahrhundert haben der Menschheit große Vorteile gebracht. Genaue Vorhersagen retten viele Leben und Frühwarnungen können die schlimmsten Auswirkungen extremer Wetterereignisse abmildern.
In diesem Artikel untersuchen wir die Niederschlagsvorhersage über Vorlaufzeiten von 10 Tagen in Singapur auf der Grundlage einer Tagesskala. Wir haben mit einigen Basismodellen experimentiert (z. B. LightGBM, Single LSTM) und verschiedene Optimierungsmethoden ausprobiert (z. B. Adam und AdamW), aber wir werden nur die Modellarchitektur mit dem besten Ergebnis durchgehen.
Der Zweck dieses Artikels ist zweifach:
- Präsentieren Sie das Sequence-to-Sequence (Seq2seq)-Modell mit Bidirektionales Lang-Kurzzeitgedächtnis (Bi-LSTM) und Luong-Aufmerksamkeitsmechanismus [1] zur Vorhersage von Niederschlägen mit einer Vorlaufzeit von 10 Tagen
- Erklären Sie, wie wir den Hyperparameter-Tuning-Prozess einer solch komplexen Modellarchitektur angegangen sind, da die meisten Studien solch wichtige Verfahren nicht im Element erklären.
Das vollständige GitHub-Repository finden Sie hier Hier. Wir werden in diesem Artikel nur auf das Seq2seq-Modell eingehen (unter Verwendung von Bi-LSTM + Luong), obwohl die anderen Experimente im Ordner „hpc“ im GitHub-Repository zu finden sind.
Sie können jederzeit zu einem der Hauptabschnitte springen, indem Sie auf den entsprechenden Hyperlink im Inhaltsverzeichnis unten klicken
Unser Untersuchungsgebiet wird sich um Singapur in der Nähe des Äquators konzentrieren. Der Rastergrad unserer GEFSv12-Reprognose- und Reanalyse-Datensätze beträgt 0,25° mal 0,25°, was etwa 27,75 km entspricht. Der räumliche Durchschnittswert der 4 roten Punkte in der folgenden Abbildung wird zum Trainieren des Modells verwendet (dh durchschnittliche Datenpunkte der folgenden Koordinaten: (1,5, 103,75), (1,25, 103,75), (1,5, 104,0), (1,25). , 104,0)).
Als nächstes werden wir uns die Floor-Fact-Daten und die für unser Modell verwendeten Eingabedaten ansehen. Weitere Informationen dazu, wie eine erneute Analyse und Neuprognose zustande kamen und was sie darstellen, finden Sie am Anfang dieses Medium-Artikels:
Floor Fact-Daten (Reanalyse)
Aus GEFSv12-Reanalysedatensatzhaben wir die Variable Gesamtniederschlag (tp) als einzige vorherzusagende Variable ausgewählt. Der folgende Code zeigt, wie wir die Datei „combined-reanalysis.nc“ bereinigt und in Tagesdaten umgewandelt haben (d. h. die Summe der Daten von 06, 12, 18, 00 entspricht einer Stichprobe für einen ganzen Tag).
Wir erstellen zunächst eine Multi-Index Pandas-Tabelle, die die Breiten- und Längengraddimensionen sowie die tp-Variable und die Vorlaufzeiten enthält. Da wir versuchen, die Durchlaufzeiten 1 bis 10 basierend auf der Durchlaufzeit der Neuanalyse von Tag 0 zu prognostizieren, haben wir nur eine einzige Durchlaufzeit für die Neuanalyse.
Anschließend führen wir eine Datenbereinigung durch (fehlender Wert am 20.09.2013), konvertieren die Zeitvariable in ein kohärentes Format und resampeln sie in ein tägliches Format. Wir kombinieren die 4 Koordinatenwerte zu einem einzigen Wert.
Nach dem Exportieren der CSV-Datei sieht unser endgültiger Reanalyse-Datensatz folgendermaßen aus:
Eingabedaten (Neuprognose)
Aus GEFSv12-Neuprognosedatensatzhaben wir fünf Variablen ausgewählt, die bei der Niederschlagsvorhersage helfen sollen. Sie sind:
- t2m: 2-Meter-Temperatur (Ok)
- tp: Gesamtniederschlag
- H: 2 Meter spezifische Luftfeuchtigkeit
- C: Durchschnittliche Gesamtwolkenbedeckung (%)
- E: konvektiv verfügbare potentielle Energie
Unsere Modellstruktur soll dann sein:
Ähnlich wie beim Reanalyse-Datensatz erstellen wir zunächst eine Multi-Index-Pandas-Tabelle, die die Breiten- und Längengraddimensionen sowie die fünf oben genannten meteorologischen Variablen und die 10-tägigen Vorlaufzeiten (Tag 1 bis Tag 10) enthält.
Anschließend hängen wir die 10 Durchlaufzeiten für jede Variable (im folgenden Code wurden nur Cape-Daten angezeigt) an die Tabelle an, während wir erneut eine tägliche Stichprobe erstellen und dabei Duplikate und fehlende Werte berücksichtigen. Anschließend kombinieren wir die 4 Koordinatenwerte zu einem einzigen Wert.
Nach dem Exportieren der CSV-Datei sieht unser endgültiger Neuprognosedatensatz so aus:
Der Zeitrahmen für den Trainingsdatensatz reicht vom 01.01.2000 bis zum 31.12.2016 und der Zeitrahmen für den Testdatensatz vom 01.01.2017 bis zum 31.12.2019. Da wir die Zeitreihen-Kreuzvalidierung verwenden, benötigen wir keinen spezifischen Validierungsdatensatz, da die Validierung mithilfe eines Teils des Trainingsdatensatzes selbst erfolgt. Dies liegt daran, dass unsere Gesamtstichproben klein sind, da wir sie in Tagesstichproben umgerechnet haben, und die Durchführung einer Zeitreihen-Kreuzvalidierung des größeren Trainingsdatensatzes dabei hilft, ausreichend große Stichproben für die Optimierung der Hyperparameter beizubehalten.
Um die verzerrte Niederschlagsverteilung zu berücksichtigen, haben wir die Datensätze, die Niederschlagsvariablen (z. B. tp) enthalten, logarithmisch transformiert und sie mit Min-Max normalisiert.
Hinweis: Der richtige Ansatz besteht darin, die Trainings- und Testdatensätze separat zu protokollieren und eine Min-Max-Normalisierung durchzuführen, um Datenlecks zu verhindern. Dieser Ansatz sollte bei der Wiederholung der Experimente gewählt werden GitHub.
Die Zeitreihen-Kreuzvalidierung wird später für den Hyperparameter-Tuning-Prozess verwendet.
Im Bild oben bezieht sich der blaue Datensatz auf den zuvor erläuterten ursprünglichen Trainingsdatensatz. Außerdem bezieht sich das rot dargestellte Wort „Take a look at“ im Wesentlichen auf die „Validierungs“-Units innerhalb der Splits.
Für unseren in Blau dargestellten vollständigen Trainingsdatensatz haben wir sie in einer Häufigkeit von 2 Jahren professional Coaching (grün) und Take a look at (rot) aufgeteilt. Damit soll sichergestellt werden, dass alle Periodizitätsmuster innerhalb eines ganzen Jahres erfasst und trainiert werden können, anstatt die Datensätze in zufälligen Monaten des Jahres zu zerschneiden.
Daher funktioniert die Zeitreihen-Kreuzvalidierung wie folgt:
- Trainieren Sie an Proben aus den Jahren 2000 bis 2001, die in den Jahren 2002 bis 2003 getestet werden sollen
- Trainieren Sie anhand von Proben aus den Jahren 2004 bis 2005, die in den Jahren 2006 bis 2007 getestet werden sollen
- Trainieren Sie anhand von Proben aus den Jahren 2008 bis 2009, die in den Jahren 2010 bis 2011 getestet werden sollen
- Trainieren Sie anhand von Proben aus den Jahren 2012 bis 2013, die in den Jahren 2014 bis 2015 getestet werden sollen
Von hier aus können wir die besten Gesamthyperparameterkonfigurationen für das Modell erhalten.
Hinweis: Die Funktion „get_xy“ soll sicherstellen, dass die Eingang Das Modell folgt den Anforderungen der Commonplace-LSTM-Architektur mit einem Zeitschritt von 10 Tagen und Funktionen von 5.
Bevor wir darauf eingehen, wie wir unseren Hyperparameter-Tuning-Prozess durchgeführt haben, werfen wir einen Blick auf unsere verwendete Modellarchitektur – das Seq2seq-Modell unter Verwendung von bidirektionalem LSTM und dem Luong-Aufmerksamkeitsmechanismus.
Bidirektionale LSTMs sind eine Erweiterung herkömmlicher LSTMs, die die Modellleistung bei Sequenzklassifizierungsproblemen verbessern können.
Bei Problemen, bei denen alle Zeitschritte der Eingabesequenz verfügbar sind, trainieren bidirektionale LSTMs zwei statt eines LSTMs auf der Eingabesequenz. Das erste auf der Eingabesequenz im Ist-Zustand und das zweite auf einer umgekehrten Kopie der Eingabesequenz. Dies kann dem Netzwerk zusätzlichen Kontext bieten und zu einem schnelleren und noch umfassenderen Lernen des Issues führen.
Wir wissen, dass die Konzentration auf die wichtigen Informationen die Genauigkeit der Klassifizierung verbessern wird. Der Aufmerksamkeitsmechanismus kann daher die wichtigen Informationen aus den Kontextinformationen hervorheben, indem er unterschiedliche Gewichtungen festlegt. Die Kombination von Bi-LSTM und Aufmerksamkeitsmechanismus kann die Genauigkeit der Sequenzklassifizierung weiter verbessern.
Unsere Modellzusammenfassung und unser Modellplot werden wie folgt dargestellt:
Gewichteter MSE-Verlust
Für unsere Verlustfunktion können wir einen sehr einfachen gewichteten MSE-Verlust implementieren, der auf der Amplitude von y_true basiert. Durch unsere Experimente haben wir herausgefunden, dass ein Gewichtungsfaktor von 2 am besten funktioniert.
Der Python-Code zum Implementieren der benutzerdefinierten Verlustfunktion wie oben gezeigt:
Hyperparameter-Tuning
Jetzt untersuchen wir, wie genau wir die Hyperparameter-Abstimmung unseres Seq2seq-Modells angehen.
Für unser Modell gibt es verschiedene Hyperparameter, die angepasst werden können, wie z. B. Aktivierungsfunktionen, Optimierer, Verlustfunktionen, Anzahl der Neuronen für die LSTM-Schichten usw. Wir können GridSearchCV verwenden, um alle Kombinationen der Hyperparameter zu durchlaufen. In unserem Experiment haben wir die Epochen für den gesamten Kreuzvalidierungsprozess auf 20 und die Stapelgröße auf 8 festgelegt, was uns immer noch ein anständiges Ergebnis liefert. Diese festen Epochen und Batch_size-Werte werden für alle anderen Hyperparameterräume verwendet.
Beachten Sie, dass das Endergebnis möglicherweise nicht die optimalste Lösung ist, aber es sollte mit viel geringerem Rechenaufwand und geringerem Zeitaufwand nahe daran liegen. Der Kürze halber werden wir sie im Folgenden einfach als „bestes Ergebnis“ bezeichnen.
Zuerst können wir eine „mylstm“-Klasse definieren, in der wir die Hyperparameter initialisieren. Anschließend verwenden wir self (sowohl für statische Hyperparameter als auch für zu optimierende Hyperparameter), um die Instanz dieser Klasse darzustellen. Anschließend fügen wir die vollständige Architektur des Modells hinzu und definieren einige andere Funktionen, die GridSearchCV verwenden kann (z. B. Anpassen, Vorhersagen und Bewerten).
Jeder zukünftige Hyperparameter-Tuning-Prozess für komplexe Modelle kann den folgenden Code verwenden:
Anschließend legen wir den gesamten Parameterbereich für die Suche fest, wie in gezeigt Zeile 2 unten, und leiten Sie sie durch „clf.match“, wie in gezeigt Zeile 5.
Das beste Optimierungsergebnis, das zufällig „tanh“, 128 Neuronen, Gewichtsfaktor 2 für MSE und Adam-Optimierer ist, wird dann für den Testdatensatz erneut durch das Modell geleitet. Wir haben Epochen und Batch_Size von 160 bzw. 64 verwendet, was genau dem Achtfachen der im Zeitreihen-Kreuzvalidierungsprozess verwendeten entspricht. Dies liegt daran, dass im Testdatensatz etwa achtmal mehr Stichproben vorhanden sind als bei der einzelnen Kreuzvalidierungsaufteilung (Zug und Testsatz in einer Aufteilung unter Zeitreihen-Kreuzvalidierung).
Wir werden „mannequin.predict“ verwenden, um den prognostizierten Niederschlagswert für alle 10 Vorlaufzeiten zu erhalten. Danach führen wir eine inverse_transformation und eine inverse logarithmische Transformation durch, um den ursprünglichen Faktor der tp-Variablen wiederherzustellen.
Wir haben den R2-Rating für alle 10 Vorlaufzeiten aufgezeichnet:
Mehrklassen-Verwirrungsmatrix
Wir testen auch die Klassifizierungsgenauigkeit der Niederschlagsvorhersage, um zu sehen, ob die Niederschläge innerhalb derselben Kategorien vorhergesagt werden. Hier sind die Ergebnisse der Verwirrungsmatrix für eine Vorlaufzeit von 1 Tag:
Wie bereits erwähnt, haben wir auch mit einigen anderen Basismodellen experimentiert, z. B. dem einzelnen LSTM-Seq2seq-Modell, LightGBM, LSTM ohne Aufmerksamkeitsmechanismus usw. Wir haben die Ergebnisse für Nicht-Aufmerksamkeitsmechanismus-Modelle weggelassen, da der Aufmerksamkeitsmechanismus erheblich zur Verbesserung der Prognosegenauigkeit beitrug.
Deshalb haben wir zwei Optimierer verglichen: Adam und AdamWeinzelnes LSTM Seq2seq-Modell mit Luong-Aufmerksamkeit und bidirektionales LSTM Seq2seq-Modell mit Luong-Aufmerksamkeit und schließlich LightGBM-Modell.
Hier sind die MAE-, RMSE- und R2-Ergebnisse:
Es gibt kein einzelnes bestes Modell, aber Bidirektionales LSTM (Adam-Optimierer) mit Luong-Aufmerksamkeitsmechanismus, Das Modell, das wir oben durchgehen, scheint sowohl im RMSE als auch im R2 die beste Leistung zu erbringen und im MAE-Rating ungefähr das zweitbeste zu sein (Niederlage gegen Bidirektional-LSTM (AdamW-Optimierer)). Vielleicht wäre eine strengere Hyperparametersuche nach Lernrate und Gewichtsabfall für den AdamW-Optimierer nützlicher.
Ich hoffe, dieser Artikel vermittelt Ihnen ein gewisses Verständnis für den Prozess der Klimavorhersage.