Der Entscheidungsbaum verständlich erklärt
Ein Entscheidungsbaum sortiert Lieferungen mit einer Kette von Ja-Nein-Fragen und sagt voraus, ob eine Lieferung zu spät kommt. Bleibt er flach, kann man ihn lesen. Wächst er tief, passt er sich den Zufällen der Lernlieferungen an und wird auf neuen Lieferungen nicht besser. Die Seite erklärt das erst ohne Formeln, dann für Fachleute, und ist der Einstieg in das Thema „Baumbasierte Verfahren“.
Zuletzt aktualisiert:
Ein Wort unbekannt? Das Begriffsverzeichnis erklärt es in wenigen Sätzen.
Eine Kette von Ja-Nein-Fragen
Stellen Sie sich einen Disponenten vor, der abschätzt, welche Lieferungen heute zu spät kommen. Seine Faustregel: Ist die Ladung schwer? Wenn ja: Ist der Verkehr dicht? Wenn auch das stimmt, plant er Reserve ein. Jede Frage hat nur die Antworten Ja oder Nein, und jede Antwort führt zur nächsten Frage oder zu einem Urteil wie „pünktlich“ oder „zu spät“. Gezeichnet ergibt das einen umgedrehten Baum: oben die erste Frage, unten die Urteile. So kommt der Entscheidungsbaum zu seinem Namen; ein Urteil am unteren Ende heißt Blatt.
Solche Fragen muss niemand erfinden. Man gibt einem Rechenverfahren viele frühere Lieferungen, von denen man weiß, ob sie pünktlich waren, mit ihren Eigenschaften: Entfernung, Ladegewicht, Verkehr, Wetter, Wochentag. Fachleute nennen sie Merkmale; jede Frage betrifft genau eins. Daraus baut das Verfahren selbst einen Fragenbaum, zum Beispiel das gängige Verfahren CART. Hier geht es um den Ja-Nein-Fall. Zur Seite gehört eine Demo, eine Anwendung zum Ausprobieren im Browser, die mit erzeugten Lieferungen arbeitet.
Wie der Baum seine Fragen findet
Der Baum entsteht von oben nach unten. Am Anfang bilden alle früheren Lieferungen eine Gruppe. Das Verfahren probiert jede denkbare Frage aus, etwa „Ladegewicht höher als diese Grenze?“, mit jeder Grenze und für jedes Merkmal. Es behält die Frage, nach der beide neuen Gruppen möglichst einheitlich sind: in der einen fast nur pünktliche, in der anderen fast nur verspätete Lieferungen. Dasselbe wiederholt es in jeder Gruppe.
Bei jeder Frage zählt nur, was sie sofort bringt; ob zwei Fragen zusammen mehr leisten als einzeln, prüft das Verfahren nicht. Fachleute nennen das gierig. Es hält an, wenn eine Gruppe nur noch eine Sorte Lieferungen enthält, zu wenige Lieferungen übrig sind oder eine selbst eingestellte Zahl von Fragenebenen erreicht ist. Die Demo zeigt den Baum Frage für Frage wachsen.
Flach bleibt verständlich, tief lernt Zufälle mit
Erlaubt man beliebig viele Fragen, hört der Baum erst auf, wenn jede Gruppe aus einer Sorte besteht. Auf den früheren Lieferungen liegt er dann nie daneben, solange keine zwei Lieferungen mit gleichen Merkmalen verschiedene Ergebnisse haben. Das klingt gut, ist aber ein Warnzeichen, denn unter den früheren Lieferungen stecken Zufälle, Rauschen genannt. Ein ausgedachtes Beispiel, nicht aus der Demo: Eine Lieferung kam zu spät, weil ein Fahrer ausfiel, obwohl nichts in ihren Merkmalen darauf hindeutet. Ein sehr tiefer Baum baut dafür eine eigene Frage, etwa „Dienstag, Regen, viele Stopps: zu spät“, auch wenn das nur einmal vorkam. Für neue Lieferungen gilt diese Regel nicht. Das heißt Überanpassung.
Prüfen kann man das nur an Lieferungen, die der Baum beim Lernen nie gesehen hat. Deshalb legt man vorab einen Teil der bekannten Lieferungen beiseite. Aus dem übrigen Teil, dem Training, lernt der Baum; der beiseitegelegte Teil heißt Test. Dann rechnet man die Fehlerquote getrennt aus. In der Demo ist der tiefe Baum auf dem Training fehlerfrei und auf dem Test ungefähr so gut wie ein flacher Baum mit wenigen Fragen. Den flachen kann ein Disponent von Hand durchgehen.
In der Demo sagt der tiefe Baum für manche Lieferungen „sicher zu spät“ und irrt sich, weil das Urteil nur auf wenigen früheren Lieferungen beruht. Eine eigene Kennzahl der Demo macht das sichtbar; der Fachteil erklärt sie.
Zurückschneiden, und was trotzdem bleibt
Ein Gegenmittel ist das Beschneiden: Man lässt den Baum zuerst voll wachsen und kappt dann nacheinander die Äste, die ihm am wenigsten bringen.
Wie weit man kappt, darf nicht der Test entscheiden, sonst wäre er nicht mehr unabhängig. Stattdessen prüft man verschieden stark gekappte Bäume an Teilen des Trainings, die der jeweilige Baum nicht gesehen hat. Im Standardbeispiel der Demo hat der beschnittene Baum weniger Blätter als der volle und auf dem Test etwas weniger Fehler.
Eine zweite Schwäche bleibt: Ein einzelner Baum ist instabil. Mit etwas anderen früheren Lieferungen kann ein anderer Baum entstehen, vor allem in den unteren Fragen. In der Demo bleibt die erste Frage gleich, weil das Ladegewicht die Lieferungen eindeutig am besten teilt; weiter unten ändern sich die Fragen. Wer mehr Verlässlichkeit braucht, kann viele Bäume bauen und ihre Antworten zusammen auswerten; solche Wälder zeigen weitere Demos auf dieser Website.
Wie ernst ist das Modell zu nehmen?
Alle Lieferungen in der Demo sind erzeugt. Der Autor hat festgelegt, wie sich die Dauer aus den Merkmalen ergibt, zum Beispiel: Ab einem bestimmten Verkehrsaufkommen entsteht Stau, schwere Ladung verlängert jeden Stopp. Das sind Regeln dieses Beispiels, keine Aussagen über echte Ursachen im Betrieb. Die Demo zeigt, wie sich ein Entscheidungsbaum verhält, nicht wie gut er in einem bestimmten Betrieb wäre.
Was Sie mitnehmen: Ein Baum mit wenigen Fragen ist lesbar und war in der Demo auf neuen Lieferungen ungefähr so gut wie ein sehr tiefer. Fragen Sie bei jedem Baum, wie oft er auf Lieferungen falsch liegt, die er beim Lernen nie gesehen hat, und vergleichen Sie das mit seinem Fehler auf den früheren. Ein großer Abstand deutet auf Überanpassung hin, jedenfalls solange die zurückgehaltenen Lieferungen dem späteren Alltag ähneln. Im Betrieb erkennen Sie sie daran, dass die Trefferquote nach einigen Monaten schlechter ist als in der Vorführung.
Hinweis: Alle Demos rechnen mit synthetischen oder frei verfügbaren Beispieldaten und laufen auf einem externen Anbieter (Datenschutz). Bitte geben Sie darin keine vertraulichen oder personenbezogenen Daten ein. Die Ergebnisse gelten für die jeweilige Demo-Instanz und lassen sich nicht ungeprüft auf reale Fälle übertragen; für darauf gestützte Entscheidungen übernehme ich keine Gewähr.
Modell und Annahmen
Dieser Teil ist eigenständig lesbar. Er fasst die formale Beschreibung der Demo zusammen; die vollständige Fassung steht im Expander „📐 Mathematische Formulierung“ der Demo.
- Modell: Trainingsdaten \((x_i,y_i)_{i=1}^N\) mit \(x_i\in\mathbb{R}^d\). Ein Baum \(T\) teilt den Merkmalsraum durch Splits \(x_j\le s\) in Rechtecke (Blätter) und sagt in jedem Blatt den Anteil der Klasse „zu spät“ (Klassifikation) bzw. den Mittelwert der \(y_i\) im Blatt (Regression) voraus.
- Split-Suche: je Merkmal sortieren; kumulative Summen liefern die Unreinheit beider Kinder für alle Schwellen in einem Zug. Kandidaten sind die Mitten zwischen verschiedenen benachbarten Werten, zulässig nur mit der Mindestblattgröße \(m\). Bei Gleichstand gewinnt das kleinste Merkmal, dann die kleinste Schwelle. Gewachsen wird in Breitenreihenfolge, damit „der Baum nach \(k\) Splits“ einfach ein Baum ist.
- Beschneiden: Kosten-Komplexität (kleinstes effektives \(\alpha\) zuerst); \(\alpha\) wird per fünffacher Kreuzvalidierung nur auf dem Training gewählt, höchstens 40 Kandidaten, bei Gleichstand das größere.
- Daten: erzeugte Lieferungen mit acht echten Merkmalen (Distanz, Ladegewicht, Stopps, Verkehr, Wetter, Wochentag, Zeitfenster-Enge, Fahrerjahre) und einstellbar vielen Rauschmerkmalen ohne Bezug zum Ziel; Aufteilung 70 % Training, 30 % Test. Klassifikation („kommt zu spät?“) und Regression („wie lange dauert sie?“) laufen auf denselben Merkmalen.
- Umsetzung: der Baum ist von Grund auf in numpy geschrieben, scikit-learn kommt nur in den Tests als Gegenprobe vor. Gütemaße (Fehlerquote, AUC über die Rangsumme, Log-Loss, RMSE, MAE, R²) sind von Hand berechnet.
Die Formeln
Die Unreinheit \(I(t)\) eines Knotens \(t\) misst, wie gemischt er ist. Bei zwei Klassen mit dem Anteil \(p\) der Klasse „zu spät“ gibt es zwei Maße, Gini und Entropie (in bit); bei einem Zahlenziel ist es die Varianz.
\[I(t)=2p(1-p)\]
\[I(t)=-p\log_2 p-(1-p)\log_2(1-p)\]
Der Gain eines Splits \((j,s)\) mit den Kindern \(t_L=\{x_j\le s\}\) und \(t_R=\{x_j>s\}\) ist die Unreinheit vorher minus die mit den Kindergrößen gewichtete Unreinheit der beiden Kinder. Der Split mit dem größten Gain gewinnt. Ein Knoten kostet mit dem Sortieren \(O(d\,\lvert t\rvert\log\lvert t\rvert)\).
\[\Delta(j,s)=I(t)-\frac{|t_L|}{|t|}I(t_L)-\frac{|t_R|}{|t|}I(t_R)\]
Beim Beschneiden ist \(R(T)\) die gewichtete Unreinheit der Blätter und \(R_\alpha(T)=R(T)+\alpha\lvert T\rvert\) der mit einem Preis \(\alpha\) je Blatt bestrafte Fehler. Für einen inneren Knoten \(t\) mit Teilbaum \(T_t\) gibt das effektive \(\alpha_t\) an, ab welchem Preis es sich lohnt, \(T_t\) durch ein Blatt zu ersetzen.
\[\alpha_t=\dfrac{R(t)-R(T_t)}{|T_t|-1}\]
Man kappt immer den Teilbaum mit dem kleinsten \(\alpha_t\). Das ergibt eine Kette immer kleinerer Bäume; zu jedem \(\alpha\) gehört genau ein kleinster Baum, der \(R_\alpha\) minimiert. Die Kreuzvalidierung wählt aus dieser Kette das \(\alpha\) mit dem kleinsten mittleren Fehler auf den jeweils zurückgehaltenen Teilen des Trainings.
Der Log-Loss bewertet die vorhergesagte Wahrscheinlichkeit \(p\) (auf \([10^{-15},1-10^{-15}]\) begrenzt) und dem tatsächlichen Ergebnis \(y\) (0 oder 1). Er bestraft sichere Irrtümer, also Blätter mit \(p\) nahe 0 oder 1, die sich irren, sehr stark; die Fehlerquote sieht das nicht.
\[-\frac1n\sum\big(y\ln p+(1-y)\ln(1-p)\big)\]
Befunde
Alle Zahlen stammen aus der README der Demo; sie sind dort gemessen und in tests/test_claims.py festgehalten. Der Standardfall ist die Klassifikation „zu spät“ mit 1200 Lieferungen, 3 Rauschmerkmalen, 70 % Training und 30 % Test, Zufalls-Seed 7. Zahlen mit „Mittel über sechs Datensätze“ gelten für sechs erzeugte Datensätze mit denselben Regeln; wo es nicht anders steht, gelten die Zahlen für den Standardfall.
| Frage | Befund |
|---|---|
| Wie gut ist ein flacher Baum? (Tiefe 3, Blatt ≥ 5) | 8 Blätter, Trainingsfehler 15,8 %, Testfehler 17,2 % (Raten: 46,4 %), AUC 0,882, Log-Loss 0,42. Der erste Split ist das Ladegewicht (798 kg), danach der Verkehr. |
| Was bringt ein voll gewachsener Baum? (Tiefe 16, Blatt ≥ 1) | 100 Blätter, Trainingsfehler 0 %, Testfehler 16,7 %, kaum anders als beim flachen Baum. Die Genauigkeit täuscht: AUC 0,830 statt 0,882, Log-Loss 5,76 statt 0,42 (Blätter mit 0 % oder 100 %, die sich sicher irren). |
| Hilft Beschneiden? (alpha per Kreuzvalidierung nur auf dem Training) | 100 → 17 Blätter (alpha 0,004), Testfehler 16,4 %, AUC 0,890, Log-Loss 0,58. Auf fünf weiteren Datensätzen ist der so beschnittene Baum im Mittel um mehr als 2 Punkte besser als der volle (laut README in den Tests festgehalten). Die Testkurve über den Pfad hat ihr Minimum in der Mitte (34 Blätter, 13,9 %); sie dient nur als Diagnose, gewählt wird nie mit den Testdaten. |
| Wie viel kostet die Tiefe auf dem Test? (Mittel über sechs Datensätze) | Voll gewachsener Baum gegen die im Nachhinein am Test gewählte beste Tiefe: Klassifikation 20,4 % gegen 15,5 % (beste Tiefe 3 bis 6), Regression 14,6 gegen 13,3 min (beste Tiefe 5 bis 8). Der deutlichere Befund ist die Lücke zwischen Training und Test, der Log-Loss und die Instabilität. |
| Wie wirken falsche Etiketten im Training? (Mittel über sechs Datensätze, Test bleibt sauber) | Testfehler des vollen Baums bei 0 / 10 / 20 % vertauschten Etiketten: 20,4 / 25,4 / 35,0 %. Ein flacher Baum (Tiefe 4, Blatt ≥ 5): 17,1 / 17,1 / 21,8 %. |
| Benutzt der volle Baum Rauschmerkmale? (Mittel über sechs Datensätze) | Ja: 16 % seiner Splits (3 Rauschmerkmale) bzw. 29 % (8 Rauschmerkmale) liegen auf Rauschen, fast alle tief im Baum (in den ersten vier Ebenen zusammen nur 5 bzw. 8 Splits über sechs Datensätze). |
| Wie instabil ist ein Baum? (30 Bäume auf Bootstrap-Stichproben bzw. auf 95 % der Trainingszeilen) | Ein voll gewachsener Baum ändert die Vorhersage auf mehr als 16 % der Testlieferungen (Bootstrap) bzw. mehr als 8 % (5 % der Zeilen weg). Ein Baum der Tiefe 3 ist in allen sechs Datensätzen stabiler, wechselt aber in den oberen zwei Ebenen den Aufbau. Die Wurzel ist stabil: alle 30 Bäume beginnen mit demselben Merkmal, bei Klassifikation und Regression. |
| Gini oder Entropie? | Fast austauschbar: in 2 von 6 Datensätzen dieselben Merkmale in den ersten sieben Splits, die Vorhersagen (Tiefe 4, Blatt ≥ 5) stimmen zu 92 bis 98 % überein. |
| Wie gut ist die Regression? (Tiefe 4, Blatt ≥ 5) | 16 Blätter, Trainings-RMSE 12,3 min, Test-RMSE 14,4 min gegen 27,2 min beim Mittelwert (R² 0,719); wichtigster Split ist die Distanz (65,5 %). Der Baum liefert eine Treppe, keine Gerade. |
Grenzen
- Gieriger Split: Jeder Split ist nur für den nächsten Schritt der beste. Zwei Splits, die erst zusammen etwas bringen (Wechselwirkung), findet die Suche nur, wenn schon der erste allein etwas bringt.
- Stufen statt Geraden: Ein Baum liefert eine Stufenfunktion. Eine lineare Steigung braucht viele Blätter, und über die Trainingsdaten hinaus sagt er den Wert des äußersten Blatts voraus. Alle Splits stehen senkrecht zu einer Achse, eine schräge Grenze wird zur Treppe.
- Wichtigkeit ist keine Ursache: Die Wichtigkeit im Einzelbaum ist instabil und begünstigt Merkmale mit vielen möglichen Schwellen; ein Rauschmerkmal, das der Baum tief unten benutzt, bekommt Wichtigkeit.
- Gleichstände: In kleinen Knoten sind mehrere Splits gleich gut. scikit-learn wählt zufällig, diese Umsetzung das kleinste Merkmal; deshalb stimmen die Bäume nur dort exakt mit scikit-learn überein, wo es keine Gleichstände gibt.
- Erzeugte Daten: Dass Überanpassung sichtbar wird, hängt an der gewählten Dauer aus Schwellen und Stufen. In einer ersten Fassung der Daten (ein Unterschied zweier großer, fast gerader Terme plus Rauschen) stieg der Testfehler nie mit der Tiefe. Auch jetzt steigt er nur mäßig; die Befunde gelten für diese Daten und Regler.
- Merkmalsarten: Die Wochentage stehen als Zahl im Baum und werden wie jedes Merkmal mit „≤“ geteilt; Merkmale mit vielen ungeordneten Stufen behandelt das Verfahren nicht gesondert.
Quellen
- Breiman, L., Friedman, J. H., Olshen, R. A., Stone, C. J. (1984): Classification and Regression Trees. Wadsworth.
- Quelltext, Tests und Gegenproben der Demo: github.com/sebastian-hanisch/cart-demo.
Die Arbeit wurde für diese Seite nicht nachgeschlagen. Autoren und Jahr stammen aus der README der Demo; der Titel und der Verlag stammen aus dem Gedächtnis des Autors und sind nicht gegen das Original geprüft. Die Form des Gain und der Kosten-Komplexität folgt der Formulierung in der Demo.