为什么scikit-learn会基于每个观察而不是整个模型来实现ROC?

问题描述

我从理论上理解了ROC曲线的原理,但是在sklearn中实施它使我感到困惑。我了解到ROC会绘制TPR与FPR的比率,因为特定类型的模型对TP而言具有不同的阈值-这种观点很with this tutorial在这种理解下,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])
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,'--')

TPR over FPR

就好像每个分类本身都被视为一种微型模型一样。如果是这样,我不了解如何合理地将TPR / FPR称为费率,因为只有一个值,无法使用以下公式来计算FPR和TPR:

TPR = TP / TP + FN

FPR = FN / FN + TP

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

我可能在这里遗漏了一些基本知识,如果对有关它的直觉有所感激,将不胜感激?

解决方法

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