Detection Error Tradeoff Kurve

Machine LearningMachine LearningBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Tutorial lernen wir über Detection Error Tradeoff (DET) - Kurven und vergleichen sie mit Receiver Operating Characteristic (ROC) - Kurven. DET - Kurven sind eine Variation von ROC - Kurven, bei denen die False Negative Rate (FNR) auf der y - Achse statt der True Positive Rate (TPR) aufgetragen wird. Wir werden die beliebte Python - Bibliothek scikit - learn für maschinelles Lernen verwenden, um synthetische Daten zu generieren und die statistische Leistung zweier Klassifizierer über Schwellenwerte mit ROC - und DET - Kurven zu vergleichen.

Tipps für die VM

Nachdem der VM - Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Synthetische Daten generieren

Wir werden die Funktion make_classification von scikit - learn verwenden, um synthetische Daten zu generieren. Diese Funktion erzeugt ein zufälliges n - Klassifikationsproblem mit n_informative informativen Merkmalen, n_redundant redundanten Merkmalen und n_clusters_per_class Clustern pro Klasse. Wir werden 1000 Proben mit 2 informativen Merkmalen und einem Zufallszustand von 1 generieren. Anschließend teilen wir die Daten in Trainings - und Testsets im Verhältnis 60/40 auf.

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)

Die Klassifizierer definieren

Wir werden zwei verschiedene Klassifizierer definieren, um ihre statistische Leistung über Schwellenwerte mit ROC - und DET - Kurven zu vergleichen. Wir werden die Funktion make_pipeline von scikit - learn verwenden, um einen Pipeline zu erstellen, der die Daten mit StandardScaler skaliert und einen LinearSVC - Klassifizierer trainiert. Wir werden auch die Klasse RandomForestClassifier von scikit - learn verwenden, um einen Random - Forest - Klassifizierer mit einer maximalen Tiefe von 5, 10 Schätzern und einem maximalen von 1 Merkmal zu trainieren.

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, dual="auto")),
    "Random Forest": RandomForestClassifier(
        max_depth=5, n_estimators=10, max_features=1
    ),
}

ROC - und DET - Kurven plotten

Wir werden die Klassen RocCurveDisplay und DetCurveDisplay von scikit - learn verwenden, um die ROC - und DET - Kurven jeweils zu plotten. Die Funktion RocCurveDisplay.from_estimator berechnet die ROC - Kurve und zeigt sie auf der angegebenen Achse an. Ähnlich berechnet die Funktion DetCurveDisplay.from_estimator die DET - Kurve und zeigt sie auf der angegebenen Achse an. Wir werden zwei Teilplots erstellen, einen für ROC - Kurven und einen für DET - Kurven, und die Kurven für jeden Klassifizierer plotten.

import matplotlib.pyplot as plt
from sklearn.metrics import DetCurveDisplay, RocCurveDisplay

fig, [ax_roc, ax_det] = plt.subplots(1, 2, figsize=(11, 5))

for name, clf in classifiers.items():
    clf.fit(X_train, y_train)

    RocCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_roc, name=name)
    DetCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_det, name=name)

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="--")

plt.legend()
plt.show()

Interpretation der Ergebnisse

Es ist einfacher, die Gesamtleistung unterschiedlicher Klassifikationsalgorithmen visuell mithilfe von DET - Kurven zu bewerten als mithilfe von ROC - Kurven. DET - Kurven geben unmittelbare Rückmeldung über das Detection Error Tradeoff, um die Analyse des Betriebspunktes zu erleichtern. Der Anwender kann dann entscheiden, welche FNR er im Austausch gegen die FPR akzeptieren will (oder umgekehrt).

Zusammenfassung

In diesem Tutorial haben wir uns mit Detection Error Tradeoff (DET) - Kurven beschäftigt und sie mit Receiver Operating Characteristic (ROC) - Kurven verglichen. Wir haben scikit - learn verwendet, um synthetische Daten zu generieren und die statistische Leistung von zwei Klassifizierern über Schwellenwerte mit ROC - und DET - Kurven zu vergleichen. DET - Kurven sind eine Variation von ROC - Kurven, bei denen die False Negative Rate (FNR) auf der y - Achse statt der True Positive Rate (TPR) geplottet wird. DET - Kurven geben unmittelbare Rückmeldung über das Detection Error Tradeoff, um die Analyse des Betriebspunktes zu erleichtern, was sie zu einem nützlichen Werkzeug für die Bewertung der Leistung von Klassifizierungsalgorithmen macht.