EKI02 - Maschinelles Lernen: Klassifikation

Supervised Learning am "Hello World"-Beispiel Titanic: Datensatz analysieren, mit pandas laden, vorverarbeiten, einen Entscheidungsbaum (DecisionTreeClassifier) per Entropie/Entropieverlust trainieren und Vorhersagen fuer neue Faelle erzeugen.

Überblick

Dieses Kapitel fuehrt in das maschinelle Lernen (machine learning) und speziell in die Klassifikation (classification) ein. Die Folien nutzen durchgaengig ein einziges Beispiel - die Vorhersage der Ueberlebenden der Titanic aus dem Kaggle-Wettbewerb - und gehen den vollstaendigen Workflow durch: Daten analysieren, laden, vorverarbeiten, ein Modell trainieren und damit vorhersagen.

Kerndefinition der Folien:

Machine Learning = Erzeugen eines Modells, basierend auf Eingaben ("Training") und die Nutzung des Modells fuer Vorhersagen ("produktive Anwendung"). Das Modell wird also nicht explizit programmiert.

Der behandelte Ablauf (Foliengliederung "Aufbau"):

  1. Ueberblick
  2. ML Anwendungen
  3. Kategorien von ML Aufgaben
  4. Beispiel: Klassifikation der Ueberlebenden der Titanic
  5. Kaggle
  6. Analysieren von Datensaetzen
  7. Datensaetze laden
  8. Datensaetze vorverarbeiten
  9. ML Training
  10. ML Modell zur Vorhersage anwenden
  11. Mini-Test

Hinweis: Der Foliensatz behandelt als eigentliches Lernverfahren ausschliesslich den Entscheidungsbaum. Themen wie Confusion Matrix, Accuracy/Precision/Recall/F1, Overfitting/Underfitting, Cross-Validation sowie die Verfahren k-NN, Naive Bayes und SVM als eigenstaendige Methoden kommen im Deck nicht vor. k-NN, Naive Bayes und SVM tauchen nur als Namen in zwei uebernommenen Uebersichtsgrafiken auf (KI-Landkarte, scikit-learn Cheat Sheet). Dieses Kapitel bleibt bewusst auf den Folieninhalt beschraenkt.

Die KI-Landkarte

Zur Einordnung zeigen die Folien eine "KI-Landkarte" (Quelle: B. Humm, "Applied Artificial Intelligence"). Sie unterscheidet zwei Achsen - Acquiring intelligence (Intelligenz erwerben) und Applying intelligence (Intelligenz anwenden) - und zwei grosse Bloecke:

  • Non-symbolic AI / Machine learning (nicht-symbolische KI)
  • Symbolic AI / Knowledge-based AI (symbolische, wissensbasierte KI)

Die faehigkeitsbezogenen Felder sind: Perceiving (Computer vision, Sensor technology), Communicating (Natural language processing), Reasoning (Logic programming, Probabilistic reasoning, Complex event processing), Acting (Planning, Agent technology, Robotics), Learning (Machine learning, Information retrieval, Data mining) und Knowing (Knowledge representation).

Dem Bereich Learning / Machine Learning sind auf der Grafik u.a. zugeordnet: Artificial neural networks, Support vector machines, Linear/logistic regression, Random forest, Gradient boosting tree, K-Nearest neighbors, K-means, Naive Bayes. Dem symbolischen Teil u.a.: Bayes networks, Hidden Markov models, Decision tree learning, Inductive logic programming.

Hinweis: Diese Verfahrensnamen dienen in EKI02 nur der Landkarten-Uebersicht. Pruefungsrelevant als Verfahren ist aus diesem Deck nur der Entscheidungsbaum.

Was ist Machine Learning?

Zwei Phasen bestimmen jedes ML-Vorhaben:

  • Training: Aus Eingabedaten wird ein Modell erzeugt ("Fitting").
  • Produktive Anwendung: Das trainierte Modell macht Vorhersagen fuer neue, bisher unbekannte Daten.

