Machine Learning von Grund auf · Lektion 5.1 · 26 von 33 fertigen Lektionen · 10 Min.
Entscheidungsbäume: zwanzig Fragen an die Daten
Kurz gesagt
Ein Entscheidungsbaum klassifiziert mit Ja-Nein-Fragen, die die Daten jeweils möglichst sauber aufteilen. Das Beispiel: Wer überlebte die Titanic?
Aufwärmen Zwei Fragen aus früheren Lektionen. Eine Minute, und sie blockiert die Lektion nicht.
Kennst du das Spiel „Wer bin ich?“ mit zwanzig Fragen? „Lebt es?“ „Ist es größer als eine Katze?“ Gute Spieler fragen nicht zufällig; sie stellen die Frage, die die verbleibenden Möglichkeiten ungefähr halbiert. Ein Entscheidungsbaum ist ein Modell, das dieses Spiel mit Daten spielt – und weil seine Fragen in Klartext formuliert sind, gehört er zu den wenigen Modellen, die man wie ein Flussdiagramm lesen kann. Probier es zuerst selbst aus, bevor du die Erklärung liest.
Wähle eine Antwort und wie sicher du bist.
Antworte, um das Labor freizuschalten.
Interaktives Labor
Dieses interaktive Labor läuft im Browser mit aktiviertem JavaScript. Der Text drumherum beschreibt, was es zeigt.
Antwort anzeigen
Richtige Antwort: Der flache (Tiefe 1)
Tiefe 20 erreicht 98,7 % im Training, aber 73,9 % im Test. Tiefe 1 erreicht 79,3 % im Training und 77,2 % im Test. Der tiefe Baum hat die Passagiere auswendig gelernt (114 seiner 145 Blätter umfassen höchstens 5 Personen), statt eine Regel zu lernen; das beste Testergebnis, 79,5 %, liefert Tiefe 3.
Probier es aus
- Stell den Regler für die maximale Tiefe auf 1. Der Baum darf nur eine Frage stellen. Lies sie in der Liste der Teilungen ab: Welches Merkmal hielt der Algorithmus für das aussagekräftigste?
- Erhöhe die maximale Tiefe Schritt für Schritt. Beobachte, wie die Trainingsgenauigkeit steigt, und vergleiche sie bei jeder Tiefe mit der Testgenauigkeit.
- Schieb den Regler für die maximale Tiefe auf das Maximum. Ist die Trainingsgenauigkeit nahezu perfekt? Was ist mit der Testgenauigkeit passiert?
- Finde die Tiefe mit der besten Testgenauigkeit und lies dort die obersten Teilungen ab. Könntest du diesen Baum jemandem in zwei Sätzen erklären?
Die Idee in einfachen Worten
Ein Entscheidungsbaum sagt vorher, indem er eine Folge von Ja-Nein-Fragen zu den Merkmalen stellt: „Ist der Passagier jünger als ein bestimmtes Alter?“, „Ist er in der ersten Klasse gereist?“. Jede Antwort schickt das Beispiel einen Ast hinunter, und die nächste Frage hängt von den bisherigen Antworten ab. Am Ende jedes Pfads sitzt ein Blatt mit einer Vorhersage – meist das häufigste Label unter den Trainingsbeispielen, die dort gelandet sind.
In dieser Lektion nutzen wir Daten zu 891 Passagieren der Titanic, von denen 342 überlebten. Zu den Merkmalen gehören die Ticketklasse, das Geschlecht, das Alter, die Zahl der Angehörigen an Bord und der bezahlte Fahrpreis. Der Baum lernt, welche Fragen zu diesen Merkmalen die Überlebenden am besten von den anderen trennen.
Denk an eine Pflegekraft in der Notaufnahme, die die Ersteinschätzung (Triage) macht. Sie berechnet keine gewichtete Summe; sie folgt einer kurzen Kette von Fragen – Atmung? Blutung? Bewusstsein? –, und jede grenzt ein, was zu tun ist. Ein Baum ist diese Kette, nur aus Daten gelernt statt von Ärzten aufgeschrieben.
Warum es funktioniert
Der Baum wird von oben aufgebaut, eine Frage nach der anderen. Bei jedem Schritt probiert der Algorithmus jedes Merkmal und jeden möglichen Grenzwert aus und fragt: Welche Frage teilt diese Gruppe in zwei Gruppen, die möglichst rein sind, also jeweils überwiegend ein Label enthalten? Ein beliebtes Maß für die Unreinheit ist der Gini-Index einer Gruppe:
Gini = 1 − Σ pₖ²
Dabei ist pₖ der Anteil des Labels k in der Gruppe. Eine Gruppe, in der alle dasselbe Label haben, hat Gini 0; eine Gruppe, die je zur Hälfte aus zwei Labels besteht, hat Gini 0,5, den schlechtesten möglichen Wert bei zwei Klassen. Der Algorithmus wählt die Frage, die die durchschnittliche Unreinheit am stärksten senkt, und wiederholt das Verfahren dann getrennt in jedem Ast. Diese gierige (greedy) Schritt-für-Schritt-Suche garantiert nicht den bestmöglichen Baum, ist aber schnell und funktioniert in der Praxis gut.
Sich selbst überlassen, teilt der Baum so lange weiter, bis jedes Blatt rein ist – selbst wenn ein Blatt nur einen einzigen Passagier enthält. Dann hat er die Trainingsdaten samt Rauschen auswendig gelernt: die Überanpassung aus Lektion 7 in neuem Gewand. Die wichtigste Stellschraube ist die maximale Tiefe, also die Zahl der Fragen, die entlang eines Pfads erlaubt sind. Ein flacher Baum ist leicht zu lesen, übersieht aber vielleicht echte Muster; ein tiefer Baum trifft die Trainingsdaten fast perfekt und verallgemeinert schlechter. Die Kreuzvalidierung aus Lektion 8 ist der ehrliche Weg, die Tiefe zu wählen.
Häufiger Fehler
Eine Teilung erklärt keine Ursache. Der Baum fragt nach dem Merkmal, das die Labels in diesen Daten am besten trennt, und das kann ein Stellvertreter für etwas anderes sein: Ticketklasse und Fahrpreis hängen zusammen, und beide sagen etwas darüber, wo auf dem Schiff ein Passagier schlief. Der zweite Fehler ist, einem tiefen Baum zu trauen, weil seine Regeln so präzise aussehen. Eine Regel wie „Alter zwischen 31,5 und 32,5 und Fahrpreis über einem bestimmten Wert“ beschreibt meist ein oder zwei Passagiere, kein Muster. Kleine Änderungen in den Daten können außerdem die erste Teilung und damit den ganzen Baum verändern, was einzelne Bäume instabil macht.
Diese Instabilität ist eine Schwäche, lässt sich aber in eine Stärke verwandeln. In der nächsten Lektion lassen wir viele verschiedene Bäume wachsen und abstimmen.
Quiz
Drei Fragen zur Selbstkontrolle. Wähle eine Antwort oder klappe die Lösung unter der Frage auf. Mit der Tastatur: Pfeiltasten wählen, Enter oder Leertaste bestätigt.
Das Wichtigste
- Ein Entscheidungsbaum sagt mit einer Kette von Ja-Nein-Fragen vorher, die man wie ein Flussdiagramm lesen kann.
- Jede Teilung wird gierig so gewählt, dass die entstehenden Gruppen möglichst rein sind, zum Beispiel nach dem Gini-Index.
- Die maximale Tiefe steuert die Komplexität: Flache Bäume passen sich zu wenig an, tiefe lernen auswendig.
- Eine Teilung zeigt, was die Labels in den Daten trennt, nicht, was das Ergebnis verursacht.
Tiefer: Formel, Code, Praxis
Die Mathematik
Für eine Gruppe mit Label-Anteilen pₖ ist Gini = 1 − Σ pₖ². Bei zwei Klassen reicht er von 0 (nur ein Label) bis 0,5 (halb und halb). Die gesamte Titanic-Tabelle, 342 Überlebende von 891, hat Gini = 1 − (342/891)² − (549/891)² ≈ 0.473.
Ein Split schickt n_L Zeilen nach links und n_R Zeilen nach rechts, n = n_L + n_R. Seine Güte ist der Rückgang der Unreinheit: Δ = G(parent) − (n_L/n) · G(left) − (n_R/n) · G(right). Der Baum nimmt die Frage mit dem größten Δ und wiederholt das dann in jedem Zweig. Die Entropie, −Σ pₖ log₂ pₖ, ist eine alternative Unreinheit, die sich ähnlich verhält.
Ein Baum der Tiefe d hat höchstens 2^d Blätter. Ein Blatt sagt das Mehrheitslabel seiner Trainingszeilen voraus, ein Blatt mit einem einzigen Passagier sagt also genau das Label dieses Passagiers voraus.
Im Code (Python)
Die 891 Passagiere mit sechs Merkmalen (Geschlecht als 0/1, fehlende Alter mit dem Median der Trainingsdaten gefüllt) und einer stratifizierten Testaufteilung mit 30 %. Das ist derselbe Versuchstyp wie im Lab, aber eine andere Aufteilung, deshalb weichen die Zahlen etwas von denen des Labs ab. Das Notebook, das unter der Ausgabe verlinkt ist, lädt die Daten selbst.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
df = pd.read_csv("data/raw/titanic.csv")
X = pd.DataFrame({"female": (df["sex"] == "female").astype(int)}).join(df[["pclass", "age", "sibsp", "parch", "fare"]])
Xtr, Xte, ytr, yte = train_test_split(X, df["survived"], test_size=0.3, stratify=df["survived"], random_state=1)
Xtr, Xte = Xtr.fillna({"age": Xtr["age"].median()}), Xte.fillna({"age": Xtr["age"].median()}) # Median der Trainingsdaten für beide
print(f"passengers {len(df)}, survived {df['survived'].sum()}")
for d in (1, 3, 20):
t = DecisionTreeClassifier(max_depth=d, random_state=0).fit(Xtr, ytr)
print(f"depth {d:2d}: train {t.score(Xtr, ytr):.3f}, test {t.score(Xte, yte):.3f}, leaves {t.get_n_leaves()}")
Ausgabe
passengers 891, survived 342
depth 1: train 0.780, test 0.802, leaves 2
depth 3: train 0.833, test 0.802, leaves 8
depth 20: train 0.986, test 0.780, leaves 141
Ein Baum der Tiefe 1 ist eine einzige Frage. Der Baum der Tiefe 20 ist auf den Trainingspassagieren fast perfekt und auf den Testpassagieren schlechter als die einzelne Frage.
Notebook herunterladen (.ipynb). Öffne es in Jupyter oder lade es in Google Colab hoch; fehlende Daten lädt es selbst.
Für die Praxis
- Begrenze den Baum:
max_depth,min_samples_leafoderccp_alpha(Pruning). Wähle den Wert per Kreuzvalidierung, nicht nach der Trainingsgenauigkeit. - Lies einen tiefen Baum nicht als Regelwerk. Ein Blatt mit einer Handvoll Passagiere ist Auswendiglernen, kein Muster.
- Bäume brauchen keine skalierten Merkmale, aber sie brauchen Zahlen. Kodiere Kategorien (zum Beispiel Geschlecht als 0/1) und entscheide, was mit fehlenden Werten geschieht. Passe die Imputation nur auf dem Trainingsset an.
- Ein einzelner Baum ist instabil: Eine kleine Änderung der Daten kann den ersten Split ändern. Wenn es dir nur um Genauigkeit geht, ist ein Ensemble aus Bäumen die sicherere Wahl.
- Ein Split ist eine Aussage über diese Daten, nicht über Ursachen. Ticketklasse und Fahrpreis vertreten einander, deshalb kann der Baum auch das eine oder das andere wählen.
War das hilfreich?
Danke! Das hilft uns, besser zu werden.
Mehr im Atlas
Einträge der Enzyklopädie zu den Ideen dieser Lektion: