Dieses Projekt nutzt maschinelles Lernen zur Vorhersage der geschätzten Reisezeit (ETT) von Schiffen auf Basis von AIS-Daten. Ein interaktives Webinterface visualisiert die Vorhersagen und ermöglicht die Analyse der Daten.
- 📋 Voraussetzungen
- 🚀 Erste Schritte
- 💻 Benutzung
- 📖 Projektübersicht
- 📂 Projektstruktur
- 🛠️ Entwicklungsstand
- 📄 Code Dokumentation
- Docker & Docker Compose: Für die Containerisierung der Anwendung.
- Git: Zum Klonen des Repositories.
- Webbrowser: Ein moderner Browser (z.B. Chrome, Firefox).
- Python: Zur Installation von DVC.
Folgen Sie diesen Schritten, um die Anwendung zu starten.
git clone https://collaborating.tuhh.de/e16/courses/software-development/ss25/group02.git
cd group02
Dieser Schritt ist nur einmal vor dem ersten Start erforderlich.
cd frontend
npm install
cd ..
Die Anwendung wird mit Docker containerisiert. Die Startskripte versuchen, existierende Modelle vom DVC-Server herunterzuladen, und bauen anschließend die notwendigen Container.
Hinweis: Der erste Docker-Build kann 2–10 Minuten dauern. Die Erstellung der Datenreports kann je nach Hardware 5–25 Minuten in Anspruch nehmen. Die meisten Modelle benötigen (falls nicht heruntergeladen) weniger als 5 Minuten. Das SVR-Training auf dem gesamten Datensatz kann jedoch ca. 60 Minuten pro Route dauern. In diesem Fall sollte SVR_TRAIN_SIZE
in compose.yaml auf < 50000
gesetzt werden.
./start.sh
Stellen Sie sicher, dass Docker Desktop im Hintergrund läuft. Führen Sie dann den Befehl in der PowerShell aus:
./start.ps1
Nach dem Start ist die Webanwendung unter http://localhost:8080
verfügbar.
Eine Übersicht der Original-, bereinigten und Vergleichsdaten finden Sie über die Menüleiste der Webanwendung oder direkt im Ordner storage/reports/
.
Über die Kacheln auf der Startseite können Sie zu den verschiedenen Datenreports navigieren:
- Original-Daten: Zeigt relevante Informationen zu den ursprünglichen AIS-Datensätzen.
- Bereinigte Daten: Zeigt relevante Informationen zu den bereinigten Datensätzen.
- Vergleichsansicht: Stellt die Original- und bereinigten Daten gegenüber.
Die Team-Dokumentation und weitere Berichte befinden sich im Ordner documentation
. Da es sich um Confluence-Exporte handelt, können Formatierungsfehler auftreten.
Um eine Vorhersage zu treffen, laden Sie eine CSV-Datei mit einem AIS-Datensatz über die Dropzone auf der Startseite hoch. Nach dem Upload stehen die Vorhersage sowie Visualisierungen von Statistiken und Karten zur Verfügung.
Häfen weltweit benötigen für die Optimierung ihrer Abläufe möglichst genaue Ankunftszeiten. Die Ermittlung dieser Zeiten ist mit herkömmlichen Methoden schwierig, da unvorhersehbare Ereignisse die Reisen beeinflussen können. Daher wird ein Werkzeug benötigt, das auf Basis historischer AIS-Daten zuverlässig eine ETT vorhersagen kann.
Unser Lösungsansatz:
- Datenbereinigung (
backend/utils/dataclean.py
): Korrektur von fehlenden/invaliden Werten in den AIS-Datensätzen (Typkonvertierung, Duplikate, Ausreißer via IsolationForests). - Feature Engineering (
backend/utils/features.py
): Hinzufügen zusätzlicher Merkmale zur Anreicherung der Daten. - Machine Learning Training (
backend/utils/models.py
): Implementierung von fünf verschiedenen ML-Algorithmen (u.a. Random Forest, Gradient Boosting, SVR), um deren jeweilige Stärken zu nutzen. - Modell-Evaluation (
backend/utils/evaluate.py
): Bewertung der Modelle mithilfe von Metriken wie MAE und R², um die Genauigkeit zu ermitteln. - Ensemble-Vorhersage: Gewichtung der Modelle anhand ihrer Genauigkeit, um eine robuste ETT-Schätzung zu erstellen.
- Nutzeroberfläche: Ein Webinterface ermöglicht den Upload von AIS-Daten (CSV), die Anzeige der Vorhersagen und eine interaktive Karte zur Visualisierung der Schiffsreise.
.
├── .dvc/ # DVC-Konfigurationen (Data Version Control)
├── .vscode/ # VSCode-Konfiguration (Debugger)
├── backend/ # FastAPI-Backend für ML-Vorhersagen
│ └── Dockerfile # Dockerfile für das Backend
├── frontend/ # React-Frontend-Anwendung
│ └── Dockerfile # Dockerfile für das Frontend
├── storage/ # DVC-getrackte Daten und Modell-Artefakte
├── documentation/ # Projektdokumentation (aus Confluence)
├── compose.yaml # Docker-Compose-Konfiguration
├── start.sh # Startskript für Linux/macOS
└── start.ps1 # Startskript für Windows
✅ Datenpipeline zur Einlesung und Verarbeitung von AIS-Rohdaten.
✅ Algorithmen zur Datenbereinigung und Feature-Erstellung.
✅ Web-Interface (via Nginx) zur Anzeige der Datenreports.
✅ Docker-Container für das Deployment der Anwendung.
✅ Machine-Learning-Modelle für Training und Vorhersage (inkl. Ensembling).
✅ Caching zur Optimierung von rechenintensiven Schritten.
✅ API zur Erstellung von Vorhersagen.
✅ Web-Interface zur Visualisierung der Vorhersagen.
- Code-Refactoring (globale Variablen vereinheitlichen, Logging standardisieren, Routen modularisieren).
- Test-Suite aktualisieren und erweitern.
- Erweiterte Analyseoptionen im Web-Interface (z.B. Visualisierung der Modellgenauigkeit).
- Anzeige historischer Durchschnitts-ETTs für Schiffstypen und Routen.
- Funktionale CI-Tests konfigurieren (GitLab CI/CD).
- Secret-Management für API- & DVC-SSH-Schlüssel implementieren.
Das Projekt besteht aus zwei Hauptkomponenten:
backend/
: Ein Python-Programm, das eine FastAPI-Schnittstelle für Vorhersagen bereitstellt.frontend/
: Eine React-Anwendung, die es ermöglicht, CSV-Dateien an das Backend zu senden und die Ergebnisse darzustellen.
Beide Komponenten sind für OS-unabhängigkeit containerisiert. Zeitaufwändige Aufgaben wie das Modelltraining werden durch Caching (.pkl
-Dateien) beschleunigt.
Diese Artefakte werden mit DVC versioniert und im Ordner storage/artefacts/
gespeichert.
- Git: Versionskontrolle und Feature-Branching.
- Jira: Sprint-, Story- und Zeit Management.
- Docker: Containerisierung für Entwicklung und Deployment.
- DVC: Verwaltung von Daten und Modellen.
- VSCode: IDE mit integriertem Debugger.
- GitLab CI/CD: Für automatisierte Tests (Konfiguration in Arbeit).
Das System nutzt eine ML-Pipeline mit Ensemble-Methoden.
CSV-Daten → Datenbereinigung → Feature-Extraktion → ML-Features
- Datenbereinigung (
utils/dataclean.py
): Behandelt fehlende Werte und konvertiert Datentypen. - Feature Engineering (
utils/features.py
): Erstellt geografische, zeitbasierte und schiffsspezifische Merkmale, inklusive des Reisefortschritts (journey_progress
).
Das System trainiert parallel fünf verschiedene ML-Algorithmen:
- XGBoost Regressor
- Random Forest Regressor
- K-Nearest Neighbors (KNN)
- Support Vector Regression (SVR)
- Linear Regression (Baseline)
Die Ensemble-Gewichte werden durch eine Grid Search automatisch optimiert, um den Summierten Mean Absolute Error (MAE) auf den Testdaten zu minimieren.
Hierbei gibt es Gewichtungsgrenzen. (E.g 0-40% pro Modell)
# Beispiel automatisch gefundener Gewichte:
# XGBoost: 35% (beste Einzelperformance)
# Random Forest: 25% (robuste Vorhersagen)
# KNN: 20% (lokale Muster)
# SVR: 15% (non-lineare Beziehungen)
# Linear Regression: 5% (Baseline-Korrektur)
3. Training Pipeline utils/train.py
Rohdaten → Feature Engineering → Modelltraining → Ensemble → Evaluation → Speicherung
Das Training wird beim Serverstart automatisch ausgeführt.
Die Modelle werden als .pkl
-Dateien im Ordner ./storage/artefacts/
für jede Route separat gespeichert.
Die Vorhersage erfolgt in zwei Stufen:
- Gesamtfahrzeit: Das ML-Ensemble schätzt die komplette Reisezeit.
- Restfahrzeit:
Restzeit = Gesamtzeit × (1 - journey_progress)
# Beispiel-Vorhersage:
journey_progress = 0.3 # 30% der Route absolviert
total_time = 180 min # Geschätzte Gesamtfahrzeit
remaining_time = 180 × (1 - 0.3) = 126 min # Verbleibende Zeit
Endpoint | Methode | Beschreibung |
---|---|---|
/api/predict |
POST | Nimmt CSV-Daten entgegen und liefert eine ETT-Vorhersage. |
/api/retrain |
POST | Löst manuell ein erneutes Training der Modelle aus. |
/api/health |
GET | Gibt den Systemstatus der API zurück. |
Beim Serverstart werden vorhandene Modelle aus storage/artefacts/
geladen. Falls keine Modelle existieren, wird das Training automatisch gestartet.
Das Projekt nutzt Vite als Development-Server für eine React-Anwendung (mit TypeScript), die später mit NGINX gehosted wird.
Das Styling basiert auf einer Kombination aus TailwindCSS und der Komponentenbibliothek Shadcn/ui.
Die Dropzone wird mit react-dropzone
realisiert. Die hochgeladene Datei wird mittels papaparse
verarbeitet und als FormData
-Objekt über einen PredictionContext
an die Backend-API (/api/predict
) gesendet.
Im Entwicklungsmodus leitet ein in vite.config.ts
konfigurierter Proxy die API-Anfragen an das Backend weiter (http://localhost:8000
). Im Produktivbetrieb wird die Anfrage durch NGINX an den Backend-Container (http://backend:8000
) geleitet.
Die Karte wird mit Leaflet und React Leaflet umgesetzt. Die Kartengrundlage (Tiles) wird von Stadia Maps bereitgestellt. Zusätzlich wird ein Overlay mit Seekarten von OpenSeaMap eingebunden. Schiffsrouten werden als GeoJSON-Dateien visualisiert.
Sicherheitshinweis: Der für Stadia Maps benötigte API-Key ist derzeit direkt im Repository gespeichert. Dies stellt ein Sicherheitsrisiko dar und sollte in einer Produktivumgebung durch Umgebungsvariablen ersetzt werden.