Der zentrale Punkt: Das Modell wird gelernt, nicht von Hand programmiert.

ML Anwendungen

Die Folien nennen zwei anschauliche Anwendungsfaelle:

AnwendungAufgabeML-Kategorie
Spam FilteringKlassifiziere neue E-Mails danach, ob sie Spam oder nicht Spam sindKlassifikation
WertpapierhandelMache Empfehlungen, welche Aktien gekauft bzw. verkauft werden sollen(Prediction -> Recommendation)

Beim Spam-Filter zeigt die Folie einen Rueckkopplungskreislauf: manuell klassifizierte Beispiele dienen als Training input, neue E-Mails werden automatisch klassifiziert (Not spam / Spam), und Nutzerkorrekturen (Corrections) fliessen wieder als Trainingsdaten zurueck.

flowchart LR
    A["Manually classified samples"] -->|"Training input"| B["Spam filter"]
    C["New emails"] --> B
    B --> D["Not spam"]
    B --> E["Spam"]
    D --> F["User"]
    E --> F
    F -->|"Corrections"| A

Kategorien von ML Aufgaben

Die Folien gliedern ML in drei Bereiche (Area) mit zugehoerigen Aufgaben (Task):

flowchart TD
    ML["Machine Learning"] --> SL["Supervised Learning"]
    ML --> UL["Unsupervised Learning"]
    ML --> RL["Reinforcement Learning"]
    SL --> C["Classification"]
    SL --> R["Regression"]
    UL --> CL["Clustering"]
    UL --> FS["Feature selection / extraction"]
    UL --> TM["Topic modeling"]

Der Fokus des Kapitels liegt auf Supervised Learning (ueberwachtes Lernen) mit den Aufgaben Klassifikation und Regression.

Aufgaben des Supervised Learning

Klassifikation (classification)

  • Gegeben: Datensaetze als Eingabe fuer das Training, welche in zwei oder mehrere Klassen ("Kategorien") eingeteilt sind.
  • Ziel: Ein Modell erzeugen, welches neue, bisher unbekannte Datensaetze klassifizieren kann.
  • Beispiele: Spam-Filter, Fraud-Detection, ...

Regression (regression)

  • Gegeben: Datensaetze als Eingabe fuer das Training, welche einen numerischen Ausgabewert besitzen.
  • Ziel: Ein Modell erzeugen, welches fuer neue, bisher unbekannte Datensaetze den Ausgabewert vorhersagen kann.
  • Beispiel: Aktienkurs-Vorhersage

Der Unterschied: Klassifikation sagt eine Kategorie voraus, Regression einen numerischen Wert.

Beispiel: Klassifikation der Ueberlebenden der Titanic

  • "Hello World"-Beispiel fuer ML, viele Tutorials online verfuegbar (z.B. das Kaggle-Titanic-Tutorial).
  • Eingabe: Informationen ("Features") ueber die Passagiere, z.B. Alter, Geschlecht, ...
  • Ausgabe: Klassifikation nach zwei Kategorien: Ueberlebt bzw. Gestorben (binaere Klassifikation).

Die Aufgabenstellung lautet: "What sorts of people were more likely to survive?" - anhand von Passagierdaten (Name, Alter, Geschlecht, sozio-oekonomische Klasse etc.).

Die Folie stellt auch die kritische Frage: Was gefaellt mir nicht an dem Titanic-Beispiel? - "Es ist kein realistisches ML-Beispiel, aber warum?" Dies bleibt in den Folien als Denkanstoss offen (keine ausformulierte Antwort im Deck).

Kaggle

Kaggle ist eine Community-Plattform mit Datensaetzen, Wettbewerben etc. Fuer den Titanic-Wettbewerb laedt man von Kaggle herunter:

  • train.csv - Trainingsdaten (mit bekanntem Label Survived)
  • test.csv - Testdaten (ohne Label; die Vorhersagen dafuer werden eingereicht)
  • Format fuer die Wettbewerbs-Einreichung

