Übungen: Maschinelles Lernen - Regression

Übungen zu EKI03: Klassifikation vs. Regression, Konfusionsmatrix und ihre Gütemasse (Accuracy, Precision, Recall, F-Score), Regressionsmasse (MAE, MSE, RMSE), k-fache Kreuzvalidierung und der scikit-learn-Workflow. Alle Aufgaben basieren ausschliesslich auf dem Kapitelinhalt.

Beginner

Aufgabe 1 (Beginner) - Klassifikation oder Regression?

Welche Aussage beschreibt den zentralen Unterschied zwischen Klassifikation und Regression korrekt?

a) Klassifikation braucht Trainingsdaten, Regression nicht. b) Klassifikation sagt eine Kategorie (diskret) voraus, Regression sagt eine Zahl (kontinuierlich) voraus. c) Regression ist unüberwachtes Lernen, Klassifikation ist überwachtes Lernen. d) Klassifikation sagt einen numerischen Wert voraus, Regression eine Kategorie.

Lösung anzeigen

Richtig ist b).

Beide sind Aufgaben des überwachten Lernens (supervised learning). Der Unterschied liegt allein in der Art des Ausgabewerts:

  • Klassifikation: diskrete Kategorie (z.B. Spam-Filter, Fraud-Detection).
  • Regression: kontinuierlicher / numerischer Wert (z.B. Aktienkurs-Vorhersage).

Merksatz aus den Folien: "Klassifikation sagt eine Kategorie voraus, Regression sagt eine Zahl voraus."

  • a) ist falsch - beide brauchen Trainingsdaten mit bekannten Ausgabewerten.
  • c) ist falsch - beide sind überwachtes Lernen.
  • d) verwechselt die beiden.

Falle: "Aktienkurs-Vorhersage" klingt nach Finanz-Klassifikation, ist aber Regression, weil ein numerischer Wert (Kurs) vorhergesagt wird. Frage dich immer: kommt eine Zahl oder eine Kategorie heraus?

Siehe EKI03.

Aufgabe 2 (Beginner) - Die Konfusionsmatrix beschriften

Ordne die vier Felder einer binären Konfusionsmatrix (TP, FP, FN, TN) den folgenden Situationen bei einer Krankheitsdiagnose zu und gib an, welche Felder Type I Error bzw. Type II Error heissen:

  1. Vorhersage KRANK, Person ist tatsächlich krank.
  2. Vorhersage KRANK, Person ist tatsächlich gesund.
  3. Vorhersage GESUND, Person ist tatsächlich krank.
  4. Vorhersage GESUND, Person ist tatsächlich gesund.
Lösung anzeigen
SituationFeldBezeichnung
1. KRANK vorhergesagt, ist krankTP (True Positive)korrekt als krank erkannt
2. KRANK vorhergesagt, ist gesundFP (False Positive)Type I Error
3. GESUND vorhergesagt, ist krankFN (False Negative)Type II Error
4. GESUND vorhergesagt, ist gesundTN (True Negative)korrekt als gesund erkannt

In der Konfusionsmatrix stehen die Vorhersagen in den Zeilen und der tatsächliche Zustand in den Spalten.

Tipp: Eselsbrücke - False Positive ist ein "Fehlalarm" (Type I), False Negative ist ein "Übersehen" (Type II). Die Ziffer folgt der Buchstabenreihenfolge: FP = I, FN = II.

Siehe EKI03.

Aufgabe 3 (Beginner) - Defaults von cross_val_score

Der Aufruf scores = cross_val_score(model, X, y) wird ohne weitere Argumente verwendet. Welche Standardwerte gelten laut Kapitel?

a) scoring='rmse', k = 10 b) scoring='accuracy', k = 5 c) scoring='neg_root_mean_squared_error', k = 3 d) scoring='f1', k = 5

Lösung anzeigen

Richtig ist b).

Laut Kapitel gilt als Default scoring='accuracy' und k = 5. cross_val_score führt damit eine 5-fache Kreuzvalidierung durch und scores.mean() gibt den Mittelwert der Scores aus.

