首页 > 解决方案 > 为什么 scikit-learn 在每次观察而不是在整个模型上实现 ROC?

问题描述

我从理论上理解 ROC 曲线背后的原理,但它在 sklearn 中的实现让我感到困惑。我理解 ROC 是为了绘制 TPR 与 FPR 的比率,因为一种特定类型的模型对算作 TP 的阈值具有不同的阈值——这一观点与本教程相吻合。在这种理解中,ROC 曲线上的每个点都是特定阈值下模型类型的(FPR,TPR)坐标。因此,逻辑回归(比如)可以与(比如)特定数据集的随机森林分类器进行比较,每个分类器的范围都不同。

然而,在 sklearn 中,ROC 曲线的每个点对应于单个模型中的一个观察值——即:

import numpy as np
from sklearn import metrics
import seaborn as sns
import matplotlib.pyplot as plt

y = np.array([1, 1, 1, 0, 1, 0, 1, 1, 0, 1])
scores = np.array([0.47, 0.62, 0.53, 0.49, 0.76, 0.57, 0.97, 0.95, 0.46, 0.69])

fpr, tpr, thresholds = metrics.roc_curve(y, scores)
sns.lineplot(x = fpr, y = tpr, ci = False)

plt.plot(fpr, tpr)
plt.plot([0,1], [0, 1], '--')

TPR 优于 FPR

就好像每个分类本身都被视为一种迷你模型。如果是这样,我不明白如何将 TPR/FPR 合法地称为比率,因为只有一个值并且无法使用以下公式计算 FPR 和 TPR:

TPR = TP/TP+FN

FPR = FN/FN+TP

按照相同的逻辑,当预测模型概率(分数)仅对单个观察有效时,我看不到它们如何充当阈值。

我可能在这里遗漏了一些基本的东西,并且会感谢任何关于它是什么的直觉?

标签: pythonmachine-learningscikit-learn

解决方案


没关系; 我现在看到了我的错误。对于任何来到这篇文章的人同样困惑,我的错误是这个。事实上, sklearnroc_curve确实为特定模型类型绘制了不同范围的阈值。提供给它的概率(即分数)给它需要覆盖的阈值范围;输出的roc_curve阈值是模型可以用来进行正分类的不同阈值。因此,ROC 曲线的一个点将是针对特定阈值计算的 TPR 和 FPR;另一点将是不同的价值等。一旦你考虑它就有意义了。


推荐阅读