Zum Inhalt springen

Woche 7 | Session 4: Regressionsbaum in Python — Dummy-Variablen & Volle Implementierung

Kurs: Supply Chain Digitalisierung — Modul 3: Analytics im SCM



Warum kategoriale Variablen codiert werden müssen

Abschnitt betitelt „Warum kategoriale Variablen codiert werden müssen“

Problem: Die Region hat die Werte “Süd”, “Ost”, “West”, “Nord” — das ist TEXT, keine Zahlen. ML-Modelle (Entscheidungsbaum, Random Forest, Logistische Regression etc.) können keine direkten mathematischen Operationen mit Text durchführen.

Lösung: Wandeln Sie kategorialen Text in binäre (0/1) numerische Dummy-Variablen um — eine Spalte pro Kategorie (abzüglich einer Basiskategorie).

  • Regel: Wenn eine kategoriale Variable m Kategorien hat → erstellen Sie (m − 1) Dummy-Variablen. Eine Kategorie wird als “Basiskategorie” weggelassen.
  • Warum (m − 1)? Die m-te Kategorie ist impliziert, wenn alle (m − 1) Dummy-Variablen = 0 sind. Das Einbeziehen aller m würde perfekte Multikollinearität (Dummy-Variablen-Falle) erzeugen.
  • Gilt für: ALLE ML-Modelle. Codieren Sie kategoriale Variablen immer zuerst.

VariableKategorien (m)Erstellte Dummy-Variablen (m − 1)Basiskategorie (nicht erstellt)Interpretationsregel
Region4 (N, S, O, W)region_north, region_south, region_westOst (alle drei Dummies = 0)Wenn region_south = 1 → Süd. Wenn alle drei = 0 → Ost (Basis).
Standort3 (Ländlich, Semi-Urban, Urban)location_semi_urban, location_urbanLändlich (beide Dummies = 0)Wenn location_urban = 1 → Urban. Wenn beide = 0 → Ländlich (Basis).

Wie Dummy-Variablen gelesen werden — Praxisbeispiele

Abschnitt betitelt „Wie Dummy-Variablen gelesen werden — Praxisbeispiele“
Beob.Tatsächliche Regionregion_northregion_southregion_westTatsächlicher Standortlocation_semi_urban
978Süd010Ländlich0 (Ländlich = Basis)
979West001Semi-Urban1
981Ost (Basis)000Urban0, aber location_urban=1
983Nord100Semi-Urban1
VariableVor der CodierungNach der Codierung
Region1 Spalte (Text)3 Spalten: region_north | region_south | region_west
Standort1 Spalte (Text)2 Spalten: location_semi_urban | location_urban
Numerische Variablen5 Spalten5 Spalten (unverändert)
GESAMTMERKMALE (X)7 Spalten10 Spalten (3 + 2 + 5)

# ── SCHRITT 1: Daten importieren ──────────────────────────────────
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
df = pd.read_csv("demand.csv")
# ── SCHRITT 2: X (Merkmale) und Y (Ziel) definieren ───────────────
X_features = list(df.columns)
X_features.remove("order_quantity")
X_df = df[X_features]
Y = df["order_quantity"]
# ── SCHRITT 3: Kategoriale Variablen codieren (KRITISCHER SCHRITT)
# pd.get_dummies() erstellt m-1 Dummies und lässt die erste Kategorie weg
encoded_df = pd.get_dummies(X_df, drop_first=True)
X = encoded_df # jetzt 10 Spalten statt 7
# ── SCHRITT 4: Train-Test-Aufteilung ──────────────────────────────
X_train, X_test, Y_train, Y_test = train_test_split(
X, Y, test_size=0.30, random_state=42)
# ── SCHRITT 5: Regressionsbaum erstellen ──────────────────────────
# DecisionTreeRegressor wird verwendet, da das Ziel KONTINUIERLICH ist
regr = DecisionTreeRegressor(max_depth=2)
regr.fit(X_train, Y_train)
# ── SCHRITT 6: Baum ausgeben / visualisieren ──────────────────────
plt.figure(figsize=(15, 10))
tree.plot_tree(regr, feature_names=X_train.columns, filled=True)
plt.show()
  • pd.get_dummies(..., drop_first=True): Integrierte pandas-Funktion. Erstellt alle Dummy-Variablen automatisch und entfernt die Spalte der Basiskategorie. Muss VOR dem Train-Test-Split gemacht werden.
  • DecisionTreeRegressor: Wird anstelle von DecisionTreeClassifier verwendet, weil das Ziel (order_quantity) KONTINUIERLICH ist. Das ist der wichtigste Code-Unterschied.
  • Kein Kriterium nötig: Regressor nutzt standardmäßig MSE (Squared Error) als Aufteilungskriterium.

Output-Verifizierung — Python entspricht exakt der Theorie

Abschnitt betitelt „Output-Verifizierung — Python entspricht exakt der Theorie“
KnotenBedingungPython Output (ȳ, Obs, MSE)Theorie Output (Session 7.2)Übereinstimmung?
0Alle 700 Trainings-Beob.ȳ=2270 | n=700 MSE=8,151,813ȳ=2270 | n=700 MSE=8,151,813✓ Ja
1Größe ≤ 30.5K sq ftȳ=1902 | n=612ȳ=1902 | n=612✓ Ja
2Größe > 30.5K sq ftȳ=4829 | n=88ȳ=4829 | n=88✓ Ja
3Größe ≤ 30.5K, Aktion = 0ȳ=943 | n=198ȳ=943 | n=198✓ Ja
4Größe ≤ 30.5K, Aktion = 1ȳ=2360 | n=414ȳ=2360 | n=414✓ Ja
5Größe > 30.5K, Alter ≤ 17.5ȳ=2887.3 | n=56ȳ=2887 | n=56✓ Ja (gerundet)
6Größe > 30.5K, Alter > 17.5ȳ=8226.87 | n=32ȳ=8227 | n=32✓ Ja (gerundet)

Code-Unterschied: Klassifikationsbaum vs. Regressionsbaum

Abschnitt betitelt „Code-Unterschied: Klassifikationsbaum vs. Regressionsbaum“
Code-ElementKlassifikationsbaum (Maschinenausfall)Regressionsbaum (Nachfrageprognose)
sklearn ImportDecisionTreeClassifierDecisionTreeRegressor
Aufteilungskriteriumcriterion="gini"Standard: squared_error (MSE)
Dummy-Variablen-CodierungNicht nötigERFORDERLICH — Region und Standort sind kategorial
Art der ZielvariablenKategorisch (0/1)Kontinuierlich (bestellte Einheiten)

  • Kategoriale Codierung: Region (4 Kat. → 3 Dummies, Ost=Basis) | Standort (3 Kat. → 2 Dummies, Ländlich=Basis). 7 Merkmale → 10 nach Codierung.
  • Dummy-Regel: m Kategorien → (m−1) Dummy-Variablen. Basiskategorie = alle Nullen. Gilt für ALLE ML-Modelle.
  • Code-Änderung: DecisionTreeRegressor statt DecisionTreeClassifier. Alles andere identisch.
  • Wichtige Code-Schritte: Import → X/Y definieren → kategoriale Variablen codieren → 70/30 aufteilen → RegTree aufbauen (max_depth=2) → ausgeben
  • Output entspricht der Theorie: Alle 7 Knoten stimmen exakt überein (ȳ, n, MSE). Python repliziert den handgemachten Theorie-Baum.
  • Nächste Session: Modell auf 300 zurückgehaltenen Test-Beobachtungen testen. MAE, RMSE, MAPE berechnen. Modellqualität bewerten.