Ablauf: Loesung als CSV einreichen, Position im Leaderboard pruefen.

Hinweis: Die Kaggle-test.csv ist der Einreichungs-Datensatz ohne Labels, nicht ein lokal beschrifteter Hold-out-Testsatz. Eine lokale Guetemessung (z.B. Accuracy auf einem beschrifteten Testsatz, Train/Validation/Test-Split, Kreuzvalidierung) wird im Deck nicht gezeigt; die Bewertung erfolgt extern ueber das Kaggle-Leaderboard.

Analysieren von Datensaetzen

Vor jeder Verarbeitung muss man den Datensatz verstehen. Die Attribute des Titanic-Datensatzes:

SpalteRolleBedeutung
PassengerId(nicht benutzt)Eindeutige Passagier-ID, nicht fuer die Klassifikation
SurvivedLabel (ML Ausgabe)Ziel der Klassifikation: 0 = Gestorben, 1 = Ueberlebt
PclassFeaturePassagierklasse: 1 = Erste Klasse, 3 = Dritte Klasse
NameFeatureName
SexFeatureGeschlecht
AgeFeatureAlter in Jahren
SibSpFeatureAnzahl siblings + spouse (Geschwister + Ehepartner)
ParchFeatureAnzahl Eltern + Kinder
TicketFeatureTicketnummer
FareFeatureFahrpreis
CabinFeatureKabine
EmbarkedFeatureEinstiegshafen: C = Cherbourg, S = Southampton, Q = Queenstown; NaN = fehlende Werte

Beispielzeilen aus dem Datensatz (Folie 2.19):

PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
69011Madill, Miss. Georgette Alexandrafemale15.00124160211.3375B5S
52603Farrell, Mr. Jamesmale40.5003672327.7500NaNQ
27903Rice, Master. Ericmale7.04138265229.1250NaNQ

Datentypen und fehlende Werte

SpalteKategorieDatentypFehlende Daten?
SurvivedKategorisch, binaerintnein
PclassKategorisch, ordinalintnein
NameTextstringnein
SexKategorischstringnein
AgeNumerischfloatja
SibSpNumerischintnein
ParchNumerischintnein
TicketTextintnein
FareNumerischfloatja
CabinTextstringja
EmbarkedKategorischstringja

Hinweis: In der Folientabelle ist Ticket als Kategorie "Text" gefuehrt, der Datentyp aber als int. Das ist inkonsistent (Ticketnummern koennen auch nicht-numerische Zeichen enthalten); die Folie ist hier so uebernommen, ohne stille Korrektur.

Warum die Analyse wichtig ist: Man erkennt, welche Spalten Features und welche das Label sind, welche Datentypen vorliegen (kategorisch/numerisch/Text) und wo fehlende Werte (NaN) auftreten - genau diese muessen spaeter vorverarbeitet werden.

Datensaetze laden

Genutzt wird das Datenanalyse-Paket pandas (Installation z.B. pip install pandas). Die primaere Datenstruktur ist der pd.DataFrame - eine zweidimensionale, beschriftete Tabelle (Zeilen und Spalten).

CSV-Dateien einlesen:

import pandas as pd

train_data = pd.read_csv('data/train.csv')
test_data = pd.read_csv('data/test.csv')

pd.read_csv liest eine CSV-Datei (relativer Pfad zum Notebook) in einen pd.DataFrame. Es gibt viele optionale Parameter, z.B. encoding, delimiter, quotechar.

Datensaetze vorverarbeiten

Relevante Spalten extrahieren

# Labels extrahieren
y = train_data["Survived"]

# Relevante Spalten (features) extrahieren (wird spaeter vielleicht erweitert)
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = train_data[features]

Regel fuer den Zugriff: Ein Spaltenname -> Vektor, Liste von Spaltennamen -> Matrix.

