Python sklearn.metrics.precision_recall_曲线:为什么精度和召回返回数组而不是单个值

Python sklearn.metrics.precision_recall_曲线:为什么精度和召回返回数组而不是单个值,python,machine-learning,scikit-learn,precision-recall,Python,Machine Learning,Scikit Learn,Precision Recall,我正在计算我最近准备的数据集上现成算法的精确度和召回率 这是一个二元分类问题,我希望为我构建的每个分类器计算精度、召回率和f分数 test_x, test_y, predics, pred_prob,score = CH.buildBinClassifier(data,allAttribs,0.3,50,'logistic') 构建分类器方法基本上构建分类器,拟合训练数据并返回test_x(测试数据的特征)、test_y(基本真理标签)、predict(分类器做出的预测)、red_prob(来

我正在计算我最近准备的数据集上现成算法的精确度和召回率

这是一个二元分类问题,我希望为我构建的每个分类器计算精度、召回率和f分数

test_x, test_y, predics, pred_prob,score = CH.buildBinClassifier(data,allAttribs,0.3,50,'logistic')
构建分类器方法基本上构建分类器,拟合训练数据并返回test_x(测试数据的特征)、test_y(基本真理标签)、predict(分类器做出的预测)、red_prob(来自
LogisiticRegression.predict_probability
方法的预测概率)

以下是计算精确召回率的代码:

from sklearn.metrics import precision_recall_curve

pr, re, _ = precision_recall_curve(test_y,pred_prob,pos_label=1)
pr
(array([ 0.49852507,  0.49704142,  0.49554896,  0.49702381,  0.49850746,
         0.5       ,  0.5015015 ,  0.50301205,  0.50453172,  0.50606061,
         . . . . . . . 
         0.875     ,  1.        ,  1.        ,  1.        ,  1.        ,
         1.        ,  1.        ,  1.        ,  1.        ])
re
array([ 1.        ,  0.99408284,  0.98816568,  0.98816568,  0.98816568,
         0.98816568,  0.98816568,  0.98816568,  0.98816568,  0.98816568,
         . . . . . . . 
         0.04142012,  0.04142012,  0.03550296,  0.0295858 ,  0.02366864,
         0.01775148,  0.01183432,  0.00591716,  0.        ]))
我不明白为什么精密度和召回率是数组?它们不应该只是一个数字吗

由于精度计算为
tpf/(tpf+fpf)
,并且与定义类似

我知道通过下面的代码计算平均精度召回率,但不知何故,看到数组而不是tpf、fpf、精度和召回率让我想知道到底发生了什么

from sklearn.metrics import precision_recall_fscore_support as prf

precision,recall,fscore,_ = prf(test_y,predics,pos_label=1,average='binary')
编辑:
但如果没有
平均值
位置标签
参数,它会报告每个类别的精度。有人能解释这两种方法的输出之间的差异吗?

在二元分类问题中,pred_prob是实例在每个类中的概率,因此实际上预测值(类)取决于这个概率和一个称为阈值的值。pred_prob大于阈值的所有实例被划分为一个类,较小的实例被划分为另一个类。默认阈值为0.5


因此,通过改变阈值,我们可以得到不同的预测结果。在许多问题中,通过调整阈值可以获得更好的结果。这就是给你精确回忆曲线的原因

从sklearn文档中获取精度曲线:

计算不同概率阈值的精确召回对

像logistic回归这样的分类器模型实际上不输出类标签(比如“0”或“1”),它们输出概率(比如0.67)。这些概率告诉您输入样本属于特定类别的可能性,如正(“1”)类别。但是您仍然需要选择一个概率阈值,以便算法可以将概率(0.67)转换为一个类(“1”)


如果选择阈值0.5,则计算出的概率大于0.5的所有输入样本都将分配给正类。如果您选择了不同的阈值,并且为阳性和阴性类别分配了不同数量的样本,因此获得了不同的精度和召回分数。

您要求的是精度恢复曲线,曲线是一系列点。如果需要单个值(实际精度和召回)-调用精度和召回函数。曲线用于显示对阈值参数的依赖关系。谢谢。但是你能澄清一下这些价值观的相关性吗?它们对应于每个预测吗?它们对应于不同的决策阈值。谢谢@BrenBarn。我想知道你能否给我指出不同阈值的正确方向?一种将我看到的数字与数据或决策联系起来的方法。例如,请参阅。此处绘制的曲线不是精度召回曲线,但概念类似。基本上,当决定一个项目属于哪一类时,模型会创建某种“可能性分数”,表示它属于B类的可能性。要做出二元决定,您可以设置一些阈值,并将阈值以上的所有项目标记为B。通过设置高阈值,您可以避免误报,但会增加误报,以此类推。我们可以在什么范围内调整阈值?是[0,1]吗?这个答案对我的理解很有帮助。我唯一的后续问题是为什么scikit的precision_recall_曲线函数返回,但不接受权重。在您的回答中,您暗示分析师可以选择阈值。参考: