这是代码和输出,我从输出中认为,这意味着当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分类任务]
当
fpr
和tpr
计算时变为小数且无法量化为0或1时,此选项才有效。因此,threshold
的范围为0、1、2。例如,当
pred
数组的最后2个值变为1时,由于fpr
和tpr
变为小数,您将获得3个阈值。但是在我们的例子中,
fpr
和tpr
均为0或1,因此不需要threshold
的第三个值。同样,
fpr
和tpr
中的数组元素都形成一个递增的序列,即从0→1变化并且必须满足形状> =2。因此,必须将数组中的0和1都作为数组起始值和最终值。如果
fpr
和tpr
的分数值为零,则中间列将包含这些值,在数组的任一侧用0和1包围。关于python - scikit的一些bug学习auc函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39220293/