Prädiktive Analyse (ML + Storm Warning, ohne KI)

Wir sind sind jetzt bei Machine Learning angelangt und werden mit Hilfe der logistischen Regression und mehreren Eingangsvariablen die Wahrscheinlichkeit für einen Sturm berechnen und durch einen Schwellenwert Sturm/nicht Sturm ermitteln.

Zuerst müssen wir uns Gedanken darüber machen, welche Daten haben wir? Wo wollen wir hin? Müssen wir Ausreißer filtern? Welche realistische Sturmbedingungen lassen sich auf unsere Daten anwenden? Stimmen unsere Voraussagen für einen Sturm physikalisch überein?

Folgende Eingangsvariablen können in die Berechung Sturm/nicht Sturm einfließen. Allergings müssen wir gleich zu Beginn ein paar Einschränkungen machen:

VariableEinheit
WindgeschwindigkeitMeter pro Sekunde (m/s)
LuftdruckHektopascal (hPa)
RegenmengeMillimeter (mm)
TemperaturGrad Celsius (°C)
Luftfeuchtigkeit Prozent (%)
WolkenbedeckungProzent (%)

An der Wolkenbedeckung sieht man schön, das eigentliche Problem des Modells und von ML: Korrelation vs. Kausalität. Korrelation bedeutet nur, dass zwei Variablen oft gemeinsam auftreten (Wolken und Sturm), aber nicht, dasss eine die andere verursacht. Nur weil es oft bewölkt ist, wenn ein Sturm erkannt wird, bedeutet das nicht, dass Bewölkung hauptursächlich den Sturm verursacht. Das Modell erkennt Muster, aber nicht den kausalen Zusammenhang. Das Modell weiß nicht, dass Wind, Druckabfall und Regen die eigentichen Indikatoren für Sturm sind – es sieht nur das gemeinsame Auftreten. Zu viele Sturmtage haben hohe Bewölkungswerte, also glaubt dass Modell, dass Wolken ein Hauptfaktor sind.

Um das Modell einfach zu halten fliegt die Wolkenbedeckung aus dem Modell heraus, ebenfalls die Regenmenge, dafür sind nicht genügend Daten (zu viele NULL-Einträge) vorhanden.

Diese Variablen bleiben im Modell:

VariablePhysikalischer ZusammenhangKausalität
LuftdruckDirekter physikalischer Zusammenhang, Druckabfall typisch vor SturmDirekt kausal
WindgeschwindigkeitWindzunahme ist physikalisch notwendig und kausal für SturmDirekt kausal
TemperaturAbfall der Temperatur ist ein unterstützender Indikator (kalte Luftströmung vor Sturm)Unterstützend kausal
LuftfeuchtigkeitHohe Luftfeuchtigkeit begünstigt starke Niederschläge und SturmentwicklungUnterstützend kausal
StadtUnterschiedliche Klimazonen beeinflussen WahrscheinlichkeitKlimatische Differenzierung

Darüber hinaus brauchen wir realistische physikalische Bedingungen (Vorzeichenprüfung):

VariableVorzeichen und BedingungErklärung
Windgeschwindigkeitpositiv (steigend)Zunahme signalisiert aufziehenden Sturm
Luftdrucknegativ (fallend)Abfall zeigt Tiefdruckgebiet, typisch für Sturm
Temperaturnegativ (fallend)Kalte Luft strömt ein, Vorzeichen für Unwetter
Luftfeuchtigkeithoch (z.B. >80%)Hohe Feuchtigkeit begünstigt Sturm

Die explizite Berücksichtigung dieser physikalischen Vorzeichen schützt vor unplausiblen Voraussagen.

Häufig sind bei Stürmen ein Temperatur- und ein Luftdruckabfall zu beobachten. Deshalb werden wir die Werte von vor einer Stunde, vor drei Stunden, vor sechs Stunden und vor 12 Stunden mit den aktuellen Werten vergleichen. Bei meiner ersten Analyse ist mir aufgefallen, dass keine vernünftige Sturmkategorien herauskamen. Der Teufel steckt wirklich im Detail. Erstmal bereinigt man die Werte kleiner -30°C und größer +50°C. Alles außerhalb dieser Grenzen ist ein Messfehler.

Schaut man sich die Werte für temp_12h_ago(19°C), temp_6h_ago (20°C), temp_3h_ago (18°C) , temp_1h_ago (16°C), temp_now (0°C), stellt man fest, dass auch diese Werte innerhalb der Toleranzgrenzen liegen. Allerdings verursacht die Differenz zwischen temp_1h_ago und temp_now einen unrealistischen Temperaturabsturz um -16°C. temp_now ist definitiv ein Messfehler und muss durch den gewichteten Erwartungswert ersetzt werden, z.B. (temp_12h_ago x 0.1) + (temp_6h_ago x 0.2) + (temp_3h_ago x 0.3) + (temp_1h_ago x 0.4) = 17,7°C.

Wir ermittelt die Differenz zwischen dem Erwartungswert und der aktuellen Temperatur. Über die Differenz, dann den Z-Index. Ist der Z-Index > 3 handelt es sich um einen Messfehler und es wird er Erwartungswert gesehen, ist der Z-Index kleiner handelt es sich um einen korrekten Messwert, dieser wird beibehalten. Das Ganze lässt sich ebenfalls auf den Lufdruck und die Windgeschwindigkeit (hier aufpassen: aufkommener Starkwind muss durchgelassen werden) anwenden.

https://metabase.roth-it-solutions.de/public/dashboard/dee33d7c-1b1f-4f05-98b4-04ac9063587b

Nachdem die Messwerte bereinigt sind, können wir uns jetzt der logistischen Regression zuwenden. Es war ein nicht unerheblicher Aufwand die Daten zu bereinigen, aber ich denke es lohnt sich die Regression nicht mit Phantasiezahlen zu füttern, sonst lernt das Modell falsche Zusammenhäge und die Zielvariable wird instabil.

Wir trainieren das Modell (Logistische Regression) mit folgenden Variablen:

EingangAusgang
WolkenSturmwarnung
Windgeschwindigkeit
Luftfeuchtigkeit
Luftdruck
Temperatur
Regen
Stadt

Jetzt haben wir:

KoeffizientInterpretation
humidity_corrected (1.566203)Hohe Luftfeuchtigkeit als stärkster Indikator für Sturm
Sibiu (0.350324) 415m, kontinentales Übergangsklima beeinflusst durch die Karpaten, gemäßigte, aber teils instabile Wetterlagen
wind_speed_diff_1h (0.140789)Logisch, starke Winde spielen eine Rolle
Traunstein (0.004671)591m, Föhneinflüsse, alpennahe Lage
temp_diff_1h (-0.153207)Leichter Einfluss, könnte mit Temperaturabfall vor Stürmen korrelieren
Laufamholz (-0.372671)309m, mäßige Sommer, kalte Winter, eher trocken, stabiles Wetter
pressure_diff_1h (-0.855113)Sinkender Luftdruck als logischer Sturm-Indikator

Hier noch eine Gegenüberstellung von SQL und ML:

SQL (harte Regeln) ML (logistische Regression)
Fixe Grenzwerte für StürmeWahrscheinlichkeiten für Stürme
Immer reproduzierbar Erkennt neue Muster
Gut für historische AnalysenGut für zukünftige Vorhersagen
Manuell anpassbarLernt aus neuen Daten

Posted in Uncategorized