Für Regression muss man das Scoring aktiv umstellen, z.B. auf scoring='neg_root_mean_squared_error' (Antwort c nennt zwar dieses Scoring, aber nicht als Default und mit falschem k).

Falle: Accuracy ist ein Klassifikationsmass. Vergisst man bei einem Regressionsproblem, scoring umzustellen, versucht scikit-learn ein unpassendes Mass anzuwenden. Für Regression scoring='neg_root_mean_squared_error' setzen.

Siehe EKI03.

Fortgeschritten

Aufgabe 4 (Fortgeschritten) - Klassifikationsmasse berechnen

Ein Klassifikator liefert auf einem Testdatensatz folgende Konfusionsmatrix:

TP=40FP=10FN=20TN=30\text{TP}=40 \qquad \text{FP}=10 \qquad \text{FN}=20 \qquad \text{TN}=30

Berechne Schritt für Schritt Accuracy, Precision, Recall und F-Score.

Lösung anzeigen

Accuracy (Treffergenauigkeit):

Accuracy=TP+TNTP+TN+FP+FN=40+3040+30+10+20=70100=0.70\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} = \frac{40 + 30}{40 + 30 + 10 + 20} = \frac{70}{100} = 0.70

Precision:

precision=TPTP+FP=4040+10=4050=0.80\text{precision} = \frac{TP}{TP + FP} = \frac{40}{40 + 10} = \frac{40}{50} = 0.80

Recall:

recall=TPTP+FN=4040+20=40600.667\text{recall} = \frac{TP}{TP + FN} = \frac{40}{40 + 20} = \frac{40}{60} \approx 0.667

F-Score (harmonisches Mittel von Precision und Recall):

F Score=2precisionrecallprecision+recall=20.800.6670.80+0.667=20.5331.4670.727F\text{ Score} = 2 \cdot \frac{\text{precision} \cdot \text{recall}}{\text{precision} + \text{recall}} = 2 \cdot \frac{0.80 \cdot 0.667}{0.80 + 0.667} = 2 \cdot \frac{0.533}{1.467} \approx 0.727

Ergebnis: Accuracy = 0.70, Precision = 0.80, Recall = 0.667, F-Score = 0.727.

Tipp: Precision und Recall teilen sich denselben Zähler TP. Precision fragt "Wie viele meiner Positiv-Vorhersagen stimmen?" (Nenner mit FP), Recall fragt "Wie viele echte Positive habe ich erwischt?" (Nenner mit FN).

Siehe EKI03.

Aufgabe 5 (Fortgeschritten) - MAE, MSE und RMSE rechnen

Ein Regressionsmodell liefert für n=4n = 4 Datenpunkte die Vorhersagen f^=(10,12,15,20)\hat{f} = (10, 12, 15, 20), die wahren Werte sind y=(12,12,18,16)y = (12, 12, 18, 16). Berechne MAE, MSE und RMSE.

Lösung anzeigen

Schritt 1 - Abweichungen f^iyi\hat{f}_i - y_i:

1012=2,1212=0,1518=3,2016=410-12 = -2,\quad 12-12 = 0,\quad 15-18 = -3,\quad 20-16 = 4

Schritt 2 - MAE (Durchschnitt der Beträge):

MAE=2+0+3+44=2+0+3+44=94=2.25MAE = \frac{|-2| + |0| + |-3| + |4|}{4} = \frac{2 + 0 + 3 + 4}{4} = \frac{9}{4} = 2.25

Schritt 3 - MSE (Durchschnitt der Quadrate):

MSE=(2)2+02+(3)2+424=4+0+9+164=294=7.25MSE = \frac{(-2)^2 + 0^2 + (-3)^2 + 4^2}{4} = \frac{4 + 0 + 9 + 16}{4} = \frac{29}{4} = 7.25

Schritt 4 - RMSE (Wurzel des MSE):

RMSE=7.252.69RMSE = \sqrt{7.25} \approx 2.69

Tipp: MSE bestraft grosse Fehler stärker (der Fehler 4 liefert 16 von 29 der Fehlersumme). RMSE zieht die Wurzel und hat dadurch dieselbe Einheit wie die Zielgrösse - deshalb ist RMSE leichter zu interpretieren als MSE.

