ML Atlas

Machine Learning von Grund auf · Lektion 5.2 · 27 von 33 fertigen Lektionen · 10 Min.

Ensembles: Warum viele Bäume einen schlagen

Kurz gesagt

Ein Ensemble kombiniert viele unvollkommene Modelle, deren Fehler sich teils aufheben. Deshalb wird ein Random Forest mit mehr Bäumen genauer und stabiler.

Aufwärmen Zwei Fragen aus früheren Lektionen. Eine Minute, und sie blockiert die Lektion nicht.
Aus Lektion 5.1: Entscheidungsbäume: zwanzig Fragen an die Daten Ein Baum ohne Tiefenbegrenzung erreicht eine fast perfekte Trainingsgenauigkeit. Warum ist das ein Warnsignal?

Antwort anzeigen

Richtige Antwort: Er hat wohl einzelne Passagiere auswendig gelernt und verallgemeinert daher schlechter

Ein Baum, der teilt, bis jedes Blatt rein ist, passt sich dem Rauschen der Trainingsstichprobe an – das klassische Zeichen der Überanpassung.

Aus Lektion 4.6: Pipeline: von der Tabelle zur Vorhersage Was macht die Kreuzvalidierung am Training, wenn der Skalierer in der Pipeline sitzt?

Antwort anzeigen

Richtige Antwort: Er passt den Skalierer in jedem Fold neu an, nur an dessen Teil zum Lernen

Eine Pipeline ist ein Modell, also lernt in jedem Fold die ganze Maschine von vorn. Der Fold, der gerade den Test spielt, berührt weder den Skalierer noch kNN.

Bitte eine einzelne Person zu schätzen, wie viele Bonbons in einem großen Glas sind, und die Schätzung liegt vielleicht weit daneben. Frag ein paar Hundert Leute und bilde den Durchschnitt ihrer Schätzungen, und das Ergebnis liegt oft verblüffend nah dran. Keiner der Schätzenden ist klüger geworden. Ihre Fehler zeigten einfach in verschiedene Richtungen und haben sich aufgehoben. Kann man ein Modell genauso bauen, aus vielen mittelmäßigen? Probier es zuerst selbst aus, bevor du die Erklärung liest.

Erst vorhersagen, dann prüfen Ein Random Forest aus nur einem Baum (zufällige Stichprobe der Passagiere, 2 Merkmale zur Auswahl bei jeder Teilung) und ein gewöhnlicher, voll ausgewachsener Baum: Welcher schneidet bei den Testpassagieren besser ab?
Wie sicher bist du?

Interaktives Labor

Dieses interaktive Labor läuft im Browser mit aktiviertem JavaScript. Der Text drumherum beschreibt, was es zeigt.

Antwort anzeigen

Richtige Antwort: Der gewöhnliche Baum

Der Wald mit einem Baum trifft 70,9 % der Testpassagiere, der gewöhnliche Baum 73,9 %: Ein einzelner zufälliger Baum ist sogar schwächer. Erst das Mitteln vieler Bäume hilft: 10 Bäume ergeben 76,1 %, 100 Bäume 76,9 %.

Probier es aus

  • Stell den Regler für die Zahl der Bäume zu Beginn auf eins und vergleiche den Wald mit dem einzelnen Baum. Mit einem Baum ist der „Wald“ nur ein einzelner zufallsgesteuerter Baum.
  • Erhöhe die Zahl der Bäume nach und nach und beobachte die Testgenauigkeit des Waldes. Achte darauf, wo sie sich nicht mehr spürbar verbessert.
  • Erhöhe die Zahl der Bäume weiter. Beginnt die Genauigkeit des Waldes zu fallen wie beim tiefen Baum in Lektion 9, oder pendelt sie sich ein?
  • Vergleiche den einzelnen Baum mit dem großen Wald. Welchem würdest du einen Fall anvertrauen, den du noch nie gesehen hast?

Die Idee in einfachen Worten

Ein Ensemble ist ein Modell aus vielen Modellen, deren Vorhersagen kombiniert werden – per Abstimmung bei Kategorien oder per Mittelwert bei Zahlen. Das berühmteste Ensemble ist der Random Forest (Zufallswald), 2001 von Leo Breiman vorgestellt: eine große Zahl von Entscheidungsbäumen, jeder ein wenig anders gewachsen, die gemeinsam abstimmen.

Lektion 9 endete mit einer Schwäche von Bäumen: Eine kleine Änderung in den Daten kann einen völlig anderen Baum erzeugen. Ein einzelner tiefer Baum ist wie ein übermütiger Schätzer – scharfsinnig, aber sprunghaft. Ein Wald macht aus dieser Sprunghaftigkeit einen Vorteil. Wenn jeder Baum andere Fehler macht, liegt die Mehrheitsabstimmung öfter richtig als ein typischer Baum.