Namenskonventionen aus der Mathematik (in den Folien betont):

  • Matrix: Grossbuchstaben, z.B. X
  • Vektor: Kleinbuchstaben, z.B. y
  • Input: x (oder X), Output: y (oder Y)

Fehlende Werte auffuellen

# Fehlende Werte (n/a values) mit einem bestimmten Wert auffuellen
data['Embarked'] = data['Embarked'].fillna('S')

# Fehlende Werte mit dem Mittelwert aller Werte auffuellen
import numpy as np
from sklearn.impute import SimpleImputer

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

Wichtige Details der Folien:

  • DataFrame.fillna liefert einen modifizierten DataFrame zurueck (der Original-DataFrame wird nicht veraendert). Daher die Zuweisung, um ihn zu ueberschreiben.
  • SimpleImputer (aus scikit-learn) kennt verschiedene Strategien, um fehlende Werte aufzufuellen; hier strategy='mean' (Mittelwert).

Genutzte Hilfspakete: NumPy (Scientific Computing) und scikit-learn (ML). Als weitere Vorverarbeitungs-Idee wirft die Folie die offene Frage auf "Weitere Ideen fuer die Vorverarbeitung der Daten?" (ohne festgelegte Antwort im Deck).

ML Training

Der in den Folien ausgewaehlte Ansatz ist der DecisionTreeClassifier aus scikit-learn.

# ML Modell erzeugen
model = DecisionTreeClassifier()

# ML Modell trainieren
model.fit(X, y)

Das Trainieren ("fitting") des Modells erfolgt mit den Features (X) und den Labels (y).

Lernen mit einem Entscheidungsbaum

Ein Entscheidungsbaum (decision tree) ist ein Baum mit den Klassen als Blaettern (hier: ueberlebt, gestorben). Die Entscheidungen stehen in den inneren Knoten (z.B. "maennlich?") und die Werte an den Kanten des Baums (z.B. Ja, Nein).

Der Lernvorgang: automatisch einen Entscheidungsbaum aus den Trainingsdaten (Features und Labels) aufbauen.

Beispielbaum fuer die Titanic-Klassifikation (Folie 2.35, nachgezeichnet; Blattwerte = vorhergesagte Ueberlebenswahrscheinlichkeit und Anteil der Faelle):

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%)"]

Entropie

Zum Bewerten, wie "gemischt" eine Datenmenge bezueglich der Klassen ist, wird die Entropie HH verwendet. Sie ist maximal bei ausgeglichener Klassenverteilung (50/50) und minimal (0), wenn alle Elemente derselben Klasse angehoeren.

H(M)=i=1ncilog2(ci)miti=1nci=1H(M) = \sum_{i=1}^{n} -c_i \cdot \log_2(c_i) \quad \text{mit} \quad \sum_{i=1}^{n} c_i = 1

Dabei sind cic_i die relativen Anteile der einzelnen Klassen in der Menge MM.

Worked Example aus der Folie (Menge mit 3 Elementen der einen und 7 der anderen Klasse, also 10 insgesamt):

H=310log2 ⁣(310)710log2 ⁣(710)=0,881H = -\tfrac{3}{10}\cdot\log_2\!\left(\tfrac{3}{10}\right) - \tfrac{7}{10}\cdot\log_2\!\left(\tfrac{7}{10}\right) = 0{,}881

Entropieverlust (Information Gain)

Beim Aufbau waehlt man an jedem Knoten ein Feature und einen Wert, so dass ein moeglichst grosser Entropieverlust entsteht. Ein Split "Feature < Wert" teilt die Menge TT in TlowerT_{lower} (Bedingung erfuellt) und TupperT_{upper} (Bedingung nicht erfuellt).

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

Das ist der gewichtete Entropieverlust: die Ausgangsentropie minus die mit den Teilmengengroessen gewichteten Entropien der beiden Teilmengen.

Worked Example: bester Split (Folien 2.38 - 2.43)

Ausgangsmenge: 20 Datensaetze (IDs 1-20) mit Features f1-f5 und Label A/B. Die Ausgangsentropie betraegt H(T)=0,992H(T) = 0{,}992 (Verteilung 11x A, 9x B).

Fuer jedes Feature wird ein Schwellwert getestet und der Entropieverlust berechnet:

SplitTlower\lvert T_{lower}\rvertH(Tlower)H(T_{lower})Tupper\lvert T_{upper}\rvertH(Tupper)H(T_{upper})Entropieverlust
f1 < 404.3100.721100.8810.191
f2 < 34.7150.9750.00.264
f3 < 0.92170.99730.00.144
f4 < 809.1140.9460.00.334
f5 < 61.920.0180.9640.125

Beispielrechnung fuer den Gewinner f4 < 809.1:

0,99214200,946200,0=0,9920,658=0,3340{,}992 - \frac{14}{20}\cdot 0{,}94 - \frac{6}{20}\cdot 0{,}0 = 0{,}992 - 0{,}658 = 0{,}334

Der groesste Entropieverlust (0,334) gehoert zu f4 < 809.1 - dieses Feature/Wert-Paar wird als erster Split gewaehlt.

Zwischenergebnis

Nach dem ersten Split (Folie 2.43):

flowchart TD
    T["T: H(T) = 0.992"] --> Q["f4 < 809.1 ?"]
    Q -->|"Ja"| L["T_lower: H = 0.94 (weiter aufteilen)"]
    Q -->|"Nein"| R["A (Blatt, H = 0)"]

Der Zweig "Nein" (TupperT_{upper}, 6 Faelle) hat Entropie 0 - alle Labels sind A, also wird er zum Blatt "A". Der Zweig "Ja" (TlowerT_{lower}, 14 Faelle) hat noch H=0,94H = 0{,}94 und wird rekursiv nach demselben Verfahren weiter aufgeteilt.

Hinweis: Auf Folie 2.38 wird in der Summenformel einmal H(tlower)H(t_{lower}) mit kleinem t geschrieben, waehrend sonst durchgehend H(Tlower)H(T_{lower}) mit grossem T verwendet wird. Gemeint ist dieselbe Groesse; es handelt sich um einen reinen Schreibfehler in der Folie.

Ideen fuer weitere ML Ansaetze

Als Ausblick verweisen die Folien auf das scikit-learn algorithm cheat sheet - eine Entscheidungshilfe zur Auswahl eines Verfahrens je nach Datenlage. Fuer den Zweig classification nennt es u.a. SVC, Ensemble Classifiers, KNeighbors Classifier, SGD Classifier, Naive Bayes und Linear SVC; daneben stehen Zweige fuer regression, clustering und dimensionality reduction.

Hinweis: Diese Verfahren werden im Deck nicht erklaert, sondern nur als moegliche Alternativen zum Entscheidungsbaum genannt.

ML Modell zur Vorhersage anwenden

Das trainierte Modell sagt die Labels aller Faelle im Testdatensatz voraus:

# Labels fuer den Testdatensatz vorhersagen
predictions = model.predict(X_test)

Wichtig (Folie): Der Testdatensatz muss genau so wie der Trainingsdatensatz vorverarbeitet worden sein (gleiche Spaltenauswahl, gleiches Auffuellen fehlender Werte etc.).

Einreichung bei Kaggle erzeugen

Kaggle erwartet eine CSV mit den zwei Spalten PassengerId und Survived:

# Erzeugen der CSV-Datei mit den Vorhersagen des Modells
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('data/submission.csv', index=False)

Anschliessend wird die Datei im Kaggle-Wettbewerb eingereicht und die eigene Position im Leaderboard geprueft.

scikit-learn Workflow (Zusammenfassung)

Der komplette Ablauf des Titanic-Beispiels in der Reihenfolge der Folien:

flowchart TD
    A["train.csv / test.csv laden (pd.read_csv)"] --> B["Analysieren: Features, Label, Datentypen, NaN"]
    B --> C["Vorverarbeiten: Spalten waehlen, fehlende Werte auffuellen"]
    C --> D["Modell erzeugen: DecisionTreeClassifier()"]
    D --> E["Trainieren: model.fit(X, y)"]
    E --> F["Vorhersagen: model.predict(X_test)"]
    F --> G["submission.csv schreiben und bei Kaggle einreichen"]

Prüfungsrelevanz

  • ML-Definition: Modell aus Eingaben erzeugen (Training) + fuer Vorhersagen nutzen (produktive Anwendung); das Modell wird nicht explizit programmiert.
  • ML-Kategorien: Supervised, Unsupervised, Reinforcement Learning (Bereiche); Supervised -> Klassifikation + Regression (Aufgaben).
  • Klassifikation vs. Regression: Kategorie vorhersagen vs. numerischen Wert vorhersagen.
  • Titanic: binaere Klassifikation (Survived 0/1); Features = Passagierinfos; PassengerId ist kein Feature.
  • Features vs. Label: Features = ML-Eingabe (X, Matrix), Label = ML-Ausgabe (y, Vektor); mathematische Namenskonventionen kennen.
  • Vorverarbeitung: Warum wichtig; fillna (fester Wert) und SimpleImputer(strategy='mean') (Mittelwert); Testdaten identisch zu Trainingsdaten vorverarbeiten.
  • Entscheidungsbaum: Klassen = Blaetter, Entscheidungen = innere Knoten, Werte = Kanten; automatischer Aufbau aus Trainingsdaten.
  • Entropie: H(M)=cilog2(ci)H(M) = \sum -c_i \log_2(c_i); maximal bei 50/50, 0 bei reiner Klasse; Rechnung H=310log2310710log2710=0,881H = -\tfrac{3}{10}\log_2\tfrac{3}{10} - \tfrac{7}{10}\log_2\tfrac{7}{10} = 0{,}881 nachvollziehen koennen.
  • Entropieverlust / Information Gain: H(T)TlowerTH(Tlower)TupperTH(Tupper)H(T) - \tfrac{|T_{lower}|}{|T|}H(T_{lower}) - \tfrac{|T_{upper}|}{|T|}H(T_{upper}); Split mit groesstem Verlust waehlen (im Beispiel f4 < 809.1 mit 0,334).
  • scikit-learn Workflow: read_csv -> vorverarbeiten -> DecisionTreeClassifier() -> fit(X, y) -> predict(X_test) -> to_csv.
  • Kaggle: Community mit Datensaetzen/Wettbewerben; train/test-Dateien, submission.csv, Leaderboard.

Nicht im Deck (daher nicht pruefungsrelevant aus EKI02): Confusion Matrix, Accuracy/Precision/Recall/F1, Overfitting/Underfitting, Cross-Validation, sowie k-NN/Naive Bayes/SVM als erklaerte Verfahren. Falls diese in der Klausur vorkommen, stammen sie aus anderen Kapiteln.

Mini-Test

Die folgenden Fragen stammen wortwoertlich aus der Mini-Test-Folie ("Mini-Test 'ML Klassifikation'", Folie 2.52):

  • Was ist ML?
  • Wann soll man ML benutzen, wann nicht?
  • Nennen Sie ML Anwendungen
  • Erklaeren Sie die ML Kategorie "Supervised Learning"
  • Erklaeren Sie die ML Aufgabe Klassifikation
  • Was ist Kaggle?
  • Warum ist es wichtig, einen Datensatz zu analysieren?
  • Warum ist die Vorverarbeitung wichtig? Nennen Sie hierzu Beispiele
  • Was ist ML Training?
  • Wie baut man einen Entscheidungsbaum auf?
  • Wie sagt man neue Faelle vor?