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 的原因。