Übungen: Maschinelles Lernen - Klassifikation

Übungsaufgaben zum Supervised-Learning-Workflow am Titanic-Beispiel: ML-Definition, Klassifikation vs. Regression, Datenanalyse und Vorverarbeitung, Entscheidungsbaum-Aufbau mit Entropie und Entropieverlust sowie der scikit-learn-Ablauf - vom Grundwissen bis zum Klausur-Niveau.

Beginner

Aufgabe 1 (Beginner) - Was ist Machine Learning?

Welche Aussage trifft die Kerndefinition von Machine Learning aus der Vorlesung am besten?

a) Ein Programm, dessen Regeln ein Entwickler vollständig von Hand programmiert. b) Erzeugen eines Modells aus Eingabedaten (Training) und Nutzung des Modells für Vorhersagen; das Modell wird nicht explizit programmiert. c) Das manuelle Sortieren von Daten in Tabellen. d) Eine Datenbank, die alle möglichen Antworten fest gespeichert hat.

Lösung anzeigen

Korrekt ist b).

Die Folien definieren ML als "Erzeugen eines Modells, basierend auf Eingaben ('Training') und die Nutzung des Modells für Vorhersagen ('produktive Anwendung')". Der zentrale Punkt: Das Modell wird gelernt, nicht von Hand programmiert.

Warum die anderen falsch sind:

  • a) beschreibt klassische, explizit programmierte Software - das Gegenteil von ML.
  • c) und d) sind reine Datenhaltung/-verarbeitung ohne gelerntes Modell.

Tipp: Zwei Phasen immer parat haben: Training (Modell erzeugen, "Fitting") und produktive Anwendung (Vorhersagen für neue, unbekannte Daten).

Siehe EKI02.

Aufgabe 2 (Beginner) - Klassifikation vs. Regression

Erklären Sie den Unterschied zwischen Klassifikation und Regression und geben Sie zu jeder ein Beispiel aus der Vorlesung.

Lösung anzeigen

Klassifikation sagt eine Kategorie (Klasse) voraus.

  • Gegeben: Datensätze, die in zwei oder mehr Klassen eingeteilt sind.
  • Ziel: neue, unbekannte Datensätze einer Klasse zuordnen.
  • Beispiele: Spam-Filter, Fraud-Detection, Titanic (überlebt/gestorben).

Regression sagt einen numerischen Wert voraus.

  • Gegeben: Datensätze mit einem numerischen Ausgabewert.
  • Ziel: für neue Datensätze den Ausgabewert vorhersagen.
  • Beispiel: Aktienkurs-Vorhersage.

Lösungsweg: Die entscheidende Frage lautet: Ist die Ausgabe eine Kategorie (dann Klassifikation) oder eine kontinuierliche Zahl (dann Regression)? Beide gehören zum Supervised Learning.

Falle: "Zahl als Ausgabe" heißt nicht automatisch Regression. Bei Titanic ist die Ausgabe 0/1 - das sind kodierte Kategorien (gestorben/überlebt), also Klassifikation, keine Regression.

Siehe EKI02.

Aufgabe 3 (Beginner) - Features und Label beim Titanic-Datensatz

Beim Titanic-Datensatz: (a) Welche Spalte ist das Label? (b) Warum ist PassengerId kein Feature? (c) Welche der Spalten Sex, Age, Pclass sind Features?

Lösung anzeigen

(a) Das Label ist Survived (ML-Ausgabe: 0 = Gestorben, 1 = Überlebt) - binäre Klassifikation.

(b) PassengerId ist eine eindeutige ID ohne inhaltlichen Zusammenhang zum Überleben. Sie trägt keine Information, die die Klassifikation stützt, und wird daher nicht als Feature benutzt.

(c) Sex, Age und Pclass sind alle Features (ML-Eingaben).

Lösungsweg: Features sind die Eingaben (X), aus denen das Modell lernt; das Label ist die Zielgröße (y), die vorhergesagt wird. Eine reine Identifikationsnummer wie PassengerId ist beides nicht - sie ist nur ein Schlüssel.

Tipp: Namenskonvention aus der Mathematik: Features als Matrix X (Großbuchstabe), Label als Vektor y (Kleinbuchstabe). Ein Spaltenname liefert einen Vektor, eine Liste von Spaltennamen eine Matrix.