Falle: RMSE ist NICHT der Mittelwert der Beträge. Erst quadrieren und mitteln (MSE), dann die Wurzel ziehen. RMSEMAERMSE \ge MAE gilt fast immer.

Siehe EKI03.

Aufgabe 6 (Fortgeschritten) - Wann versagt Accuracy?

Erkläre in eigenen Worten, warum die Treffergenauigkeit im Tumor-Beispiel (TP=1, FP=1, FN=8, TN=90) mit dem Wert 0.91 irreführend ist, und welcher Score in solchen Fällen stattdessen verwendet wird.

Lösung anzeigen

Die Accuracy beträgt

Accuracy=TP+TNTP+TN+FP+FN=1+90100=0.91\text{Accuracy} = \frac{TP+TN}{TP+TN+FP+FN} = \frac{1+90}{100} = 0.91

und sieht auf den ersten Blick gut aus. Der Datensatz ist aber unausgewogen (imbalanced): Es gibt nur 9 echte Kranke (TP+FN = 1+8), aber 91 Gesunde. Der hohe TN-Anteil (90) treibt die Accuracy nach oben, obwohl 8 von 9 Kranken übersehen werden (Recall = 1/9 ≈ 0.111).

Der F-Score spiegelt diese schlechte Qualität wider:

F Score=20.50.1110.5+0.1110.181F\text{ Score} = 2 \cdot \frac{0.5 \cdot 0.111}{0.5 + 0.111} \approx 0.181

Kernaussage: Bei unausgewogenen Datensätzen ist die Treffergenauigkeit irreführend. Man verwendet stattdessen den F-Score (harmonisches Mittel aus Precision und Recall), weil er nur dann hoch wird, wenn beide gut sind.

Tipp: Faustregel - je seltener die positive Klasse, desto weniger aussagekräftig die Accuracy. Ein Modell, das immer "gesund" sagt, erreicht bei 91% Gesunden schon 91% Accuracy, ohne einen einzigen Kranken zu erkennen.

Siehe EKI03.

Aufgabe 7 (Fortgeschritten) - Den scikit-learn-Workflow ordnen

Die folgenden Code-Bausteine des TMDB-Workflows sind durcheinandergeraten. Bringe sie in die korrekte Reihenfolge und benenne kurz den Zweck jedes Schritts.

A) model.fit(X, y)
B) output.to_csv('data/submission.csv', index=False)
C) train_data = pd.read_csv('data/train.csv')
D) scores = cross_val_score(model, X, y, scoring='neg_root_mean_squared_error')
E) model = SVR()
F) y = train_data["revenue"]; X = train_data[["budget"]]
G) predictions = model.predict(X_test)
Lösung anzeigen

Korrekte Reihenfolge: C - F - E - A - D - G - B

  1. C read_csv - Daten laden (Trainings-CSV in ein pd.DataFrame).
  2. F Preprocessing - Ziel y = revenue und Features X = budget extrahieren.
  3. E model = SVR() - Regressionsmodell (Support Vector Regression) erzeugen.
  4. A model.fit(X, y) - Training ("fitting") mit Merkmalen und Zielen.
  5. D cross_val_score(..., scoring='neg_root_mean_squared_error') - Validierung mit RMSE.
  6. G model.predict(X_test) - Vorhersage für den Testdatensatz.
  7. B to_csv(..., index=False) - Einreichungsdatei schreiben.
graph LR
    C["read_csv: Daten laden"] --> F["Preprocessing: X, y"]
    F --> E["model = SVR()"]
    E --> A["fit: Training"]
    A --> D["cross_val_score: RMSE"]
    D --> G["predict: Vorhersage"]
    G --> B["to_csv: submission"]

Falle: Validieren (D) kommt VOR dem finalen predict (G). Erst wenn das Modell "gut genug" ist, wird es produktiv auf den Testdatensatz angewendet.

Siehe EKI03.

Anspruchsvoll

