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:
Variable | Einheit |
Windgeschwindigkeit | Meter pro Sekunde (m/s) |
Luftdruck | Hektopascal (hPa) |
Temperatur | Grad Celsius (°C) |
Luftfeuchtigkeit | Prozent (%) |
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:
Variable | Physikalischer Zusammenhang | Kausalität |
---|---|---|
Luftdruck | Direkter physikalischer Zusammenhang, Druckabfall typisch vor Sturm | Direkt kausal |
Windgeschwindigkeit | Windzunahme ist physikalisch notwendig und kausal für Sturm | Direkt kausal |
Temperatur | Abfall der Temperatur ist ein unterstützender Indikator (kalte Luftströmung vor Sturm) | Unterstützend kausal |
Luftfeuchtigkeit | Hohe Luftfeuchtigkeit begünstigt starke Niederschläge und Sturmentwicklung | Unterstützend kausal |
Stadt | Unterschiedliche Klimazonen beeinflussen Wahrscheinlichkeit | Klimatische Differenzierung |
Darüber hinaus brauchen wir realistische physikalische Bedingungen (Vorzeichenprüfung):
Variable | Vorzeichen und Bedingung | Erklärung |
Windgeschwindigkeit | positiv (steigend) | Zunahme signalisiert aufziehenden Sturm |
Luftdruck | negativ (fallend) | Abfall zeigt Tiefdruckgebiet, typisch für Sturm |
Temperatur | negativ (fallend) | Kalte Luft strömt ein, Vorzeichen für Unwetter |
Luftfeuchtigkeit | hoch (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:
Eingang | Ausgang |
Sturmwarnung | |
Windgeschwindigkeit | |
Luftfeuchtigkeit | |
Luftdruck | |
Temperatur | |
Stadt |

Jetzt haben wir:
Koeffizient | Interpretation |
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ürme | Wahrscheinlichkeiten für Stürme |
Immer reproduzierbar | Erkennt neue Muster |
Gut für historische Analysen | Gut für zukünftige Vorhersagen |
Manuell anpassbar | Lernt aus neuen Daten |