这是代码和输出,我从输出中认为,这意味着当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

最佳答案

这两个插图将使您更好地了解如何计算FPR和TPR。

情况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, 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.]


情况2:

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,明确指出阈值[0]表示没有实例被预测,并且被任意设置为max(pred)+1
[这里是2分类任务]

fprtpr计算时变为小数且无法量化为0或1时,此选项才有效。因此,threshold的范围为0、1、2。
例如,当pred数组的最后2个值变为1时,由于fprtpr变为小数,您将获得3个阈值。

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

同样,fprtpr中的数组元素都形成一个递增的序列,即从0→1变化并且必须满足形状> =2。因此,必须将数组中的0和1都作为数组起始值和最终值。

如果fprtpr的分数值为零,则中间列将包含这些值,在数组的任一侧用0和1包围。

关于python - scikit的一些bug学习auc函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39220293/

10-16 00:54