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
这两个插图可以让您更好地理解 FPR 和 TPR 是如何计算的。
案例一:
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]
当fpr
和tpr
计算时变成分数,不能量化为0或1时,这才有效。因此,threshold
从0、1、2变化.
例如,当 pred
数组的最后 2 个值变为 1 时,您将获得 3 个阈值,因为 fpr
和 tpr
变为分数值。
但在我们的例子中,fpr
和 tpr
都是 0 或 1,因此不需要 threshold
的第三个值。
另外,fpr
和tpr
中的数组元素都是递增序列,即从0→1变化,必须满足形状>=2。因此,必须有数组中的 0 和 1 作为起始值和终止值。
Incase fpr
和 tpr
的小数值,中间列将包含在数组的两侧用 0 和 1 括起来的这些值。
这是代码和输出,我认为从输出来看,这意味着当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 是如何计算的。
案例一:
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]
当fpr
和tpr
计算时变成分数,不能量化为0或1时,这才有效。因此,threshold
从0、1、2变化.
例如,当 pred
数组的最后 2 个值变为 1 时,您将获得 3 个阈值,因为 fpr
和 tpr
变为分数值。
但在我们的例子中,fpr
和 tpr
都是 0 或 1,因此不需要 threshold
的第三个值。
另外,fpr
和tpr
中的数组元素都是递增序列,即从0→1变化,必须满足形状>=2。因此,必须有数组中的 0 和 1 作为起始值和终止值。
Incase fpr
和 tpr
的小数值,中间列将包含在数组的两侧用 0 和 1 括起来的这些值。