Wer mehrere Fahrräder besitzt, kennt das lästige letzte Amtsgeschäft nach jeder Ausfahrt: In Strava manuell das richtige Rad auswählen, damit der Kilometerstand für den Kettenwechsel stimmt. Klein, nervig, aber wiederkehrend – also genau die Art von Problem, die sich hervorragend für eine kleine Machine-Learning-Spielerei eignet. Also habe ich mit Bike Selector einen Dienst gebaut, der nach jeder Fahrt automatisch errät, mit welchem meiner Räder ich unterwegs war, und das Ergebnis direkt in Strava einträgt.

Wie es funktioniert

Bike Selector hängt sich per Webhook an neue Strava-Uploads. Sobald eine Aktivität mit sport_type == "Ride" eintrifft, zieht der Dienst rund 44 Merkmale aus Anstrengung, Geschwindigkeit, Terrain, Sensordaten und Kontext (u.a. auch der Standort) und lässt einen XGBoost-Klassifikator darauf raten, welches Rad es war. Trainiert wird das Modell direkt aus der eigenen Strava-Historie – beim Start, ganz ohne eigene Datenbank. Der Refresh-Token liegt in einer Umgebungsvariable, das trainierte Modell wird im /tmp-Verzeichnis zwischengespeichert.

Ein paar Details, die den Unterschied machen:

  • Fehlende Werte werden XGBoost bewusst als NaN übergeben statt als 0 – sonst würde man dem Modell fälschlicherweise ein Signal über Ausstattungsunterschiede vorgaukeln, wo eigentlich nur ein Sensor gefehlt hat.
  • Fahrten werden nach Alter gewichtet (0.5 ** (Tage / Halbwertszeit)) und nach inverser Klassenhäufigkeit – ein Rad, das ich selten fahre, geht sonst im Training unter.
  • Aktivitäten, die der Bot selbst schon beschriftet hat, fließen nicht wieder ins Training ein. Ohne diese Regel würde sich das Modell auf seinen eigenen (potenziell falschen) Vorhersagen aufbauen.

Das Ergebnis landet als Kommentar in der Aktivitätsbeschreibung, inklusive Konfidenz je Rad:

Bike guess: Canyon Endurace 87% | Cube Nuroad 11% | Rose Commuter 2% [bike-selector]

Technisch steckt ein schlankes FastAPI-Backend dahinter, das sich mit stravalib gegen die Strava-API verbindet und sich kostenlos auf Render betreiben lässt.

Warum das mehr ist als nur Komfort

Auf den ersten Blick ist es eine Ein-Klick-Ersparnis. Der eigentliche Reiz liegt aber darin, wie viel man aus Trainingsdaten herauslesen kann, die man ohnehin schon sammelt: Reifenbreite, Übersetzung und Fahrstil unterscheiden sich zwischen einem Rennrad und einem Gravelbike genug, dass ein Klassifikator zuverlässig zwischen ihnen unterscheiden kann – ganz ohne GPS-Tracker am Rahmen oder manuelles Eintragen. Es ist ein weiteres kleines Beispiel dafür, wie sich Alltagsdaten mit wenig Aufwand in nützliche Automatisierung verwandeln lassen, ähnlich wie bei meinem Smart Home oder der Datenanalyse im Volleyball.

Den Code gibt es vollständig auf GitHub – inklusive Anleitung, um den Dienst mit den eigenen Strava-Daten und Rädern zu trainieren.