Ich habe vor Kurzem das Open-Data-Portal der Stadt München entdeckt. Dort kann man z.B. Statistiken zum Oktoberfest oder die Standorte von WLAN-Hotspots in München finden.

Besonders interessant fand ich, dass das Radverkehrsaufkommen an sechs Standorten mit sogenannten Raddauerzählstellen erfasst wird. „Aufs Radl – Fertig? – Los!“ Ergebnisse der Raddauerzählstellen in München 2017 und 2018 (PDF) gibt einen detaillierten Einblick und Analyse der Daten.

Mir kam beim Betrachten der Daten folgende Frage in den Sinn:

Kann man auf Grundlage der Daten mit Hilfe von Machine Learning vorhersagen wieviele Radfahrer an einem bestimmten Tag unterwegs sein werden?

Hinweis: Code mit detaillierten Anmerkungen gibt es im zugehörigen Jupyter Notebook: https://github.com/PixelGmbH/radzaehldaten-munich-ml/blob/master/Predicting%20Bike%20count%20in%20Munich.ipynb

Die Daten

Zunächst schaute ich mir die Daten genauer an. Über die API des OpenDataPortals kann man sich die Daten für jeden Monat ab dem Jahr 2017 als csv files herunterladen. Pro Monat gibt es zwei Dateien. Einmal die Werte in 15 Minuten Abständen und einmal Tageswerte. Die Liste mit den Tageswerten enthält zusätzlich noch Wetterinformationen z.B. Min- & Max-Temperatur für den Tag.

Ich entschied mich mit den Tageswerten zu arbeiten und schaute mit nur die Daten von der Zählstelle Arnulfstraße an. Eine Datenreihe sieht z.B. so aus:

| datum      | uhrzeit_start | uhrzeit_ende | zaelstelle | richtung_1 | richtung_2 | gesamt | min-temp | max-temp | niederschlag | bewoelkung | sonnenstunden |
|------------|---------------|--------------|------------|------------|------------|--------|----------|----------|--------------|------------|---------------|
| 2020.10.05 | 00:00         | 23.59        | Arnulf     | 1048       | 63         | 1111   | 9.0      | 14.6     | 4.7          | 98         | 1.8           |

Die Zählwerte findet man in den Spalten richtung_1, richtung_2 und gesamt. gesamt ist die Summe der beiden Richtungsspalten.

Diesen gesamt Wert soll mein Modell nun vorhersagen und zwar auf Grundlage aller anderen Spalten (ausgenommen natürlich richtung1 und richtung2). D.h. auf Grundlage des Datums, der min- max-Temperatur, etc. soll das Programm entscheiden wieviele Fahrradfahrer an der Zählstelle Arnulfstraße zu erwarten sind. Diese Entscheidung ist nicht durch einen Algorithmus definiert, den ich mir ausgedacht habe, sondern soll mit Hilfe von Machine Learning vom Modell auf Grundlage der bestehenden Daten selbst erlernt werden.

Dazu habe ich Daten in ein Trainingsdatensatz (Jahr 2017 & Jahr 2018) und einen Validierungsdatensatz (Jahr 2019) unterteilt. Mit den Trainingsdaten wird das Modell trainiert. Mit diesen Daten lernt es also und extrahiert daraus die Logik die seine Vorhersage ausmachen.

Mit den Validierungsdaten wird überprüft wie gut das Modell funktioniert. Für die Validierung nimmt man andere Daten, um sicherzustellen, dass das Modell nicht einfach die Trainingsdaten "auswendig" lernt.

RandomForest

Bei meinem ersten Ansatz verwendete ich einen RandomForest. In kurz ist ein RandomForest eine Kombination aus verschiedenen Entscheidungsbäumen. Ein einfacher RandomForest mit 3 Entscheidungsbäumen sieht z.B. so aus:

RandomForest mit 3 Entscheidungsbäumen und 4 Blattknoten
RandomForest mit 3 Entscheidungsbäumen und 4 Blattknoten

In diesem einfachen Beispiel gibt es nur 4 Ergebnisklassen, aber man sieht sehr schön wie die Vorhersage zustande kommt. Zuerst wird auf Grundlage der maximalen Temperatur unterteilt, im zweiten Schritt zwischen Wochentag und Wochenende.

