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

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

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

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

注意

生成合成数据#

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 曲线直观地比较它们在不同阈值下的统计性能。选择这些分类器没有特别的原因,scikit-learn 中还有其他可用的分类器。

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
    ),
}

绘制 ROC 和 DET 曲线#

DET 曲线通常在正态偏差尺度上绘制。为了实现这一点,DET 显示使用 scipy.stats.normdet_curve 返回的错误率和轴尺度进行转换。

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()
Receiver Operating Characteristic (ROC) curves, Detection Error Tradeoff (DET) curves

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

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

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

相关示例

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

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

使用可视化 API 的 ROC 曲线

使用可视化 API 的 ROC 曲线

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

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

使用树集成进行特征转换

使用树集成进行特征转换

由 Sphinx-Gallery 生成的画廊