Programming lesson
Herzinfarkt-Vorhersage mit Logistischer Regression und Matplotlib: Ein datengetriebener Leitfaden
Lerne, wie du mit Python, Matplotlib und Logistischer Regression einen Herzinfarkt-Vorhersage-Klassifikator baust. Inklusive explorativer Datenanalyse (EDA), Feature-Auswahl und Modellbewertung.
Einleitung: Warum Herzinfarkt-Vorhersage? Ein aktuelles Beispiel
Stell dir vor, du entwickelst eine App, die basierend auf Gesundheitsdaten das Risiko eines Herzinfarkts vorhersagt – ähnlich wie KI-Modelle in der heutigen Medtech-Branche eingesetzt werden. Im Juni 2026 nutzen Startups wie „CardioAI“ solche Algorithmen, um personalisierte Gesundheitswarnungen zu geben. In diesem Tutorial lernst du, wie du mit dem bekannten Heart-Disease-Datensatz (76 Attribute, reduziert auf 14) einen Logistischen-Regression-Klassifikator baust, um Herzinfarkt-Risiken vorherzusagen. Du wirst matplotlib für die explorative Datenanalyse (EDA) nutzen, Features auswählen und die Modellleistung mit Metriken wie Precision, Recall und F1-Score bewerten.
Schritt 1: Daten verstehen und visualisieren mit Matplotlib
Bevor du ein Modell trainierst, musst du deine Daten kennen. Der Datensatz enthält 13 numerische Merkmale (z. B. Alter, Cholesterin, maximaler Puls) plus die Zielvariable (0 = geringes Risiko, 1 = hohes Risiko). Deine Aufgabe ist es, „so viele Plots wie möglich“ zu erstellen, um Muster zu erkennen. Konzentriere dich auf die Trennbarkeit der Klassen – ähnlich wie bei einer linearen Entscheidungsgrenze in der Vorlesung.
1.1 Verteilungen einzelner Features
Beginne mit Histogrammen für jedes numerische Feature, getrennt nach Zielklasse. Nutze matplotlib.pyplot.hist mit alpha=0.5, um Überlappungen zu sehen. Zum Beispiel zeigt das Histogramm von „maximaler Herzfrequenz“ oft, dass Personen mit hohem Risiko (target=1) tendenziell eine niedrigere maximale Herzfrequenz haben. Das ist ein erster Hinweis auf ein nützliches Feature.
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv('heart.csv')
plt.figure(figsize=(10,6))
plt.hist(df[df['target']==0]['thalach'], alpha=0.5, label='kein Risiko')
plt.hist(df[df['target']==1]['thalach'], alpha=0.5, label='Risiko')
plt.xlabel('maximale Herzfrequenz')
plt.ylabel('Häufigkeit')
plt.legend()
plt.show()Wiederhole dies für Alter, Cholesterin, Ruheblutdruck, etc. Du wirst feststellen, dass manche Features wie „oldpeak“ (ST-Strecken-Senkung) eine bessere Trennung zeigen als andere.
1.2 Streudiagramme für Feature-Paare
Erstelle Scatter-Plots mit verschiedenen Farben für die Zielklassen. Nutze plt.scatter mit c=df['target']. Ein gutes Paar ist „maximale Herzfrequenz“ vs. „oldpeak“. Du siehst oft, dass sich die Punkte der beiden Klassen überlappen, aber eine diagonale Linie könnte sie teilweise trennen – das deutet auf lineare Trennbarkeit hin.
plt.scatter(df['thalach'], df['oldpeak'], c=df['target'], cmap='bwr', alpha=0.6)
plt.xlabel('maximale Herzfrequenz')
plt.ylabel('oldpeak')
plt.colorbar(label='Risiko')
plt.show()Probiere auch Boxplots (plt.boxplot) oder Violinplots (plt.violinplot) aus, um Ausreißer und Verteilungen zu vergleichen.
1.3 Korrelationsmatrix
Eine Heatmap der Korrelationen (plt.imshow oder sns.heatmap) zeigt, welche Features stark mit dem Ziel korrelieren. Zum Beispiel hat „cp“ (Brustschmerztyp) oft eine moderate Korrelation, während „fbs“ (Nüchternblutzucker) schwach ist.
Schritt 2: Feature-Auswahl – Eliminieren statt Selektieren
Wie in der Aufgabenstellung betont: „Eliminate attributes instead of selecting“. Entferne offensichtlich irrelevante Features wie „DoB“ (Geburtsdatum) – aber hier haben wir nur Alter. Überlege, ob „restecg“ (Ruhe-EKG) wirklich hilft? Teste es, indem du die Modelle mit und ohne Feature vergleichst. Ein praktischer Tipp: Nutze die Korrelationsmatrix, um Features mit sehr geringer Korrelation zum Ziel zu eliminieren (z. B. |r| < 0.1). Behalte aber immer eine Begründung parat, warum du ein Feature verwirfst.
Schritt 3: Datenaufteilung – 70% Training, 30% Test
Teile den Datensatz mit sklearn.model_selection.train_test_split auf. Setze random_state=42 für reproduzierbare Ergebnisse.
from sklearn.model_selection import train_test_split
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)Schritt 4: Logistische Regression implementieren
Nutze sklearn.linear_model.LogisticRegression. Da der Datensatz klein ist, verwende max_iter=1000 und solver='lbfgs'. Trainiere das Modell mit den ausgewählten Features.
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)Du kannst auch manuell eine Logistische Regression implementieren (z. B. mit Gradientenabstieg), aber sklearn ist für den Kurs empfohlen.
Schritt 5: Modellbewertung – Precision, Recall, Accuracy, F1
Berechne die Metriken mit sklearn.metrics. Erstelle eine Beobachtungstabelle wie in der Aufgabenstellung gefordert.
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
acc = accuracy_score(y_test, y_pred)
prec = precision_score(y_test, y_pred)
rec = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print(f"Accuracy: {acc:.2f}, Precision: {prec:.2f}, Recall: {rec:.2f}, F1: {f1:.2f}")Interpretiere die Ergebnisse: Eine hohe Precision bedeutet wenige falsch Positive (gesunde Person wird fälschlich als Risiko eingestuft), während ein hoher Recall wenige falsch Negative bedeutet (Risikopatient wird übersehen). Im medizinischen Kontext ist Recall oft wichtiger, da man keine Risikopatienten verpassen will.
Schritt 6: Experimentieren – Das Ziel ist Erkenntnis, nicht perfekte Genauigkeit
Probiere verschiedene Feature-Kombinationen aus. Beginne mit nur einem Feature (z. B. „oldpeak“) und füge nach und nach weitere hinzu. Notiere, wie sich die Metriken ändern. Vielleicht stellst du fest, dass „ca“ (Anzahl der Hauptgefäße) die Genauigkeit deutlich verbessert. Dokumentiere deine Beobachtungen in einem Bericht – das ist die Grundlage für deine ipynb-Datei und deine schriftliche Ausarbeitung.
Trend-Verbindung: Wie KI die Gesundheitsbranche im Jahr 2026 verändert
Im Juni 2026 nutzen Krankenhäuser wie die Charité Berlin Machine-Learning-Modelle, um Herzinfarkte vorherzusagen. Ähnlich wie in deinem Projekt werden dort Logistische Regression und Random Forests eingesetzt, um Risikopatienten frühzeitig zu identifizieren. Deine Arbeit ist also kein reiner Uni-Aufgaben, sondern ein kleiner Beitrag zu einem hochaktuellen Feld.
Zusammenfassung und nächste Schritte
Du hast gelernt, wie man mit matplotlib Daten visualisiert, relevante Features auswählt, eine Logistische Regression trainiert und die Modellleistung bewertet. Der Fokus lag auf dem Experimentieren – nicht auf der maximalen Genauigkeit. Lade dein ipynb und deinen Bericht hoch. Viel Erfolg bei deiner Abgabe!