Mit einem größeren RandomForest (40 Bäumen) kam ich auf einen Mittleren Absoluten Fehler (MAE) von ~210 und einem Mittleren Absoluten Percentage Error (MAPE) von 32%. D.h. Im Durchschnitt liegt die Vorhersage 32% daneben. Das ist eine Menge aber für einen ersten Versuch nicht schlecht.

Der RandomForest erlaubt es einem sehr schön seine Entscheidung nachzuvollziehen und somit das Datenset besser zu verstehen. Man kann sich z.B. anschauen welche Features, also Merkmale, am wichtigesten bei der Vorhersage sind:

Wichtigste Feature im RandomForest
Wichtigste Feature im RandomForest

Dass die maximale Temperatur & der Wochentag wichtig sind erscheint mir logisch. Andere Merkmale haben dagegen gar keinen Einfluss. z.B. zaehlstelle, uhrzeit_ende sind Werte die immer gleich sind. Diese kann man also ohne Bedenken weglassen und das Datenset schlanker machen.

Wenn man sich anschaut an welchen Tagen die größten Fehler auftreten, sieht man dass 8 der größten Fehler an Feiertagen auftreten. Aus diesem Grund erweiterte ich das Datenset um die Spalten ist_feiertag und ist_ferientag.

Neuronales Netz

Als zweiten Ansatz verwendete ich ein Neuronales Netz. Dabei verwendete ich den Tabular Learner ohne Anpassungen von fastai, einfach mal um auszuprobieren was generell möglich ist. Die Informationen über wichtige Features die ich bereits gelernt hatte wendete ich hier gleich an. D.h. ich trainierte das Neuronale Netz nur mit den relevantesten Spalten.

Das Neuronal Netz hat den Vorteil auch Werte außerhalb des Wertebereiches des Trainingssets vorherzusagen zu können, dass kann ein RandomForest z.B. nicht.

Das Neuronale Netz kam auf einen MAE von ~183 und einen MAPE von ~27%. Also bessere Werte als der RandomForest. Allerdings braucht es länger zum Trainieren und es ist nicht so einfach nachzuvollziehen warum und wie ein gewisser Wert entstanden ist.

Fazit

Zurück zur Frage vom Anfang:

Kann man auf Grundlage der Daten mit Hilfe von Machine Learning vorhersagen wieviele Radfahrer an einem bestimmten Tag unterwegs sein werden?

Generell hoffe ich gezeigt zu haben, dass das möglich ist. Die Fehler sind natürlich noch recht hoch, aber für einen ersten Versuch bin ich zufrieden.

Ob die Ergebnisse im realen Leben hilfreich sind, kann ich nicht einschätzen. Ich bin kein Verkehrsplaner. Man müsste die Ergebnisse mal mit anderen Methoden, die in der Verkehrsplanung eingesetzt werden, vergleichen. Ich könnte mir Vorstellen, dass man mit so einem Ansatz z.B. Lücken in Messdaten schließen könnte z.B. fehlen im Jahr 2019 ~2 Monate. Persönlich habe ich eine Menge über Radfahren in München gelernt, am Interessantesten fand ich, dass der wichtigste Aspekt nicht das Wetter ist, sondern der Pendelverkehr unter der Woche. Das hatte ich anders vermutet.

Aus Machine Learning Entwickler Perspektive ist glaub ich ein schönes Beispiel entstanden, dass zeigt wie man erstmal einfache Basismodelle erstellt, die man dann als Vergleichsgrundlage für zukünftige Modelloptimierungen verwenden kann. Als nächste Schritte könnte ich mir vorstellen die Daten zu Erweitern (Brückentage, lange Wochenende, andere Wetterdaten), sich nicht nur eine Zählstelle sondern alle Zählstellen anzuschauen, das Neuronale Netz bewusst zu optimieren und dessen Architektur anzupassen.

Den Code und alle Details findet ihr im Jupyter Notebook auf github.

Ich freue mich mich über Fragen, Anmerkungen oder Fehlermeldung per Email.