Aufgabe 8 (Anspruchsvoll) - Imbalanced-Szenario auswerten

Ein Screening-Test für eine seltene Krankheit wird auf 1000 Personen angewendet. 20 davon sind tatsächlich krank. Das Modell liefert: TP = 5, FP = 5, FN = 15, TN = 975.

a) Berechne Accuracy und F-Score. b) Beurteile das Modell: Ist es einsatzfähig? Begründe mit den Zahlen.

Lösung anzeigen

a) Berechnungen:

Accuracy=TP+TNTP+TN+FP+FN=5+9751000=0.98\text{Accuracy} = \frac{TP+TN}{TP+TN+FP+FN} = \frac{5+975}{1000} = 0.98 precision=TPTP+FP=510=0.5recall=TPTP+FN=520=0.25\text{precision} = \frac{TP}{TP+FP} = \frac{5}{10} = 0.5 \qquad \text{recall} = \frac{TP}{TP+FN} = \frac{5}{20} = 0.25 F Score=20.50.250.5+0.25=20.1250.750.333F\text{ Score} = 2 \cdot \frac{0.5 \cdot 0.25}{0.5 + 0.25} = 2 \cdot \frac{0.125}{0.75} \approx 0.333

b) Beurteilung: Die Accuracy von 0.98 klingt exzellent, ist aber irreführend, weil der Datensatz stark unausgewogen ist (nur 20 von 1000 sind krank). Der Recall von nur 0.25 bedeutet, dass 15 von 20 Kranken übersehen werden (FN = 15). Für einen Krankheitstest ist das gefährlich. Der F-Score von 0.333 zeigt die tatsächlich schlechte Qualität deutlich besser als die Accuracy. Das Modell ist nicht einsatzfähig.

Tipp: Bei medizinischem Screening ist ein hoher Recall meist wichtiger als hohe Precision - ein übersehener Kranker (FN, Type II Error) wiegt schwerer als ein Fehlalarm (FP, Type I Error). Genau solche Abwägungen macht die reine Accuracy unsichtbar.

Siehe EKI03.

Aufgabe 9 (Anspruchsvoll) - k-fache Kreuzvalidierung erklären und rechnen

a) Erkläre in vier Schritten das Prinzip der k-fachen Kreuzvalidierung. b) Eine 5-fache Kreuzvalidierung liefert folgende RMSE-Werte pro Fold: 3.0, 3.4, 2.8, 3.2, 3.6. Bestimme das Gesamtergebnis.

Lösung anzeigen

a) Vier Schritte (k fold cross validation):

  1. Spalte den Datensatz in kk Teildatensätze (Folds) auf, z.B. k=5k = 5.
  2. Trainiere mit k1k-1 Folds und benutze 1 Fold zur Validierung.
  3. Iteriere kk-mal, jedes Mal mit einem anderen Fold als Validierungsmenge.
  4. Berechne das durchschnittliche Ergebnis über alle Iterationen.
graph TD
    D["Datensatz"] --> S["Aufteilen in k = 5 Folds"]
    S --> I1["Iter 1: Fold 1 Test -> Perf(1)"]
    S --> I2["Iter 2: Fold 2 Test -> Perf(2)"]
    S --> I3["Iter 3: Fold 3 Test -> Perf(3)"]
    S --> I4["Iter 4: Fold 4 Test -> Perf(4)"]
    S --> I5["Iter 5: Fold 5 Test -> Perf(5)"]
    I1 --> A["Mittelwert"]
    I2 --> A
    I3 --> A
    I4 --> A
    I5 --> A

b) Gesamtergebnis (Mittelwert über alle kk Iterationen):

Performance=1ki=1kPerformancei=3.0+3.4+2.8+3.2+3.65=16.05=3.2\text{Performance} = \frac{1}{k} \sum_{i=1}^{k} \text{Performance}_i = \frac{3.0 + 3.4 + 2.8 + 3.2 + 3.6}{5} = \frac{16.0}{5} = 3.2

Der durchschnittliche RMSE beträgt 3.2.