Siehe EKI02.

Fortgeschritten

Aufgabe 4 (Fortgeschritten) - Entropie berechnen

Eine Datenmenge enthält 6 Datensätze der Klasse A und 2 der Klasse B (8 insgesamt). Berechnen Sie die Entropie HH Schritt für Schritt. Ist diese Menge eher "rein" oder eher "gemischt"?

Lösung anzeigen

Formel: H(M)=i=1ncilog2(ci)H(M) = \sum_{i=1}^{n} -c_i \cdot \log_2(c_i) mit den relativen Klassenanteilen cic_i.

Schritt 1 - Anteile: cA=68=0,75c_A = \tfrac{6}{8} = 0{,}75, cB=28=0,25c_B = \tfrac{2}{8} = 0{,}25.

Schritt 2 - einsetzen:

H=0,75log2(0,75)0,25log2(0,25)H = -0{,}75 \cdot \log_2(0{,}75) - 0{,}25 \cdot \log_2(0{,}25)

Schritt 3 - Logarithmen: log2(0,75)=0,415\log_2(0{,}75) = -0{,}415, log2(0,25)=2\log_2(0{,}25) = -2.

Schritt 4 - ausrechnen:

H=0,75(0,415)0,25(2)=0,311+0,5=0,811H = -0{,}75 \cdot (-0{,}415) - 0{,}25 \cdot (-2) = 0{,}311 + 0{,}5 = 0{,}811

Ergebnis: H0,811H \approx 0{,}811. Die Menge ist eher gemischt (Wert deutlich über 0), aber nicht maximal gemischt: Bei 50/50 wäre H=1H = 1, bei einer reinen Klasse H=0H = 0.

Tipp: log2(x)\log_2(x) ist für 0<x<10 < x < 1 immer negativ, das Minuszeichen in der Formel macht HH positiv. Wer keinen Taschenrechner hat (Klausur!): log2(0,25)=log2(1/4)=2\log_2(0{,}25) = \log_2(1/4) = -2 und log2(0,5)=1\log_2(0{,}5) = -1 auswendig kennen.

Siehe EKI02.

Aufgabe 5 (Fortgeschritten) - scikit-learn-Workflow ordnen

Bringen Sie die folgenden Schritte des Titanic-Workflows in die richtige Reihenfolge und nennen Sie zu jedem die zentrale Funktion/den Aufruf:

(1) model.fit(X, y)   (2) pd.read_csv(...)   (3) DecisionTreeClassifier()   (4) model.predict(X_test)   (5) fehlende Werte auffüllen und Spalten wählen   (6) output.to_csv(...)

Lösung anzeigen

Richtige Reihenfolge:

  1. (2) Daten laden - pd.read_csv('data/train.csv')
  2. (5) Vorverarbeiten - Spalten wählen (X = train_data[features]), fehlende Werte auffüllen (fillna / SimpleImputer)
  3. (3) Modell erzeugen - model = DecisionTreeClassifier()
  4. (1) Trainieren - model.fit(X, y)
  5. (4) Vorhersagen - predictions = model.predict(X_test)
  6. (6) Einreichung schreiben - output.to_csv('data/submission.csv', index=False)

(Dazwischen gehört das Analysieren des Datensatzes - Features, Label, Datentypen, NaN erkennen - vor der Vorverarbeitung.)

Lösungsweg: Der Ablauf folgt der Logik laden -> verstehen -> aufbereiten -> Modell bauen -> anlernen -> anwenden -> ausgeben. Ohne Vorverarbeitung kein sinnvolles Training; ohne Training keine Vorhersage.

Falle: Der Testdatensatz muss genau so vorverarbeitet werden wie der Trainingsdatensatz (gleiche Spaltenauswahl, gleiches Auffüllen). Sonst passen Eingabeformat und Modell nicht zusammen.

Siehe EKI02.

Aufgabe 6 (Fortgeschritten) - Fehlende Werte auffüllen

Der Titanic-Datensatz hat fehlende Werte in Age, Fare, Cabin und Embarked. (a) Nennen Sie die zwei in der Vorlesung gezeigten Strategien mit Code-Beispiel. (b) Warum muss man data['Embarked'] = data['Embarked'].fillna('S') mit Zuweisung schreiben?

