sklearn.metrics.precision_recall_curve:为什么精度和召回率返回数组而不是单个值

Sre*_*non 5 python machine-learning scikit-learn precision-recall

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

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

test_x, test_y, predics, pred_prob,score = CH.buildBinClassifier(data,allAttribs,0.3,50,'logistic')
Run Code Online (Sandbox Code Playgroud)

构建分类器方法基本上构建一个分类器,拟合训练数据并返回 test_x(测试数据的特征)、test_y(真实标签)、predict(分类器做出的预测)、red_prob(LogisiticRegression.predict_proba方法的预测概率) .

下面是计算精度召回的代码:

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.        ]))
Run Code Online (Sandbox Code Playgroud)

我不明白为什么是精度和召回数组?它们不应该只是单个数字吗?

由于精确度是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')
Run Code Online (Sandbox Code Playgroud)

编辑:但是如果没有averageandpos_label参数,它会报告每个类的精度。有人可以解释这两种方法的输出之间的区别吗?

小智 1

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

因此,改变阈值我们会得到不同的预测结果。在许多问题中,通过调整阈值可以获得更好的结果。这就是为您提供 precision_recall_curve 的原因。