Tipp: Kreuzvalidierung ist robuster als ein einzelner Train/Test-Split, weil jeder Datenpunkt einmal zum Testen und k1k-1-mal zum Trainieren verwendet wird. Das Ergebnis hängt weniger vom Zufall der Aufteilung ab.

Siehe EKI03.

Aufgabe 10 (Anspruchsvoll) - Den Entwicklungsprozess interpretieren

Betrachte den ML-Entwicklungsprozess:

graph TD
    Config["Configuration"] --> Train["Training"]
    Train --> Val["Validation"]
    Val --> Decision{"Gut genug?"}
    Decision -->|"not good enough"| Config
    Decision -->|"good enough"| Pred["Prediction"]

a) Welche Daten werden im Training und welche in der Validation verwendet? b) Was passiert bei "not good enough" und warum ist diese Schleife wichtig? c) In welcher Phase wird auf Live-Daten zugegriffen?

Lösung anzeigen

a) Im Training werden die Trainingsdaten (Training data) verwendet, in der Validation die Testdaten (Test data). Beide gehören zur Trainingsphase.

b) Bei "not good enough" springt der Prozess zurück zur Configuration. Das Modell wird neu konfiguriert (z.B. anderer Algorithmus oder andere Features) und erneut trainiert und validiert. Diese Iteration ist wichtig, weil ein Modell selten beim ersten Versuch gut genug ist - man verbessert es schrittweise, bis die Gütemasse ausreichen.

c) Erst in der Produktionsphase bei "Prediction" wird das fertige, validierte Modell auf Live-Daten (Live data) angewendet, um ein prediction result zu erzeugen.

Falle: Live-Daten dürfen NICHT zur Validierung benutzt werden - dafür sind die Testdaten da. Erst nach bestandener Validierung geht das Modell in Produktion.

Siehe EKI03.

Klausur-Niveau

Aufgabe 11 (Klausur-Niveau) - Vollständige Konfusionsmatrix-Auswertung

Ein Spam-Filter wird getestet. Von 200 E-Mails sind 50 echter Spam. Der Filter markiert 60 E-Mails als Spam; davon sind 45 tatsächlich Spam.

a) Erstelle die vollständige Konfusionsmatrix (TP, FP, FN, TN). b) Berechne Accuracy, Precision, Recall und F-Score. c) Interpretiere: Was bedeutet die Precision hier konkret für einen Nutzer?

Lösung anzeigen

a) Konfusionsmatrix herleiten:

  • Als Spam markiert: 60, davon korrekt: TP = 45, also FP = 60 - 45 = 15.
  • Echter Spam gesamt: 50, davon erkannt (TP): 45, also übersehen: FN = 50 - 45 = 5.
  • Gesamt 200, Rest ist korrekt als kein Spam: TN = 200 - 45 - 15 - 5 = 135.
Ist SpamIst kein Spam
Vorhersage: SPAMTP = 45FP = 15
Vorhersage: KEIN SPAMFN = 5TN = 135

b) Gütemasse:

Accuracy=45+135200=180200=0.90\text{Accuracy} = \frac{45 + 135}{200} = \frac{180}{200} = 0.90 precision=4545+15=4560=0.75\text{precision} = \frac{45}{45 + 15} = \frac{45}{60} = 0.75 recall=4545+5=4550=0.90\text{recall} = \frac{45}{45 + 5} = \frac{45}{50} = 0.90 F Score=20.750.900.75+0.90=20.6751.650.818F\text{ Score} = 2 \cdot \frac{0.75 \cdot 0.90}{0.75 + 0.90} = 2 \cdot \frac{0.675}{1.65} \approx 0.818

c) Interpretation der Precision (0.75): Von allen als Spam markierten E-Mails sind nur 75% wirklich Spam. Anders gesagt: Jede vierte in den Spam-Ordner verschobene Mail ist eigentlich erwünscht (ein FP). Für einen Nutzer heisst das, dass gelegentlich echte Mails im Spam-Ordner landen.

Tipp: Beim Spam-Filter ist ein hoher Precision-Wert oft wichtiger als hoher Recall: eine verlorene echte Mail (FP) ärgert mehr als eine durchgerutschte Spam-Mail (FN). Bei Krankheitstests ist es umgekehrt. Der passende Score hängt immer von der Anwendung ab.

Falle: TN nicht vergessen - es ergibt sich als Rest aus der Gesamtzahl. Wer TN übersieht, kann Accuracy nicht berechnen.

Siehe EKI03.

Aufgabe 12 (Klausur-Niveau) - Gute Kennzahl, wertloses Modell

Auf einer Folie wird gezeigt, dass sich der S&P-500-Index mit R2=0.99R^2 = 0.99 durch Variablen wie Butterproduktion in Bangladesch, US-Käseproduktion und Schafpopulation "erklären" lässt.

a) Wie nennt man dieses Phänomen? b) Warum ist das Modell trotz des nahezu perfekten R2R^2 wertlos? c) Welche Lehre ziehst du daraus für die Validierung von Regressionsmodellen?

Lösung anzeigen

a) Es handelt sich um eine Scheinkorrelation (spurious correlation) bzw. um Overfitting. Das Beispiel stammt aus "Stupid Data Miner Tricks" ("Overfitting the S & P 500").

b) Zwischen Butterproduktion und Aktienindex besteht kein kausaler oder sachlicher Zusammenhang. Die hohe Kennzahl entsteht nur, weil genügend unsinnige Variablen zusammengesucht wurden, bis die Kurve zufällig passt. Das Modell hat keinerlei Vorhersagekraft für neue Daten - es beschreibt nur den Zufall der Vergangenheit.

c) Eine gute Kennzahl allein reicht nicht. Eine Regression muss inhaltlich Sinn ergeben. Man muss prüfen, ob die verwendeten Merkmale plausibel mit der Zielgrösse zusammenhängen, und nicht nur auf R2R^2, RMSE o.ä. schauen. Sonst besteht die Gefahr von Overfitting bzw. Scheinkorrelation.

Falle: R2R^2 wird in diesem Kapitel NUR in dieser Karikatur als Zahl genannt; eine Formel dafür wird nicht gegeben. Merke dir die Aussage ("Regressionen müssen einen Sinn ergeben"), nicht eine Definition von R2R^2.

Siehe EKI03.

Aufgabe 13 (Klausur-Niveau) - Regressionsmodelle: Training und Vorhersage

a) Nenne mindestens drei ML-Modelle, die laut Kapitel für Regression geeignet sind. b) Wie wird ein solches Modell in scikit-learn trainiert und wie wird es zur Vorhersage benutzt? Gib die zentralen Methodenaufrufe an. c) Welchen Score verwendet man in cross_val_score für Regression und warum ist er negativ?

Lösung anzeigen

a) Laut scikit-learn-Cheat-Sheet des Kapitels eignen sich u.a.: SVR (Support Vector Regression, kernel='linear' oder kernel='rbf'), SGD Regressor (bei > 100K Samples), RidgeRegression, Lasso, ElasticNet und Ensemble Regressors. (Regularisierungsverfahren wie Lasso/Ridge/ElasticNet werden nur als Namen genannt, die Mathematik nicht erklärt.)

b) Training und Vorhersage:

from sklearn.svm import SVR
model = SVR()             # Modell erzeugen
model.fit(X, y)          # Training mit Merkmalen X und Zielen y
predictions = model.predict(X_test)   # Vorhersage für neue Daten

Das Training erfolgt mit model.fit(X, y), die Vorhersage mit model.predict(X_test).

c) Für Regression verwendet man scoring='neg_root_mean_squared_error' (RMSE). Er ist negativ, weil scikit-learn Scores grundsätzlich maximiert (je höher, desto besser). Ein RMSE ist aber umso besser, je näher er an 0 liegt. Durch das Vorzeichen wird "näher an 0" zum "grösseren" (weniger negativen) Wert - so passt es zur Maximierungslogik.

Tipp: Ein negativer RMSE von -3.2 ist besser als -5.0, weil -3.2 näher an 0 liegt. Beim Auswerten interessiert oft der Betrag.

Siehe EKI03.