Imbalanced Data
Ein häufiges Problem in ML, wenn Klassen im Datensatz sehr ungleich verteilt sind – z.B. 99% normale Transaktionen, 1% Betrug. Erfordert spezielle Techniken.
Eine Technik zur Erzeugung synthetischer Datenpunkte für unterrepräsentierte Klassen – löst das Problem unbalancierter Datensätze im ML.
SMOTE erzeugt synthetische Datenpunkte für die Minderheitsklasse durch Interpolation.
Vorher (imbalanced):
Klasse 0: ●●●●●●●●●● (1000)
Klasse 1: ●● (20)
Nach SMOTE:
Klasse 0: ●●●●●●●●●● (1000)
Klasse 1: ●●●●●●●●●● (1000, davon 980 synthetisch)
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)
# So funktioniert es:
# 1. Wähle Sample aus Minderheitsklasse
# 2. Finde k nächste Nachbarn (gleiche Klasse)
# 3. Wähle zufällig einen Nachbarn
# 4. Erzeuge neuen Punkt auf Linie zwischen beiden
| Variante | Beschreibung |
|---|---|
| SMOTE | Standard-Interpolation |
| SMOTE-NC | Für kategorische Features |
| Borderline-SMOTE | Fokus auf Grenzfälle |
| ADASYN | Adaptiv, mehr Samples in schwierigen Regionen |
Der neue Punkt entsteht durch lineare Interpolation zwischen einem Sample der Minderheitsklasse und einem seiner nächsten Nachbarn:
x_neu = x_i + λ × (x_nachbar - x_i) mit λ ∈ [0, 1]
Der Zufallsfaktor λ bestimmt, wo auf der Verbindungslinie der synthetische Punkt liegt. Bei λ = 0 entspricht er dem Original, bei λ = 1 dem Nachbarn. Dadurch liegen alle synthetischen Punkte innerhalb der konvexen Hülle der vorhandenen Minderheits-Samples – SMOTE erfindet also keine völlig neuen Regionen, sondern verdichtet den bereits abgedeckten Bereich.
Wer SMOTE auf den gesamten Datensatz anwendet und erst danach in Trainings- und Testdaten aufteilt, erzeugt Data Leakage: Synthetische Punkte im Testset wurden aus Trainingspunkten interpoliert (und umgekehrt). Die gemessene Performance ist dann zu optimistisch. Richtig ist: erst splitten, dann SMOTE ausschließlich auf die Trainingsdaten anwenden – das Testset bleibt unangetastet und behält die reale Klassenverteilung.
from imblearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
from sklearn.linear_model import LogisticRegression
# Pipeline wendet SMOTE nur beim Fitten an, nie beim Predicten
pipe = Pipeline([
("smote", SMOTE(random_state=42)),
("clf", LogisticRegression())
])
pipe.fit(X_train, y_train)
Die imblearn-Pipeline sorgt auch bei Cross-Validation dafür, dass Oversampling in jedem Fold nur auf den Trainingsanteil angewendet wird.
| Ansatz | Idee | Wann sinnvoll |
|---|---|---|
| SMOTE | Synthetische Minderheits-Samples | Mittlere Imbalance, numerische Features |
| Random Oversampling | Minderheit duplizieren | Schnelle Baseline, Overfitting-Risiko |
| Undersampling | Mehrheit reduzieren | Sehr große Datensätze |
| Class Weights | Fehlklassifikation der Minderheit stärker gewichten | Ohne Datenmanipulation, von vielen Modellen direkt unterstützt |
In der Praxis lohnt es sich, zuerst Class Weights (z. B. class_weight="balanced" in scikit-learn) zu testen – oft reicht das bereits und die Pipeline bleibt einfacher. SMOTE spielt seine Stärke aus, wenn das Modell von zusätzlicher Dichte im Feature-Raum der Minderheitsklasse profitiert.
SMOTE interpoliert rein geometrisch und kennt die Semantik der Daten nicht. Bei verrauschten Labels erzeugt es synthetische Punkte um falsch gelabelte Beispiele herum und verstärkt so das Rauschen. In hochdimensionalen Räumen verlieren Nachbarschaftsbeziehungen an Aussagekraft, und bei kategorischen Features ist die Standard-Interpolation nicht definiert – hier braucht es SMOTE-NC oder SMOTEN. Für Zeitreihen ist SMOTE ungeeignet, weil interpolierte Punkte die zeitliche Struktur zerstören.
SMOTE ist wie das Klonen von seltenen Pflanzen: Statt nur die wenigen Exemplare zu nutzen, erzeugst du ähnliche Varianten, um eine ausgewogene Population zu bekommen.
Erzeugt synthetische Samples für Minderheitsklasse
Interpoliert zwischen existierenden Datenpunkten
Besser als einfaches Duplizieren
Fraud Detection
Wenige Fraud-Fälle vs. viele normale
Medizinische Diagnose
Seltene Krankheiten erkennen
Churn Prediction
Wenige Churner vs. viele Bleibende
SMOTE: Mehr Daten für Minderheit. Undersampling: Weniger Daten für Mehrheit. SMOTE verliert keine Information, Undersampling ist schneller.
Bei sehr kleiner Minderheit (zu wenig für Interpolation), bei hochdimensionalen Daten (Curse of Dimensionality), bei Zeitreihen.