2

这是代码和输出,我认为从输出中可以看出,当 fpr 为 0 时,tpr 为 0,这是正确的,因为预测结果将所有内容都标记为 0。

但是输出还说,当 fpr 为 1 时,tpr 也为 1。我认为这是不正确的,因为预测器从不预测某些东西是正的(label to be 1),那么 fpr (= # of correct prediction of 1/total # of 1) 和 tpr (= # of 1 / total # of 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
4

1 回答 1

3

这两个插图将使您更好地了解如何计算FPRTPR

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

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

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

此外,两者中的数组元素fpr形成tpr一个递增序列,即从 0 →1 变化,并且必须满足形状 >=2。因此,数组中必须同时具有 0 和 1 作为起始值和终止值。

fpr在和的小数值的情况下tpr,中间列将包含这些值,这些值由数组两侧的 0 和 1 包围。

于 2016-08-30T08:52:03.527 回答