0Pricing
R Academy · Lektion

Entscheidungsbäume: Grundlage von Ensembles

Erstellen und visualisieren Sie Entscheidungsbäume mit rpart und verstehen Sie den Bias-Varianz-Trade-off

Entscheidungsbäume: Grundlage von Ensembles ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Wie sich Entscheidungsbäume aufteilen

Ein Entscheidungsbaum unterteilt den Merkmalsraum rekursiv in rechteckige Bereiche. An jedem Knoten durchsucht der Algorithmus alle Merkmale und alle möglichen Trennpunkte, um die Aufteilung zu finden, die die Zielvariable am besten trennt. Das Ergebnis ist ein Baum aus Wenn-dann-Regeln.

library(rpart)

# Fit a classification tree
tree <- rpart(
  Species ~ .,
  data   = iris,
  method = 'class'  # use 'anova' for regression
)

print(tree)

GINI- gegenüber Entropie-Trennkriterien

Das Trennkriterium misst die Unreinheit eines Knotens. Die Gini-Unreinheit misst die Wahrscheinlichkeit, ein zufällig ausgewähltes Element falsch zu klassifizieren. Die Entropie (der Informationsgewinn) misst die Verringerung der Informationsungeordnetheit. Beide Kriterien erzeugen meist ähnliche Bäume; Gini lässt sich schneller berechnen und ist die Standardeinstellung von rpart.

# Default: Gini impurity (parms = list(split = 'gini'))
tree_gini <- rpart(Species ~ ., data = iris, method = 'class')

# Using information gain (entropy)
tree_entropy <- rpart(
  Species ~ ., data = iris, method = 'class',
  parms = list(split = 'information')
)

cat('Gini root split:', tree_gini$frame$var[1])
cat('Entropy root split:', tree_entropy$frame$var[1])

printcp() — Komplexitätstabelle

printcp(tree) gibt die Tabelle der Komplexitätsparameter (CP) aus. Jede Zeile zeigt die Baumgröße (Anzahl der Splits), den relativen Fehler auf den Trainingsdaten und den kreuzvalidierten Fehler (xerror). Die CP-Tabelle wird verwendet, um die optimale Beschneidungsstufe zu bestimmen.

tree <- rpart(medv ~ ., data = MASS::Boston, method = 'anova',
              control = rpart.control(minsplit = 5, cp = 0.001))

printcp(tree)

# Identify the CP with minimum cross-validated error
best_cp <- tree$cptable[
  which.min(tree$cptable[, 'xerror']),
  'CP'
]
cat('Best CP:', best_cp)

prune() — Baum beschneiden

prune(tree, cp) beschneidet den Baum auf die durch cp festgelegte Komplexitätsstufe. Durch das Beschneiden wird Overfitting verhindert, indem Zweige zusammengeführt werden, die nur einen geringen Vorhersagewert haben. Der übliche Ansatz besteht darin, den CP-Wert mit dem kleinsten CV-Fehler zu ermitteln und anschließend den Baum zu beschneiden.

best_cp <- tree$cptable[
  which.min(tree$cptable[, 'xerror']), 'CP'
]

pruned_tree <- prune(tree, cp = best_cp)

cat('Original tree nodes:', nrow(tree$frame))
cat('Pruned tree nodes:', nrow(pruned_tree$frame))

rpart.plot() — Baum visualisieren

rpart.plot(tree) aus dem Paket rpart.plot erzeugt eine übersichtliche, farbige Visualisierung des Entscheidungsbaums. Jeder innere Knoten zeigt die Split-Regel; jedes Blatt zeigt die vorhergesagte Klasse und den Anteil der Trainingsbeispiele.

library(rpart.plot)

tree <- rpart(Species ~ ., data = iris, method = 'class')
pruned <- prune(tree, cp = 0.02)

rpart.plot(
  pruned,
  type   = 4,     # split labels on branches
  extra  = 104,   # show class + probability
  fallen.leaves = TRUE
)

Bias-Varianz-Abwägung

Ein tiefer, unbeschnittener Baum hat einen geringen Bias (er passt die Trainingsdaten nahezu perfekt an), aber eine hohe Varianz (kleine Änderungen an den Daten führen zu sehr unterschiedlichen Bäumen). Ein flacher oder beschnittener Baum hat einen höheren Bias, aber eine geringere Varianz. Der optimale Baum bildet ein Gleichgewicht zwischen diesen beiden Fehlerquellen.

Ensemble-Methoden wie Random Forests und Boosting setzen direkt an diesem Zielkonflikt an.

# Deep tree = low bias, high variance (overfits)
deep_tree <- rpart(medv ~ ., data = MASS::Boston,
                   control = rpart.control(minsplit = 2, cp = 0))

# Shallow tree = high bias, low variance (underfits)
shallow_tree <- rpart(medv ~ ., data = MASS::Boston,
                      control = rpart.control(maxdepth = 2))

cat('Deep nodes:', nrow(deep_tree$frame))
cat('Shallow nodes:', nrow(shallow_tree$frame))

Overfitting bei einem Entscheidungsbaum

Ein unbeschnittener Baum kann durch das Auswendiglernen jedes Trainingsbeispiels einen Trainingsfehler von null erreichen. Wird derselbe Baum auf unbekannten Daten ausgewertet, bricht seine Leistung ein. Dies ist das klassische Beispiel für Overfitting beim überwachten Lernen.

set.seed(42)
train_idx <- sample(nrow(MASS::Boston), 400)
train_bos <- MASS::Boston[train_idx, ]
test_bos  <- MASS::Boston[-train_idx, ]

# Fully grown tree
full <- rpart(medv ~ ., data = train_bos,
              control = rpart.control(cp = 0, minsplit = 2))

train_pred <- predict(full, train_bos)
test_pred  <- predict(full, test_bos)

cat('Train RMSE:', sqrt(mean((train_pred - train_bos$medv)^2)))
cat('Test  RMSE:', sqrt(mean((test_pred  - test_bos$medv)^2)))

Variablenwichtigkeit aus rpart

rpart speichert für jeden Prädiktor variable.importance: die gesamte Verbesserung des Split-Kriteriums, die dieser Variable über alle Splits hinweg zuzuschreiben ist. Dies liefert einen schnellen Hinweis darauf, welche Features die Entscheidungen des Modells bestimmen.

tree <- rpart(medv ~ ., data = MASS::Boston, method = 'anova')

# Variable importance (sorted)
imp <- sort(tree$variable.importance, decreasing = TRUE)
print(imp)

# Quick barplot
barplot(imp, las = 2, main = 'Variable Importance',
        col = 'steelblue', cex.names = 0.8)

Von Bäumen zu Ensembles

Ein einzelner Entscheidungsbaum ist instabil: Eine erneute Stichprobenziehung der Daten erzeugt sehr unterschiedliche Bäume. Ensemble-Methoden nutzen diese Instabilität:

  • Bagging / Random Forests: Mitteln die Ergebnisse vieler Bäume, die auf Bootstrap-Stichproben trainiert wurden.
  • Boosting: Erzeugt Bäume nacheinander, wobei jeder die Fehler des vorherigen Baums korrigiert.
  • Beide Verfahren reduzieren die Varianz und erhalten gleichzeitig die Ausdrucksstärke von Bäumen.
# Demonstrating instability of a single tree
set.seed(1); t1 <- rpart(medv ~ ., data = MASS::Boston[sample(506, 400), ])
set.seed(2); t2 <- rpart(medv ~ ., data = MASS::Boston[sample(506, 400), ])

# Root split may differ between trees
cat('Tree 1 root split:', t1$frame$var[1])
cat('Tree 2 root split:', t2$frame$var[1])

Steuerungsparameter von rpart

