python - 为什么 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 合法地称为比率,因为只有一个值并且无法使用以下公式计算 FPR 和 TPR:
TPR = TP/TP+FN
FPR = FN/FN+TP
按照相同的逻辑,当预测模型概率(分数)仅对单个观察有效时,我看不到它们如何充当阈值。
我可能在这里遗漏了一些基本的东西,并且会感谢任何关于它是什么的直觉?
解决方案
没关系; 我现在看到了我的错误。对于任何来到这篇文章的人同样困惑,我的错误是这个。事实上, sklearnroc_curve
确实为特定模型类型绘制了不同范围的阈值。提供给它的概率(即分数)给它需要覆盖的阈值范围;输出的roc_curve
阈值是模型可以用来进行正分类的不同阈值。因此,ROC 曲线的一个点将是针对特定阈值计算的 TPR 和 FPR;另一点将是不同的价值等。一旦你考虑它就有意义了。
推荐阅读
- angular - 损坏的文件 - Angular 项目中 node_modules 中的 .xml2js.DELETE/package,json
- c++ - istringstreams 或 stringstreams 通常在 C++ 中默认初始化为什么?
- android - 使用插页式广告格式作为奖励广告(Facebook Audience Network)
- c++ - 向 GDI+ 位图添加一定百分比的噪点失败
- html - 根据浏览器的宽度大小,网格区域可能不适合
- c# - 由于代码中的格式错误,我无法使用复选框
- android - 屏幕关闭时前台应用程序被杀死
- r - 为什么我的 R Shiny 应用程序会不一致地抛出 MIME 错误?
- python-3.x - IndexError:使用 discord.py 查找提及时列表索引超出范围
- python - WSL2 Ubuntu 18.04 - 性能真的很奇怪