Lösung anzeigen

(a) Zwei Strategien:

  1. Fester Wert mit fillna:
data['Embarked'] = data['Embarked'].fillna('S')
  1. Mittelwert mit SimpleImputer (scikit-learn):
import numpy as np
from sklearn.impute import SimpleImputer

imp = SimpleImputer(missing_values=np.nan, strategy='mean')
data['Age'] = imp.fit_transform(data[['Age']])

(b) Warum Zuweisung? DataFrame.fillna liefert einen modifizierten (neuen) DataFrame zurück und verändert das Original nicht. Ohne Zuweisung (data['Embarked'].fillna('S') allein) würde das Ergebnis verworfen und die fehlenden Werte blieben bestehen. Die Zuweisung überschreibt die Spalte mit dem aufgefüllten Ergebnis.

Lösungsweg: fillna eignet sich für kategoriale Spalten mit einem sinnvollen Standardwert (Embarked -> 'S'), SimpleImputer(strategy='mean') für numerische Spalten wie Age. Beides verhindert, dass NaN-Werte das Training stören.

Tipp: SimpleImputer erwartet eine 2D-Struktur, daher data[['Age']] mit doppelten eckigen Klammern (Liste von Spalten -> Matrix), nicht data['Age'] (ein Name -> Vektor).

Siehe EKI02.

Anspruchsvoll

Aufgabe 7 (Anspruchsvoll) - Zwei Splits vergleichen (Information Gain)

Eine Menge TT mit 10 Datensätzen (5x A, 5x B) hat die Entropie H(T)=1,0H(T) = 1{,}0. Zwei Splits werden getestet:

  • Split S1: TlowerT_{lower} = 5 Sätze (4x A, 1x B), TupperT_{upper} = 5 Sätze (1x A, 4x B).
  • Split S2: TlowerT_{lower} = 6 Sätze (5x A, 1x B), TupperT_{upper} = 4 Sätze (0x A, 4x B).

Berechnen Sie für beide den Entropieverlust und entscheiden Sie, welcher Split gewählt wird. (H(4:1)=0,722H(4{:}1) = 0{,}722; H(5:1)=0,650H(5{:}1) = 0{,}650.)

Lösung anzeigen

Formel: Gewinn=H(T)TlowerTH(Tlower)TupperTH(Tupper)\text{Gewinn} = H(T) - \frac{|T_{lower}|}{|T|}H(T_{lower}) - \frac{|T_{upper}|}{|T|}H(T_{upper})

Split S1: Beide Teilmengen haben H=0,722H = 0{,}722 (Verteilung 4:1 bzw. 1:4 ist symmetrisch).

GewinnS1=1,05100,7225100,722=1,00,722=0,278\text{Gewinn}_{S1} = 1{,}0 - \tfrac{5}{10}\cdot 0{,}722 - \tfrac{5}{10}\cdot 0{,}722 = 1{,}0 - 0{,}722 = 0{,}278

Split S2: H(Tlower)=H(5:1)=0,650H(T_{lower}) = H(5{:}1) = 0{,}650; H(Tupper)=0H(T_{upper}) = 0 (reine Klasse A).

GewinnS2=1,06100,6504100=1,00,390=0,610\text{Gewinn}_{S2} = 1{,}0 - \tfrac{6}{10}\cdot 0{,}650 - \tfrac{4}{10}\cdot 0 = 1{,}0 - 0{,}390 = 0{,}610

Entscheidung: 0,610>0,2780{,}610 > 0{,}278 - es wird Split S2 gewählt, weil er den größeren Entropieverlust liefert.

Lösungsweg: Man gewichtet die Teilmengen-Entropien mit ihrem Anteil an der Gesamtmenge und zieht sie von H(T)H(T) ab. S2 punktet, weil er eine reine Teilmenge (H=0H = 0) erzeugt - ein Zweig wird sofort zum Blatt.

Tipp: Eine reine Teilmenge (H=0H = 0) ist immer wertvoll, weil sie den gewichteten Restterm verkleinert. Splits, die eine Klasse sauber abtrennen, gewinnen meist.

Siehe EKI02.

Aufgabe 8 (Anspruchsvoll) - Entscheidungsbaum interpretieren und vorhersagen

Gegeben der Titanic-Entscheidungsbaum aus der Vorlesung:

flowchart TD
    A["is sex male?"] -->|"yes"| B["is age > 9.5?"]
    A -->|"no"| C["survived (0.73, 36%)"]
    B -->|"yes"| D["died (0.17, 61%)"]
    B -->|"no"| E["is sibsp > 2.5?"]
    E -->|"yes"| F["died (0.05, 2%)"]
    E -->|"no"| G["survived (0.89, 2%)"]

Sagen Sie für folgende Passagiere die Klasse voraus und geben Sie den Pfad an: (a) weiblich, 30 Jahre; (b) männlich, 40 Jahre; (c) männlich, 5 Jahre, SibSp = 1.

Lösung anzeigen

(a) Weiblich, 30 Jahre: "is sex male?" -> no -> Blatt survived (0.73, 36%). Vorhersage: überlebt.

(b) Männlich, 40 Jahre: "is sex male?" -> yes -> "is age > 9.5?" -> yes -> Blatt died (0.17, 61%). Vorhersage: gestorben.

(c) Männlich, 5 Jahre, SibSp = 1: "is sex male?" -> yes -> "is age > 9.5?" -> no (5 < 9.5) -> "is sibsp > 2.5?" -> no (1 < 2.5) -> Blatt survived (0.89, 2%). Vorhersage: überlebt.

Lösungsweg: Man startet an der Wurzel und folgt bei jedem inneren Knoten der Kante, deren Bedingung zutrifft, bis man ein Blatt (Klasse) erreicht. Die Klassen stehen in den Blättern, die Entscheidungen in den inneren Knoten, die Werte (yes/no) an den Kanten.

Tipp: Die Zahlen im Blatt bedeuten (vorhergesagte Überlebenswahrscheinlichkeit, Anteil der Fälle). "survived (0.89, 2%)" heißt: dieses Blatt sagt "überlebt" mit hoher Sicherheit, betrifft aber nur 2 % der Fälle. Das Muster spiegelt "Frauen und Kinder zuerst" wider.

Siehe EKI02.

Aufgabe 9 (Anspruchsvoll) - Wann ML einsetzen, wann nicht?

(Mini-Test: "Wann soll man ML benutzen, wann nicht?") Ein Team überlegt für zwei Aufgaben, ob ML sinnvoll ist. Begründen Sie jeweils.

(a) E-Mails automatisch in Spam / kein Spam einteilen, wobei ständig neue Spam-Varianten auftauchen. (b) Die Mehrwertsteuer (19 %) auf einen Nettobetrag aufschlagen.

Lösung anzeigen

(a) ML ist sinnvoll. Spam-Erkennung ist ein Klassifikationsproblem mit vielen Beispielen und sich ständig ändernden Mustern. Eine feste Regelmenge von Hand wäre kaum wartbar; ein Modell lernt aus manuell klassifizierten Beispielen und verbessert sich über Nutzerkorrekturen (Rückkopplungskreislauf: Training input -> Klassifikation -> Corrections -> zurück ins Training). Genau dieser Fall wird in der Vorlesung als ML-Anwendung gezeigt.

(b) ML ist nicht sinnvoll. Die Regel ist exakt bekannt und trivial: Brutto=Netto1,19\text{Brutto} = \text{Netto} \cdot 1{,}19. Hier braucht man kein gelerntes Modell - eine explizit programmierte Formel ist exakt, schneller und fehlerfrei. ML lohnt sich nur, wenn die Regel unbekannt/komplex ist und genügend Daten vorliegen.

Lösungsweg: Faustregel aus der ML-Definition: ML einsetzen, wenn das Modell aus Daten gelernt werden muss, weil es nicht praktikabel explizit programmierbar ist. Ist die Lösung eine bekannte, exakte Regel, ist klassische Programmierung besser.

Falle: ML ist kein Selbstzweck. Für deterministische, exakt beschreibbare Aufgaben ist es überflüssig und sogar schlechter (ungenau, aufwändig, Datenbedarf).

Siehe EKI02.

Klausur-Niveau

Aufgabe 10 (Klausur-Niveau) - Besten ersten Split bestimmen