rpart.control() legt fest, wie der Baum wächst. Wichtige Parameter sind: cp (Komplexitätsstrafe), minsplit (Mindestanzahl an Beobachtungen, ab der ein Split versucht wird), minbucket (Mindestgröße eines Blatts) und maxdepth. Das Verständnis dieser Parameter ist für die Abstimmung baumbasierter Modelle unerlässlich.

ctrl <- rpart.control(
  cp        = 0.005,  # complexity penalty
  minsplit  = 20,     # min obs to try a split
  minbucket = 7,      # min obs in any leaf
  maxdepth  = 10      # max tree depth
)

tree <- rpart(medv ~ ., data = MASS::Boston,
              method = 'anova', control = ctrl)

printcp(tree)

Baumleistung bewerten

Bewerten Sie den Baum nach dem Beschneiden auf dem zurückgehaltenen Testdatensatz. Berechnen Sie bei Regression RMSE und R², bei Klassifikation die Genauigkeit und die Konfusionsmatrix. Vergleichen Sie diese Kennzahlen mit Benchmark-Modellen, um den Nutzen eines einzelnen Baums einzuschätzen.

pruned_tree <- prune(tree, cp = best_cp)

test_pred <- predict(pruned_tree, newdata = test_bos)

rmse <- sqrt(mean((test_pred - test_bos$medv)^2))
ss_res <- sum((test_pred - test_bos$medv)^2)
ss_tot <- sum((test_bos$medv - mean(test_bos$medv))^2)
r2 <- 1 - ss_res / ss_tot

cat('RMSE:', round(rmse, 3))
cat('R2:', round(r2, 3))

Kurztest

Welche Aussage beschreibt am besten den Zweck des Aufrufs prune(tree, cp = best_cp)?

Zusammenfassung: Entscheidungsbäume

Die wichtigsten Erkenntnisse aus „Entscheidungsbäume — Grundlage von Ensembles“:

  • Bäume unterteilen den Merkmalsraum rekursiv; für Splits werden Gini- oder Entropie-Kriterien verwendet.
  • rpart(y ~ ., data, method) passt den Baum an; printcp() zeigt die Komplexitätstabelle.
  • Ermitteln Sie den CP-Wert mit dem kleinsten kreuzvalidierten Fehler und verwenden Sie anschließend prune(tree, cp).
  • rpart.plot() visualisiert die Baumstruktur.
  • Tiefe Bäume neigen zu Overfitting (geringer Bias, hohe Varianz); flache Bäume zu Underfitting.
  • tree$variable.importance ordnet die Prädiktoren nach ihrer gesamten Verbesserung über Splits.
  • Ensemble-Methoden (Random Forests, Boosting) überwinden die Instabilität einzelner Bäume.
# Standard rpart workflow
tree <- rpart(y ~ ., data = train, method = 'anova',
              control = rpart.control(cp = 0.001))

best_cp <- tree$cptable[which.min(tree$cptable[, 'xerror']), 'CP']
pruned  <- prune(tree, cp = best_cp)

test_pred <- predict(pruned, newdata = test)
rmse <- sqrt(mean((test_pred - test$y)^2))
cat('Pruned Tree RMSE:', rmse)

Häufig gestellte Fragen

Ist die Lektion „Entscheidungsbäume: Grundlage von Ensembles“ kostenlos?

Ja — der vollständige Text von „Entscheidungsbäume: Grundlage von Ensembles“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Entscheidungsbäume: Grundlage von Ensembles“?

Erstellen und visualisieren Sie Entscheidungsbäume mit rpart und verstehen Sie den Bias-Varianz-Trade-off Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um R Academy zu starten?

Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Entscheidungsbäume: Grundlage von Ensembles“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?

Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Entscheidungsbäume: Grundlage von Ensembles
  2. Random Forests mit ranger
  3. Gradient Boosting mit xgboost
  4. Feature-Wichtigkeit und Modellinterpretation
← Zurück zu R Academy