Warum es funktioniert

Das Schlüsselwort ist andere. Identische Modelle zu mitteln, ändert nichts; ihre Fehler sind dieselben. Ein Random Forest sorgt auf zwei Arten dafür, dass sich seine Bäume unterscheiden. Erstens wird jeder Baum auf einer Bootstrap-Stichprobe trainiert: Zeilen, die zufällig und mit Zurücklegen aus den Trainingsdaten gezogen werden, sodass jeder Baum einen leicht anderen Datensatz sieht, in dem manche Zeilen mehrfach vorkommen und andere fehlen. Diese Idee heißt Bagging. Zweitens darf ein Baum bei jeder Teilung nur unter einer zufälligen Teilmenge der Merkmale wählen, sodass sich nicht alle Bäume auf dasselbe stärkste Merkmal stützen.

Die Statistik sagt uns, wie viel das bringt. Hat der Fehler jedes Baums die Varianz σ² und sind die Fehler zweier Bäume mit der Korrelation ρ verbunden, dann hat der Durchschnitt von n Bäumen die Varianz

ρ·σ² + (1 − ρ)·σ² / n

Der zweite Term schrumpft, wenn man Bäume hinzufügt, und verschwindet bei großem n. Der erste Term nicht: Er ist der Teil des Fehlers, den alle Bäume teilen. Deshalb ist Zufall so wichtig. Je weniger sich die Bäume ähneln (je kleiner ρ), desto mehr gewinnt der Wald – und deshalb bringen zusätzliche Bäume ab einem gewissen Punkt fast nichts mehr.

Eine angenehme Folge: Mehr Bäume lassen einen Wald nicht mehr auswendig lernen. Jeder neue Baum gibt einfach seine Stimme ab, und die Vorhersagen des Waldes beruhigen sich, statt wilder zu werden. Der Preis für mehr Bäume ist Rechenzeit, keine Überanpassung.

Es gibt eine zweite große Familie von Ensembles, das Boosting, das umgekehrt vorgeht: Statt unabhängiger Bäume, die abstimmen, baut es kleine Bäume nacheinander, und jeder korrigiert die Fehler der vorherigen. Gradient-Boosted Trees gewinnen häufig bei tabellarischen Daten, auch in vielen Kaggle-Wettbewerben.

Häufiger Fehler

Ein Ensemble kann keine Information erzeugen, die nicht in den Merkmalen steckt. Wenn jeder Baum auf dieselbe Weise getäuscht wird – etwa durch ein Merkmal, das die Antwort verrät, oder durch Daten, die die Menschen, für die man vorhersagt, nicht repräsentieren –, wiederholt die Abstimmung denselben Fehler nur mit mehr Überzeugung. Der korrelierte Term in der Formel ist genau dieser gemeinsame Fehler. Ein weiterer Fehler ist die Annahme, mehr Bäume helfen immer: Wenn die Gewinne abflachen, kosten zusätzliche Bäume nur Zeit. Und schließlich ist ein Wald viel schwerer zu lesen als ein einzelner Baum; du tauschst das Flussdiagramm gegen Genauigkeit.

Bäume und Wälder zerlegen den Merkmalsraum in Kästen. In der nächsten Lektion lernen wir ein Modell kennen, das seine Grenze stattdessen sanft biegt: das neuronale Netz.

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.

1. Warum hilft es nur dann, viele Bäume zu mitteln, wenn sich die Bäume unterscheiden?
Antwort anzeigen

Richtige Antwort: Identische Bäume machen identische Fehler, also hebt das Mitteln nichts auf

Fehler heben sich nur auf, wenn sie in verschiedene Richtungen zeigen; der gemeinsame Teil des Fehlers bleibt nach dem Mitteln bestehen.

2. Was ist eine Bootstrap-Stichprobe?
Antwort anzeigen

Richtige Antwort: Zeilen, die zufällig mit Zurücklegen aus den Trainingsdaten gezogen werden

Das Ziehen mit Zurücklegen gibt jedem Baum einen leicht anderen Datensatz, sodass die Bäume auf nützliche Weise uneins sind.

3. Du vergrößerst einen Random Forest von 300 auf 3000 Bäume. Was ist die wahrscheinlichste Wirkung?
Antwort anzeigen

Richtige Antwort: Die Genauigkeit bleibt etwa gleich, das Training dauert aber viel länger

Sobald sich der unabhängige Teil des Fehlers herausgemittelt hat, bringen mehr Bäume zusätzliche Rechenzeit, aber kaum Genauigkeit und kein zusätzliches Auswendiglernen.