Eine Trainingsmenge TT hat 12 Datensätze (6x A, 6x B), also H(T)=1,0H(T) = 1{,}0. Drei Kandidaten-Splits werden getestet:

SplitTlowerT_{lower}TupperT_{upper}
S16 Sätze (5A, 1B)6 Sätze (1A, 5B)
S24 Sätze (4A, 0B)8 Sätze (2A, 6B)
S33 Sätze (3A, 0B)9 Sätze (3A, 6B)

Berechnen Sie den Entropieverlust jedes Splits und wählen Sie den ersten Split. Nutzen Sie: H(5:1)=0,650H(5{:}1)=0{,}650; H(2:6)=0,811H(2{:}6)=0{,}811; H(3:6)=0,918H(3{:}6)=0{,}918; H(rein)=0H(\text{rein})=0.

Lösung anzeigen

Formel: Gewinn=H(T)TlowerTH(Tlower)TupperTH(Tupper)\text{Gewinn} = H(T) - \frac{|T_{lower}|}{|T|}H(T_{lower}) - \frac{|T_{upper}|}{|T|}H(T_{upper}), mit H(T)=1,0H(T)=1{,}0 und T=12|T|=12.

S1: beide Teilmengen H=0,650H=0{,}650

1,06120,6506120,650=1,00,650=0,3501{,}0 - \tfrac{6}{12}\cdot 0{,}650 - \tfrac{6}{12}\cdot 0{,}650 = 1{,}0 - 0{,}650 = \mathbf{0{,}350}

S2: H(Tlower)=0H(T_{lower})=0 (rein), H(Tupper)=0,811H(T_{upper})=0{,}811

1,041208120,811=1,00,541=0,4591{,}0 - \tfrac{4}{12}\cdot 0 - \tfrac{8}{12}\cdot 0{,}811 = 1{,}0 - 0{,}541 = \mathbf{0{,}459}

S3: H(Tlower)=0H(T_{lower})=0 (rein), H(Tupper)=0,918H(T_{upper})=0{,}918

1,031209120,918=1,00,689=0,3111{,}0 - \tfrac{3}{12}\cdot 0 - \tfrac{9}{12}\cdot 0{,}918 = 1{,}0 - 0{,}689 = \mathbf{0{,}311}

Entscheidung: Der größte Entropieverlust gehört zu S2 (0,459). Dieser Split wird als erster gewählt.

Lösungsweg: Beim Aufbau wählt man an jedem Knoten das Feature/Wert-Paar mit dem maximalen Entropieverlust. Obwohl S3 ebenfalls eine reine Teilmenge liefert, ist diese sehr klein (3 Sätze) und der große Restzweig bleibt stark gemischt (H=0,918H=0{,}918). S2 trennt mehr sauber ab und senkt die Restentropie stärker.

Falle: Nicht nur schauen, ob eine reine Teilmenge entsteht - die Gewichtung mit der Teilmengengröße entscheidet. Eine kleine reine Teilmenge (S3) bringt weniger als eine größere, die den Rest deutlicher entmischt (S2).

Alternative Betrachtung: Man könnte auch das Verfahren aus der Folie 2.38-2.43 heranziehen, wo genauso f4 < 809.1 als Gewinner mit 0,334 aus fünf Kandidaten hervorging - dasselbe Prinzip "größter Entropieverlust gewinnt".

Siehe EKI02.

Aufgabe 11 (Klausur-Niveau) - Wie baut man einen Entscheidungsbaum auf?

(Mini-Test: "Wie baut man einen Entscheidungsbaum auf?") Beschreiben Sie den Aufbau eines Entscheidungsbaums vollständig. Gehen Sie ein auf: Aufbau des Baums (Knoten, Kanten, Blätter), die Rolle von Entropie und Entropieverlust sowie die Rekursion und das Abbruchkriterium.

Lösung anzeigen

Musterantwort:

1. Struktur: Ein Entscheidungsbaum hat die Klassen als Blätter (z.B. überlebt/gestorben), Entscheidungen in den inneren Knoten (z.B. "männlich?") und die Werte an den Kanten (z.B. Ja/Nein).

2. Ziel jedes Splits: An jedem Knoten wird ein Feature und ein Wert gewählt, so dass ein möglichst großer Entropieverlust entsteht. Ein Split "Feature < Wert" teilt die Menge TT in TlowerT_{lower} (Bedingung erfüllt) und TupperT_{upper} (nicht erfüllt).

3. Entropie misst, wie "gemischt" eine Menge bezüglich der Klassen ist:

H(M)=i=1ncilog2(ci)H(M) = \sum_{i=1}^{n} -c_i \cdot \log_2(c_i)

Sie ist maximal bei ausgeglichener Verteilung (50/50) und 0, wenn alle Elemente derselben Klasse angehören.

4. Entropieverlust (Information Gain) bewertet einen Split:

Gewinn=H(T)TlowerTH(Tlower)TupperTH(Tupper)\text{Gewinn} = H(T) - \tfrac{|T_{lower}|}{|T|}H(T_{lower}) - \tfrac{|T_{upper}|}{|T|}H(T_{upper})

Man testet mehrere Feature/Wert-Kandidaten und wählt den mit dem größten Gewinn.

5. Rekursion + Abbruch: Teilmengen, die noch gemischt sind (H>0H > 0), werden rekursiv nach demselben Verfahren weiter aufgeteilt. Erreicht eine Teilmenge Entropie 0 (nur noch eine Klasse), wird sie zum Blatt dieser Klasse. Beispiel aus der Folie: Nach dem ersten Split hat TupperT_{upper} mit 6 Fällen H=0H=0 (alle "A") und wird Blatt "A"; TlowerT_{lower} mit H=0,94H=0{,}94 wird weiter aufgeteilt.

Lösungsweg: Der Algorithmus ist greedy und top-down: an jedem Knoten lokal den besten Split (max. Entropieverlust) wählen, dann für die entstandenen Teilmengen rekursiv wiederholen, bis die Blätter rein sind.

Tipp: In scikit-learn erledigt das der DecisionTreeClassifier(); model.fit(X, y) baut den Baum automatisch aus Features und Labels auf.

Siehe EKI02.

Aufgabe 12 (Klausur-Niveau) - Kaggle und Vorhersage neuer Fälle

(Mini-Test: "Was ist Kaggle?" und "Wie sagt man neue Fälle vor?") (a) Was ist Kaggle und welche zwei Dateien lädt man für den Titanic-Wettbewerb herunter, worin unterscheiden sie sich? (b) Beschreiben Sie den Code-Ablauf, um Vorhersagen zu erzeugen und einzureichen. (c) Worauf muss man beim Testdatensatz unbedingt achten?

Lösung anzeigen

(a) Kaggle ist eine Community-Plattform mit Datensätzen, Wettbewerben etc. Für Titanic lädt man:

  • train.csv - Trainingsdaten mit bekanntem Label Survived.
  • test.csv - der Einreichungs-Datensatz ohne Labels; für ihn werden die Vorhersagen erzeugt und eingereicht.

Der Unterschied: nur train.csv enthält das Label zum Lernen; test.csv ist unbeschriftet. Es ist kein lokal beschrifteter Hold-out-Testsatz - die Bewertung erfolgt extern über das Kaggle-Leaderboard.

(b) Ablauf:

# Vorhersagen für den (gleich vorverarbeiteten) Testdatensatz
predictions = model.predict(X_test)

# Einreichung mit zwei Spalten erzeugen
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('data/submission.csv', index=False)

Danach submission.csv bei Kaggle einreichen und Position im Leaderboard prüfen.

(c) Achtung: Der Testdatensatz muss genau so wie der Trainingsdatensatz vorverarbeitet werden - gleiche Spaltenauswahl, gleiches Auffüllen fehlender Werte etc. Sonst passt das Eingabeformat nicht zum trainierten Modell.

Lösungsweg: model.predict(X_test) wendet das im Training gelernte Modell auf neue, unbekannte Fälle an. Die Ausgabe wird zusammen mit PassengerId in die von Kaggle geforderte CSV geschrieben.

Falle: Da test.csv kein Label hat, kann man mit ihm lokal keine Genauigkeit messen. Eine lokale Gütemessung (Accuracy, Train/Validation/Test-Split, Kreuzvalidierung) zeigt das Deck nicht - die Bewertung läuft nur über das Leaderboard.

Siehe EKI02.