Merkmale bauen
Aus Rohdaten Spalten machen, mit denen ein Modell etwas anfangen kann: Kodierung, Skalierung, Zeitmerkmale und der häufigste Weg, sich selbst zu betrügen.
Die Idee
Ein Modell sieht Spalten mit Zahlen. Ein Datum wie 2026-08-25 ist für es
zunächst bedeutungslos. Nützlich wird es erst als „Dienstag", „Kalenderwoche 35",
„drei Tage vor Monatsende". Merkmalstechnik ist die Übersetzung von Wirklichkeit
in solche Spalten.
Die üblichen Umwandlungen
| Rohwert | Nützliche Merkmale |
|---|---|
| Datum | Wochentag, Monat, Feiertag, Tage seit Ereignis |
| Adresse | Region, Entfernung zum Standort, Stadt oder Land |
| Text | Länge, Sprache, Vorhandensein bestimmter Begriffe, Embedding |
| Betrag | Betrag, Logarithmus, Abweichung vom Kundenmittel |
| Kategorie | One-Hot, Häufigkeit, Zielkodierung |
Die Pipeline, die Leakage verhindert
import numpy as np, pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.ensemble import HistGradientBoostingClassifier
num = ["betrag", "tage_seit_letztem_auftrag"]
kat = ["region", "kanal"]
vorbereitung = ColumnTransformer([
("num", Pipeline([("imp", SimpleImputer(strategy="median")),
("sc", StandardScaler())]), num),
("kat", OneHotEncoder(handle_unknown="ignore", min_frequency=20), kat),
])
# Alles in einer Pipeline: Median und Kategorienliste werden je Faltung
# nur aus dem Trainingsteil gelernt. Genau das verhindert Leakage.
modell = Pipeline([("vor", vorbereitung),
("clf", HistGradientBoostingClassifier())])- Nie den Median über den gesamten Datensatz berechnen und dann teilen.
handle_unknown="ignore"setzen, sonst bricht der Betrieb bei neuen Kategorien.- Seltene Kategorien zusammenfassen, statt hunderte Spalten mit je drei Fällen zu erzeugen.
- Zyklische Größen wie Stunde oder Monat als Sinus und Kosinus kodieren, nicht als Zahl.
Zielkodierung mit Glättung
Ohne Glättung bekommt eine Kategorie mit einem einzigen Fall exakt dessen Zielwert und wird damit zu einer verkleideten Kopie des Etiketts. Ohne Kreuzvalidierung innerhalb der Kodierung passiert dasselbe auch bei größeren Kategorien, nur subtiler.
Zyklische Kodierung
Als schlichte Zahl liegen 23 und 0 maximal weit auseinander, obwohl sie eine Stunde trennt. Für Baumverfahren ist das unerheblich, für lineare Modelle und Netze ist es ein systematischer Fehler.
Was bei Tabellendaten wirklich zählt
Empirisch schlägt Gradient Boosting auf gut gebauten Merkmalen tiefe Netze auf denselben Daten in der Mehrzahl der Fälle. Die drei ertragreichsten Griffe:
- Aggregate über Gruppen. Mittelwert, Maximum und Anzahl je Kunde, Standort oder Monat, jeweils nur aus der Vergangenheit gerechnet.
- Differenzen und Verhältnisse. Betrag geteilt durch den üblichen Betrag desselben Kunden sagt mehr als der Betrag selbst.
- Zeitabstände. Tage seit dem letzten Vorgang, Tage bis zur Frist.
Alle drei sind anfällig für Leakage über die Zeitachse. Der Aufwand steckt nicht in der Berechnung, sondern in der korrekten Fensterung. Siehe Datenlecks im Training.
Passende Kurse und Quellen
Kaggle Learn
Kurze Einheiten mit ausführbaren Notebooks, von Python über Pandas bis zu ersten Modellen. Ohne Installation, direkt im Browser.
Für den allerersten Einstieg ohne Installation, direkt im Browser.