Das Wichtigste

  • Ein Ensemble kombiniert viele Modelle; Fehler, die in verschiedene Richtungen zeigen, heben sich auf.
  • Ein Random Forest macht Bäume durch Bootstrap-Stichproben und zufällige Merkmalsauswahl verschieden.
  • Der Fehler, den alle Bäume teilen, mittelt sich nicht heraus, deshalb flachen die Gewinne mit mehr Bäumen ab.
  • Mehr Bäume kosten Zeit, führen aber nicht zur Überanpassung; Boosting ist eine zweite, sequenzielle Ensemble-Familie.

Tiefer: Formel, Code, Praxis

Die Mathematik

Ein Wald mittelt die Vorhersagen von n Bäumen. Der Fehler jedes Baums habe die Varianz σ², und die Fehler zweier beliebiger Bäume haben die Korrelation ρ. Dann hat der Durchschnitt die Varianz:

  • Var = ρ·σ² + (1 − ρ)·σ² / n
  • Der zweite Term, (1 − ρ)·σ² / n, ist der Teil, der mit jedem zusätzlichen Baum schrumpft.
  • Der erste Term, ρ·σ², ist der Boden: der Fehler, den alle Bäume gemeinsam haben. Keine Anzahl von Bäumen beseitigt ihn.
  • Bei unabhängigen Bäumen (ρ = 0) fällt die Varianz wie σ² / n. Bei identischen Bäumen (ρ = 1) fällt sie gar nicht.
  • Bootstrap-Stichproben und zufällige Merkmalsteilmengen gibt es, um ρ zu senken.
  • Das Mitteln verringert nur den Varianzanteil des Fehlers. Der Bias, den alle Bäume teilen, bleibt, ein Wald aus verzerrten Bäumen ist also immer noch verzerrt.
Im Code (Python)

Ein echter Random Forest auf den Titanic-Passagieren, mit 2 Merkmalen, die bei jedem Split probiert werden. Er nutzt dieselbe Aufteilung wie der Code von Lektion 9, nicht die des Labs, deshalb weichen die Zahlen von den 73,9 % und 76,9 % des Labs ab. Das Notebook, das unter der Ausgabe verlinkt ist, lädt die Daten selbst.

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
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
tree = DecisionTreeClassifier(random_state=0).fit(Xtr, ytr)
print(f"one full tree: test {tree.score(Xte, yte):.3f}")
for n in (1, 10, 100, 500):
    forest = RandomForestClassifier(n_estimators=n, max_features=2, random_state=0).fit(Xtr, ytr)
    print(f"forest of {n:3d}: test {forest.score(Xte, yte):.3f}")
oob = RandomForestClassifier(n_estimators=500, max_features=2, oob_score=True, random_state=0).fit(Xtr, ytr)
print(f"out-of-bag estimate (500 trees, training rows only): {oob.oob_score_:.3f}")

Ausgabe

one full tree: test 0.780
forest of   1: test 0.754
forest of  10: test 0.806
forest of 100: test 0.802
forest of 500: test 0.802
out-of-bag estimate (500 trees, training rows only): 0.809

Ein randomisierter Baum (0,754) ist schlechter als ein voller Baum (0,780), aber das Abstimmen schlägt beide: 10 Bäume ergeben 0,806, und 100 und 500 Bäume ergeben 0,802. Der Wald pendelt sich ein, statt wie der tiefe Baum in Lektion 9 zu fallen. Die Out-of-Bag-Schätzung, 0,809, wird nur aus den Trainingszeilen berechnet.

Für die Praxis
  • Beginne mit den Standardwerten, zum Beispiel 100 bis 500 Bäume, und prüfe dann auf Validierungsdaten, wo die Kurve flach wird. Darüber hinaus kosten zusätzliche Bäume nur Zeit und Speicher.
  • Stelle die Zahl der pro Split probierten Merkmale und die Tiefe oder Blattgröße ein, bevor du die Zahl der Bäume einstellst. Diese Größen verändern, wie korreliert die Bäume sind.
  • Nutze den Out-of-Bag-Wert (oob_score=True) als kostenlose Schätzung: Jede Trainingszeile wird nur von den Bäumen vorhergesagt, deren Bootstrap-Stichprobe sie ausgelassen hat, und diese Vorhersagen werden bewertet. Stelle nichts auf dem Testset ein.
  • Prüfe, woher die Daten stammen, bevor du der Abstimmung traust. Täuscht ein durchsickerndes Merkmal jeden Baum, wiederholt der Wald den Fehler mit mehr Überzeugung.
  • Ein Wald ist schwer zu lesen. Merkmalswichtigkeiten geben eine grobe Rangfolge, aber sie bevorzugen Merkmale mit vielen verschiedenen Werten; die Permutationswichtigkeit auf zurückgehaltenen Daten ist eine sicherere Prüfung.

Mehr im Atlas

Einträge der Enzyklopädie zu den Ideen dieser Lektion: