错误检测权衡 (DET) 曲线#

在此示例中,我们比较了两个二元分类多阈值指标:接收者操作特征(ROC)和错误检测权衡(DET)。为此,我们针对相同的分类任务评估了两个不同的分类器。

ROC曲线的Y轴为真阳性率(TPR),X轴为假阳性率(FPR)。这意味着图表的左上角是“理想”点——FPR为零,TPR为一。

DET曲线是ROC曲线的一种变体,其中Y轴绘制的是假阴性率(FNR)而不是TPR。在这种情况下,原点(左下角)是“理想”点。

注意

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

生成合成数据#

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)

定义分类器#

在这里,我们定义了两个不同的分类器。目标是使用ROC和DET曲线,直观地比较它们在不同阈值下的统计性能。

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和DET曲线#

DET曲线通常以正态偏差尺度绘制。为此,DET显示器会转换 det_curve 返回的错误率,并使用 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()
Receiver Operating Characteristic (ROC) curves, Detection Error Tradeoff (DET) curves

请注意,使用DET曲线比使用ROC曲线更容易直观地评估不同分类算法的整体性能。由于ROC曲线以线性尺度绘制,不同的分类器在图表的大部分区域通常看起来相似,并且在图表的左上角差异最大。另一方面,由于DET曲线在正态偏差尺度上表示为直线,它们往往整体上更易于区分,并且感兴趣区域占据了图表的很大一部分。

DET曲线直接反馈检测错误权衡,以帮助进行操作点分析。用户可以决定愿意接受的FNR,以牺牲FPR(反之亦然)。

ROC和DET曲线的非信息性分类器基线#

上述图表中对角线的黑点虚线对应于使用默认“先验”策略的 DummyClassifier,作为与其他分类器进行比较的基线。该分类器进行恒定预测,独立于 X 中的输入特征,使其成为一个非信息性分类器。

为了进一步理解ROC和DET曲线的非信息性基线,我们回顾以下数学定义

\(\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}}\)

一个总是预测为正类的分类器将没有真阴性或假阴性,因此 \(\text{FPR} = \text{TPR} = 1\)\(\text{FNR} = 0\),即

  • ROC平面右上角的一个点,

  • DET平面右下角的一个点。

类似地,一个总是预测为负类的分类器将没有真阳性或假阳性,因此 \(\text{FPR} = \text{TPR} = 0\)\(\text{FNR} = 1\),即

  • ROC平面左下角的一个点,

  • DET平面左上角的一个点。

脚本总运行时间: (0分钟 0.188秒)

相关示例

带交叉验证的接收者操作特征 (ROC)

带交叉验证的接收者操作特征 (ROC)

多类接收者操作特征 (ROC)

多类接收者操作特征 (ROC)

带可视化API的ROC曲线

带可视化API的ROC曲线

使用显示对象的视觉化

使用显示对象的视觉化

由Sphinx-Gallery生成图库