Hinweis
Zum Ende springen, um den vollständigen Beispielcode herunterzuladen oder dieses Beispiel über JupyterLite oder Binder in Ihrem Browser auszuführen.
Detection error tradeoff (DET) Kurve#
In diesem Beispiel vergleichen wir zwei binäre Klassifikationsmetriken mit mehreren Schwellenwerten: die Receiver Operating Characteristic (ROC) und die Detection Error Tradeoff (DET). Zu diesem Zweck bewerten wir zwei verschiedene Klassifikatoren für dieselbe Klassifikationsaufgabe.
ROC-Kurven zeigen die True Positive Rate (TPR) auf der Y-Achse und die False Positive Rate (FPR) auf der X-Achse. Das bedeutet, dass die obere linke Ecke des Plots der „ideale“ Punkt ist – eine FPR von Null und eine TPR von Eins.
DET-Kurven sind eine Variation von ROC-Kurven, bei denen die False Negative Rate (FNR) anstelle der TPR auf der Y-Achse aufgetragen wird. In diesem Fall ist der Ursprung (untere linke Ecke) der „ideale“ Punkt.
Hinweis
Weitere Informationen zu ROC-Kurven finden Sie unter
sklearn.metrics.roc_curve.Weitere Informationen zu DET-Kurven finden Sie unter
sklearn.metrics.det_curve.Dieses Beispiel basiert lose auf dem Classifier comparison Beispiel.
Weitere Informationen zu ROC-Kurven und ROC-AUC finden Sie im Beispiel Receiver Operating Characteristic (ROC) mit Kreuzvalidierung.
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
Synthetische Daten generieren#
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X, y = make_classification(
n_samples=1_000,
n_features=2,
n_redundant=0,
n_informative=2,
random_state=1,
n_clusters_per_class=1,
)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)
Klassifikatoren definieren#
Hier definieren wir zwei verschiedene Klassifikatoren. Das Ziel ist es, ihre statistische Leistung über Schwellenwerte hinweg visuell mit ROC- und DET-Kurven zu vergleichen.
from sklearn.dummy import DummyClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.svm import LinearSVC
classifiers = {
"Linear SVM": make_pipeline(StandardScaler(), LinearSVC(C=0.025)),
"Random Forest": RandomForestClassifier(
max_depth=5, n_estimators=10, max_features=1, random_state=0
),
"Non-informative baseline": DummyClassifier(),
}
ROC- und DET-Kurven vergleichen#
DET-Kurven werden üblicherweise in normaler Abweichungsskala aufgetragen. Um dies zu erreichen, transformiert die DET-Anzeige die Fehlerraten, die von det_curve zurückgegeben werden, und die Achsenskala mithilfe von scipy.stats.norm.
import matplotlib.pyplot as plt
from sklearn.dummy import DummyClassifier
from sklearn.metrics import DetCurveDisplay, RocCurveDisplay
fig, [ax_roc, ax_det] = plt.subplots(1, 2, figsize=(11, 5))
ax_roc.set_title("Receiver Operating Characteristic (ROC) curves")
ax_det.set_title("Detection Error Tradeoff (DET) curves")
ax_roc.grid(linestyle="--")
ax_det.grid(linestyle="--")
for name, clf in classifiers.items():
(color, linestyle) = (
("black", "--") if name == "Non-informative baseline" else (None, None)
)
clf.fit(X_train, y_train)
RocCurveDisplay.from_estimator(
clf,
X_test,
y_test,
ax=ax_roc,
name=name,
curve_kwargs=dict(color=color, linestyle=linestyle),
)
DetCurveDisplay.from_estimator(
clf, X_test, y_test, ax=ax_det, name=name, color=color, linestyle=linestyle
)
plt.legend()
plt.show()

Beachten Sie, dass die Gesamtleistung verschiedener Klassifikationsalgorithmen mit DET-Kurven leichter visuell zu beurteilen ist als mit ROC-Kurven. Da ROC-Kurven in einer linearen Skala aufgetragen werden, erscheinen verschiedene Klassifikatoren für einen großen Teil des Plots ähnlich und unterscheiden sich am stärksten in der oberen linken Ecke des Graphen. Da DET-Kurven hingegen gerade Linien in normaler Abweichungsskala darstellen, sind sie tendenziell als Ganzes unterscheidbar und der interessante Bereich erstreckt sich über einen großen Teil des Plots.
DET-Kurven geben direktes Feedback über den Detection Error Tradeoff, um die Analyse von Betriebspunkten zu unterstützen. Der Benutzer kann dann entscheiden, welche FNR er im Austausch gegen die FPR (oder umgekehrt) zu akzeptieren bereit ist.
Nicht-informative Klassifikator-Baseline für ROC- und DET-Kurven#
Die diagonalen schwarz gepunkteten Linien in den obigen Diagrammen entsprechen einem DummyClassifier mit der Standardstrategie „prior“, die als Basis für den Vergleich mit anderen Klassifikatoren dient. Dieser Klassifikator macht konstante Vorhersagen, unabhängig von den Eingabemerkmalen in X, und ist somit ein nicht-informativer Klassifikator.
Um die nicht-informative Baseline der ROC- und DET-Kurven besser zu verstehen, erinnern wir uns an die folgenden mathematischen Definitionen
\(\text{FPR} = \frac{\text{FP}}{\text{FP} + \text{TN}}\)
\(\text{FNR} = \frac{\text{FN}}{\text{TP} + \text{FN}}\)
\(\text{TPR} = \frac{\text{TP}}{\text{TP} + \text{FN}}\)
Ein Klassifikator, der immer die positive Klasse vorhersagt, hätte keine True Negatives und keine False Negatives, was zu \(\text{FPR} = \text{TPR} = 1\) und \(\text{FNR} = 0\) führt, d.h.
ein einzelner Punkt in der oberen rechten Ecke der ROC-Ebene,
ein einzelner Punkt in der unteren rechten Ecke der DET-Ebene.
Ähnlich hätte ein Klassifikator, der immer die negative Klasse vorhersagt, keine True Positives und keine False Positives, also \(\text{FPR} = \text{TPR} = 0\) und \(\text{FNR} = 1\), d.h.
ein einzelner Punkt in der unteren linken Ecke der ROC-Ebene,
ein einzelner Punkt in der oberen linken Ecke der DET-Ebene.
Gesamtlaufzeit des Skripts: (0 Minuten 0,168 Sekunden)
Verwandte Beispiele
Receiver Operating Characteristic (ROC) mit Kreuzvalidierung
Multiklassen-Receiver Operating Characteristic (ROC)