scikit 学习 auc 函数的一些错误?

some bug of scikit learn auc function?

这是代码和输出,我认为从输出来看,这意味着当fpr为0时,tpr为0,这是正确的,因为预测结果标记为0。

但是输出还说,当 fpr 为 1 时,tpr 也为 1。我认为这是不正确的,因为预测器从不预测某些东西是正的(标签为 1),所以如何fpr(= 1 的正确预测数/1 的总数)和 tpr(= 1 的预测数/ 0 的总数)都可以是 1 吗?

import numpy as np
from sklearn import metrics
y = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
pred = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
fpr, tpr, thresholds = metrics.roc_curve(y, pred)
print fpr
print tpr
print thresholds
print metrics.auc(fpr, tpr)

输出,

[ 0.  1.]
[ 0.  1.]
[1 0]
0.5

这两个插图可以让您更好地理解 FPRTPR 是如何计算的。

案例一:

y    = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
pred = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
#                                          -^- see the change here 

真阳性 = 0
误报 = 0
真阴性 = 9
假阴性 = 1

真阳性率,(tpr) = 真阳性/(真阳性 + 假阴性)
因此,tpr = 0/(0+1) = 0.

假阳性率,(fpr) = 假阳性/(假阳性 + 真阴性)
因此,fpr = 0/(0+9) = 0.

#Output:

fpr → [ 0.  1.]
tpr → [ 0.  1.]

案例二:

y    = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
pred = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
#                                          -^- see the change here 

真阳性 = 1
误报 = 0
真阴性 = 9
假阴性 = 0

真阳性率,(tpr) = 真阳性/(真阳性 + 假阴性)
因此,tpr = 1/(1+0) = 1.

假阳性率,(fpr) = 假阳性/(假阳性 + 真阴性)
因此,fpr = 0/(0+9) = 0.

#Output:

fpr → [ 0.  1.]
tpr → [ 1.  1.]

注:

根据roc_curve documentation,明确指出thresholds[0]表示没有实例被预测,任意设置为max(pred)+1。 [此处,二元分类任务为2]

fprtpr计算时变成分数,不能量化为0或1时,这才有效。因此,threshold从0、1、2变化. 例如,当 pred 数组的最后 2 个值变为 1 时,您将获得 3 个阈值,因为 fprtpr 变为分数值。

但在我们的例子中,fprtpr 都是 0 或 1,因此不需要 threshold 的第三个值。

另外,fprtpr中的数组元素都是递增序列,即从0→1变化,必须满足形状>=2。因此,必须有数组中的 0 和 1 作为起始值和终止值。

Incase fprtpr 的小数值,中间列将包含在数组的两侧用 0 和 1 括起来的这些值。