scikit的一些bug学习auc功能?

时间:2016-08-30 06:31:37

标签: python machine-learning scikit-learn roc auc

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

但是输出也说,当fpr为1时,tpr也是1.我认为它不正确,因为预测器永远不会预测某些东西是积极的(标签是$(document).ready(function(){ OpenModel(); }); function OpenModel() { $("#dialog").dialog({ modal: true, title: fileName, width: 600, height: 600, buttons: { Close: function () { $(this).dialog('close'); } }, open: function () { var object = "<object data=\"{FileName}\" type=\"application/pdf\" width=\"700px\" height=\"700px\">"; object += "If you are unable to view file, you can download from <a href = \"{FileName}\">here</a>"; object += "</object>"; object = object.replace(/{FileName}/g, "Doc/Demo.pdf"); $("#dialog").html(object); } }); }); ),那么怎么可能fpr(=正确预测的#1 /总#1)和tpr(= 1的预测数#/ 0的总数)都是1?

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)

1 个答案:

答案 0 :(得分:3)

这两个插图可以让您更好地理解如何计算 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时,您将获得阈值的3个值fprtpr变为小数值。

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

此外,fprtpr中的数组元素形成递增序列,即从0→1变化并且必须满足形状&gt; = 2.因此,必须同时具有数组中的0和1作为起始值和终值。

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