Detecting Poor Sleep: Anomaly Detection in Health Data with Python & Scikit-learn
A practical guide to analyzing time-series sleep data from trackers. Learn to clean data, engineer features, and apply the Isolation Forest algorithm to find unusual patterns indicating poor sleep quality.
Auf dieser Seite
Sind Sie schon einmal müde aufgewacht, trotz einer vollständigen Nachtruhe? Der Schlüssel zum Verständnis, warum dies geschieht, könnte in den Daten Ihres Schlaftrackers verborgen sein. Tragbare Geräte liefern eine Fülle von Informationen wie Herzfrequenz und Bewegung, die Einblicke in Ihre Schlafqualität ermöglichen können. In diesem Tutorial werden wir untersuchen, wie Sie Python und die leistungsstarke Scikit-learn-Bibliothek verwenden können, um eine Anomalieerkennung auf Schlafdaten durchzuführen. Durch die Identifizierung ungewöhnlicher Muster können wir Nächte mit schlechtem Schlaf aufdecken und beginnen, die Faktoren zu verstehen, die unsere Erholung beeinträchtigen könnten.
Wir werden mit einem realen, quelloffenen Datensatz mit Schlafinformationen arbeiten, um dies zu einer praktischen, praxisorientierten Erfahrung zu machen. Dies ist ein großartiges Projekt für alle, die sich für Datenwissenschaft, maschinelles Lernen und Gesundheitstechnologie interessieren. Egal, ob Sie ein erfahrener Entwickler sind oder gerade erst anfangen – Sie werden mit einem funktionalen Verständnis davon herausgehen, wie Sie Zeitreihendaten analysieren können, und einem coolen Projekt für Ihr Portfolio.
Voraussetzungen:
- Grundlegendes Verständnis von Python und pandas.
- Vertrautheit mit Konzepten des maschinellen Lernens.
- Python 3.x, pandas, Scikit-learn und Matplotlib installiert.
Das Problem verstehen
Schlaf ist ein komplexer physiologischer Prozess, und was eine „gute" Nachtruhe ausmacht, kann variieren. Signifikante Abweichungen von Ihren normalen Schlafmustern können jedoch ein Zeichen für zugrundeliegende Probleme sein. Diese Abweichungen oder Anomalien könnten plötzliche Herzfrequenzspitzen, übermäßige Bewegungen oder ungewöhnliche Schlafphasenübergänge sein.
Die Erkennung dieser Anomalien kann aufgrund der Beschaffenheit von Zeitreihendaten eine Herausforderung darstellen. Schlafdaten sind sequentiell, und die Reihenfolge der Ereignisse ist wichtig. Wir benötigen eine Methode, die den „Ausreißer" im Kontext Ihrer typischen Schlafmuster identifizieren kann. Hier kommen unüberwachte Algorithmen zur Anomalieerkennung wie Isolation Forest ins Spiel.
Voraussetzungen
Bevor wir beginnen, stellen Sie sicher, dass die erforderlichen Bibliotheken installiert sind. Sie können dies mit einem einzigen pip-Befehl tun:
pip install pandas scikit-learn matplotlib
Wir werden einen quelloffenen Datensatz von PhysioNet verwenden, der Schlafdaten von einer Apple Watch enthält, einschließlich Herzfrequenz und Bewegung. Für die Zwecke dieses Tutorials verwenden wir eine vereinfachte, vorverarbeitete Version dieser Daten.
Schritt 1: Daten laden und bereinigen
Zuerst laden wir unsere Schlafdaten und bereiten sie für die Analyse vor. Reale Daten sind oft unordentlich, daher ist die Datenbereinigung ein entscheidender erster Schritt.
Was wir tun
Wir laden die Schlafdaten aus einer CSV-Datei in einen pandas DataFrame, prüfen sie auf fehlende Werte und konvertieren die Zeitstempelspalte in ein datetime-Objekt für eine einfachere Bearbeitung.
Implementierung
# src/data_preprocessing.py
import pandas as pd
# Datensatz laden
try:
df = pd.read_csv('sleep_data.csv')
except FileNotFoundError:
print("Fehler: 'sleep_data.csv' nicht gefunden. Bitte stellen Sie sicher, dass der Datensatz im richtigen Verzeichnis ist.")
exit()
# Die ersten Zeilen anzeigen
print("Ursprüngliche Daten:")
print(df.head())
# --- Datenbereinigung ---
# Fehlende Werte prüfen
print("\
Fehlende Werte vor der Bereinigung:")
print(df.isnull().sum())
# Fehlende Werte behandeln (z.B. Forward Fill)
df.ffill(inplace=True)
# Zeitstempel in datetime-Objekte konvertieren
df['timestamp'] = pd.to_datetime(df['timestamp'])
# Zeitstempel als Index setzen
df.set_index('timestamp', inplace=True)
print("\
Bereinigte Daten:")
print(df.head())
print(f"\
Datenform nach der Bereinigung: {df.shape}")
So funktioniert es
Wir beginnen mit dem Import der pandas-Bibliothek, einem Standardwerkzeug für Datenmanipulation in Python. Wir laden unsere sleep_data.csv-Datei in einen DataFrame. Dann prüfen wir auf fehlende Werte, die unsere Analyse stören könnten. Eine einfache Möglichkeit, damit umzugehen, ist die Verwendung von ffill(), das die letzte gültige Beobachtung vorwärts fortschreibt. Schließlich konvertieren wir die timestamp-Spalte in ein echtes datetime-Objekt und setzen sie als Index unseres DataFrames, was für die Zeitreihenanalyse unerlässlich ist.
Häufige Fallstricke
- Falscher Dateipfad: Stellen Sie sicher, dass sich Ihre CSV-Datei im selben Verzeichnis wie Ihr Skript befindet, oder geben Sie den korrekten Pfad an.
- Verschiedene Datenprobleme: Seien Sie auf andere Datenqualitätsprobleme wie Duplikate oder falsche Datentypen vorbereitet, die möglicherweise zusätzliche Bereinigungsschritte erfordern.
Schritt 2: Merkmalskonstruktion
Nun, da unsere Daten bereinigt sind, müssen wir Merkmale erstellen, die unserem Modell zur Anomalieerkennung helfen, ungewöhnliche Muster zu identifizieren. Dieser Prozess wird als Merkmalskonstruktion bezeichnet und ist ein entscheidender Teil jedes maschinellen Lernprojekts.
Was wir tun
Wir werden neue Merkmale aus unseren vorhandenen Daten erstellen, wie gleitende Mittelwerte und Standardabweichungen der Herzfrequenz und Bewegung. Diese werden dem Modell helfen, den Kontext jedes Datenpunkts zu verstehen.
Implementierung
# src/feature_engineering.py
import pandas as pd
# (Annahme: df ist unser bereinigter DataFrame aus dem vorherigen Schritt)
# Für ein eigenständiges Skript würden Sie die Daten zuerst neu laden und bereinigen.
# --- Merkmalskonstruktion ---
# Gleitende Statistiken berechnen
window_size = 10 # 10-Minuten-Fenster
df['heart_rate_rolling_mean'] = df['heart_rate'].rolling(window=window_size).mean()
df['heart_rate_rolling_std'] = df['heart_rate'].rolling(window=window_size).std()
df['movement_rolling_mean'] = df['movement'].rolling(window=window_size).mean()
# Zeilen mit NaN-Werten aus dem gleitenden Fenster entfernen
df.dropna(inplace=True)
print("\
Daten mit neuen Merkmalen:")
print(df.head())
So funktioniert es
Wir erstellen neue Merkmale, die den recenten Trend und die Volatilität der Herzfrequenz- und Bewegungsdaten erfassen. Ein gleitender Mittelwert liefert eine geglättete Version der Zeitreihe, während die Standardabweichung uns ein Gefühl dafür gibt, wie stark die Daten schwanken. Ein 10-Minuten-Fenster ist ein guter Ausgangspunkt, aber Sie können mit unterschiedlichen Größen experimentieren. Nach dem Erstellen dieser neuen Merkmale entfernen wir alle Zeilen mit NaN-Werten, die durch die anfänglichen Berechnungen des gleitenden Fensters entstanden sind.
Häufige Fallstricke
- Auswahl der richtigen Fenstergröße: Die Fenstergröße kann Ihre Ergebnisse erheblich beeinflussen. Ein kleines Fenster könnte zu empfindlich auf Rauschen reagieren, während ein großes Fenster wichtige Muster glätten könnte. Es ist oft eine gute Idee, mit verschiedenen Fenstergrößen zu experimentieren.
Schritt 3: Anomalieerkennung mit Isolation Forest
Mit unseren Merkmalen bereit ist es Zeit, den Isolation Forest-Algorithmus anzuwenden. Dies ist ein unüberwachtes Lernverfahren, das besonders effektiv für die Anomalieerkennung ist.
Was wir tun
Wir trainieren ein Isolation Forest-Modell auf unseren konstruierten Merkmalen. Das Modell sagt dann voraus, welche Datenpunkte Anomalien sind.
Implementierung
# src/anomaly_detection.py
from sklearn.ensemble import IsolationForest
import numpy as np
# (Annahme: df ist unser DataFrame mit konstruierten Merkmalen)
# --- Anomalieerkennung ---
# Merkmale für das Modell auswählen
features = ['heart_rate', 'movement', 'heart_rate_rolling_mean', 'heart_rate_rolling_std', 'movement_rolling_mean']
X = df[features]
# Isolation Forest-Modell initialisieren und anpassen
model = IsolationForest(n_estimators=100, contamination='auto', random_state=42)
model.fit(X)
# Anomalien vorhersagen (-1 für Anomalien, 1 für Normalwerte)
df['anomaly'] = model.predict(X)
# Anomalie-Scores abrufen
df['anomaly_score'] = model.decision_function(X)
print("\
Daten mit Anomalie-Vorhersagen:")
print(df.head())
# Die Anomalien anzeigen
anomalies = df[df['anomaly'] == -1]
print("\
Erkannte Anomalien:")
print(anomalies)
So funktioniert es
Isolation Forest funktioniert, indem zufällig ein Merkmal ausgewählt und dann ein zufälliger Split-Wert für dieses Merkmal gewählt wird. Die Idee ist, dass Anomalien „wenige und anders" sind, daher lassen sie sich leichter vom Rest der Daten „isolieren". Der contamination-Parameter teilt dem Modell den erwarteten Anteil von Ausreißern im Datensatz mit. Durch die Einstellung auf 'auto' überlassen wir dem Algorithmus die Entscheidung über den Schwellenwert. Die predict()-Methode des Modells gibt -1 für Anomalien und 1 für normale Datenpunkte zurück.
Häufige Fallstricke
- Auswahl des
contamination-Werts: Dies kann knifflig sein. Wenn Sie Domänenwissen darüber haben, wie oft Anomalien auftreten, können Sie ihn auf einen bestimmten Wert setzen. Andernfalls ist'auto'eine vernünftige Wahl.
Alles zusammenführen: Visualisierung
Nun, da wir die Anomalien identifiziert haben, visualisieren wir sie, um ein besseres Verständnis dessen zu bekommen, was in diesen Nächten mit schlechtem Schlaf passiert.
Was wir tun
Wir verwenden Matplotlib, um ein Diagramm zu erstellen, das die Herzfrequenz über die Zeit zeigt, wobei die erkannten Anomalien hervorgehoben werden.
Implementierung
# src/visualization.py
import matplotlib.pyplot as plt
import seaborn as sns
# (Annahme: df ist unser DataFrame mit Anomalie-Vorhersagen)
# --- Visualisierung ---
plt.style.use('seaborn-v0_8-whitegrid')
fig, ax = plt.subplots(figsize=(15, 6))
# Normale Herzfrequenzdaten plotten
ax.plot(df.index, df['heart_rate'], color='blue', label='Normale Herzfrequenz')
# Anomalien hervorheben
ax.scatter(anomalies.index, anomalies['heart_rate'], color='red', label='Anomalie', s=50)
ax.set_title('Schlaf-Herzfrequenz mit Anomalieerkennung')
ax.set_xlabel('Zeit')
ax.set_ylabel('Herzfrequenz (bpm)')
ax.legend()
plt.show()
So funktioniert es
Dieser Code erstellt ein Zeitreihendiagramm der Herzfrequenz. Die normalen Datenpunkte werden als blaue Linie angezeigt, und die erkannten Anomalien sind als rote Punkte hervorgehoben. Diese Visualisierung macht es einfach zu sehen, wann die ungewöhnlichen Herzfrequenzereignisse während der Nacht auftraten.
Fazit
In diesem Tutorial sind wir durch den Prozess der Erkennung von Anomalien in Schlafdaten mit Python und Scikit-learn gegangen. Wir begannen mit Rohdaten, bereinigten sie, konstruierten neue Merkmale und wandten den Isolation Forest-Algorithmus an, um ungewöhnliche Muster zu identifizieren. Durch die Visualisierung der Ergebnisse können wir deutlich die Momente während des Schlafs sehen, die auf eine schlechte Erholung hindeuten könnten.
Dies ist erst der Anfang dessen, was Sie mit Schlafdaten tun können. Sie könnten andere Algorithmen zur Anomalieerkennung erkunden, mehr Datenquellen einbeziehen (wie Schlafphasen) oder sogar ein Dashboard erstellen, um Ihre Schlafqualität im Zeitverlauf zu verfolgen.
Ressourcen
- Scikit-learn's Isolation Forest-Dokumentation: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html
- PhysioNet - Apple Watch Sleep Data: https://physionet.org/content/sleep-accel/1.0.0/
- Ein tiefer Einblick in den Isolation Forest-Algorithmus: https://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf
Kurzreferenz
| Aspekt | Wichtige Informationen |
|---|---|
| Thema | Entwicklung |
| Relevanz | Patientenaufklärung und Bewusstsein |
| Maßnahme | Besprechen Sie dies mit Ihrem Arzt |
| Häufigkeit | Wie von Ihrem Behandlungsteam empfohlen |
| Evidenz | Basierend auf aktuellen klinischen Richtlinien |
Häufig gestellte Fragen
F: Woher weiß ich, ob dies auf mich zutrifft? A: Besprechen Sie Ihre persönliche und familiäre Krankengeschichte mit Ihrem Arzt, um Ihre individuellen Risikofaktoren einzuschätzen und geeignete nächste Schritte zu bestimmen.
F: Was sollte ich meinen Arzt fragen? A: Gute Fragen sind unter anderem: „Was bedeuten meine Ergebnisse?", „Was sind meine Optionen?", „Welche Änderungen des Lebensstils würden helfen?" und „Wann sollte ich nachuntersuchen?"
F: Gibt es Änderungen des Lebensstils, die helfen können? A: Die meisten Erkrankungen profitieren von grundlegenden Maßnahmen: ausgewogene Ernährung, regelmäßige körperliche Aktivität (150+ Minuten/Woche), erholsamer Schlaf (7-9 Stunden), Stressbewältigung und Vermeidung von Tabak.
Medizinischer Haftungsausschluss
Dieser Artikel dient ausschließlich zu Bildungszwecken und stellt keine medizinische Beratung dar. Konsultieren Sie immer einen qualifizierten Gesundheitsdienstleister, bevor Sie Entscheidungen über Ihre Gesundheit, Behandlung oder Pflege treffen. Individuelle Umstände variieren, und was für eine Person angemessen ist, ist möglicherweise nicht für eine andere geeignet.
Wenn Sie einen medizinischen Notfall erleben, rufen Sie sofort 911 (oder Ihre lokale Notrufnummer) an.