ROC Curve
Ein Diagramm zur Bewertung von Klassifikatoren – zeigt das Verhältnis von True Positive Rate zu False Positive Rate bei verschiedenen Schwellenwerten.
Die Fläche unter der ROC-Kurve – ein einzelner Wert zwischen 0 und 1, der die Gesamtqualität eines Klassifikators misst.
AUC fasst die ROC-Kurve in einer Zahl zusammen: Wie gut trennt das Modell positive von negativen Beispielen?
AUC nahe 1.0: Sehr gute Trennung
AUC nahe 0.5: Kaum besser als zufälliges Raten
AUC unter 0.5: Ranking möglicherweise invertiert oder fehlerhaft
Interpretation:
AUC = P(score(positiv) > score(negativ))
"Wenn ich zufällig ein positives und ein negatives
Beispiel wähle, wie wahrscheinlich rankt das Modell
das positive höher?"
from sklearn.metrics import roc_auc_score
y_true = [0, 0, 1, 1, 1, 0, 1, 0]
y_scores = [0.1, 0.4, 0.35, 0.8, 0.7, 0.3, 0.9, 0.2]
auc = roc_auc_score(y_true, y_scores)
print(f"AUC: {auc:.3f}")
from sklearn.metrics import roc_auc_score
# One-vs-Rest für Multi-Class
auc_ovr = roc_auc_score(y_true, y_proba, multi_class='ovr')
# One-vs-One
auc_ovo = roc_auc_score(y_true, y_proba, multi_class='ovo')
Die probabilistische Interpretation lässt sich direkt nachrechnen: AUC entspricht dem Anteil aller Positiv-Negativ-Paare, bei denen das positive Beispiel den höheren Score erhält (Gleichstände zählen halb):
AUC = (Anzahl korrekt gerankter Paare + 0.5 × Gleichstände)
/ (Anzahl Positive × Anzahl Negative)
Das macht AUC zu einer reinen Ranking-Metrik: Sie ist identisch mit der Mann-Whitney-U-Statistik (normalisiert) und invariant gegenüber jeder monotonen Transformation der Scores. Ein Modell mit AUC 0.9 kann trotzdem völlig unkalibrierte Wahrscheinlichkeiten liefern – AUC sagt nichts darüber aus, ob ein Score von 0.8 wirklich „80 % Wahrscheinlichkeit” bedeutet.
import numpy as np
def auc_by_pairs(y_true, y_scores):
y_true, y_scores = np.asarray(y_true), np.asarray(y_scores)
pos, neg = y_scores[y_true == 1], y_scores[y_true == 0]
diffs = pos[:, None] - neg[None, :] # alle Paare
return ((diffs > 0).sum() + 0.5 * (diffs == 0).sum()) / diffs.size
| Frage | Beantwortet AUC? | Bessere Metrik |
|---|---|---|
| Rankt das Modell Positive über Negative? | Ja | – |
| Sind die Wahrscheinlichkeiten kalibriert? | Nein | Brier Score, Kalibrierungskurve |
| Wie gut ist das Modell am gewählten Threshold? | Nein | Precision, Recall, F1 |
| Performance bei seltener positiver Klasse? | Nur eingeschränkt | AUC-PR (Average Precision) |
Der letzte Punkt ist in der Praxis der wichtigste: Bei stark unbalancierten Daten kann ein hoher AUC-ROC-Wert über eine schwache Precision hinwegtäuschen, weil die vielen True Negatives die False Positive Rate klein halten. Für Fraud Detection oder Anomalie-Erkennung ist die Fläche unter der Precision-Recall-Kurve meist aussagekräftiger.
Ein AUC-Wert deutlich unter 0.5 bedeutet nicht „schlechter als nichts”, sondern dass das Modell systematisch invers rankt. Häufige Ursachen: vertauschte Labels beim Einlesen, predict_proba[:, 0] statt [:, 1] verwendet, oder ein Vorzeichenfehler im Score. Ein Wert nahe 0 ist daher fast immer ein Bug, kein Modellproblem – nach der Korrektur wäre das Ranking sogar sehr gut.
roc_auc_score(y_true, model.predict(X)) verschenkt die Ranking-Information. Richtig sind Scores oder Wahrscheinlichkeiten: model.predict_proba(X)[:, 1].AUC ist wie eine zusammenfassende Bewertung für deinen Klassifikator: Ein hoher Wert bedeutet bessere Trennung, ein Wert nahe Zufall bedeutet kaum nutzbares Ranking.
Wert zwischen 0 und 1 (0.5 = Zufall)
Unabhängig vom gewählten Schwellenwert
Wahrscheinlichkeit, dass positives Beispiel höher gerankt wird
Modellvergleich
Welches Modell ist insgesamt besser?
Feature-Selektion
Welche Features verbessern AUC?
Hyperparameter-Tuning
AUC als Optimierungsziel
Ein guter AUC-Wert hängt vom Problem, Datenrauschen, Klassenverteilung und Fehlkosten ab. Werte nahe 0.5 deuten auf kaum nutzbare Trennung hin; höhere Werte sind besser, müssen aber im Kontext bewertet werden.
AUC-ROC bei balancierten Daten. AUC-PR (Precision-Recall) bei stark unbalancierten Daten besser geeignet.