sklearn.metrics.precision_recall_curve:为什么precision和recall返回



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

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

test_x, test_y, predics, pred_prob,score = CH.buildBinClassifier(data,allAttribs,0.3,50,'logistic')

构建分类器方法基本上是构建一个分类器,拟合一个训练数据并返回test_x(测试数据的特征),test_y(ground truth labels), 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.        ]))

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

由于精度计算为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')

编辑:但没有averagepos_label参数,它报告了每一类的精度。有人能解释一下这两种方法的输出有什么不同吗?

来自sklearn文档中的precision_recall_curve:

计算不同概率阈值的精度-召回率对。

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

如果选择阈值为0.5,则所有计算概率大于0.5的输入样本将被分配到正类。如果你选择一个不同的阈值,你会得到不同数量的样本分配给正类和负类,因此不同的精度和召回率得分。

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

所以,改变阈值,我们有不同的预测结果。在许多问题中,通过调整阈值可以得到更好的结果。这就是precision _recall_曲线。

相关内容

  • 没有找到相关文章

最新更新