首先了解一下二分类中的pr曲线是怎么画的?

python 计算召回95 准确率 python计算召回率代码_分类

 

“p” 是precition,是查准率,也是我们常用到的准确率。
“r” 是recall,是查全率,也叫召回率。

python 计算召回95 准确率 python计算召回率代码_pytorch_02

上图为测试结果的混淆矩阵,表示一个数据集上的所有测试结果。
其中竖列均为测试结果,即分类器预测概率大于0.5为正类,小于0.5即为负类。
横列表示groundtruth,即真实的类别。

TP 表示正确分出正例的数量;
FN 表示把正例错分为反例的数量;
TN 表示正确分出反例的数量;
FP表示把反例错分为正例的数量。

准确率: P = TP /(TP+FP)
召回率: R = TP / (TP+FN)

我们根据预测结果只能够求出一组 “p” 值和 “r” 值,那是因为我们默认把阈值设置成了0.5,大于0.5就是正例,反之就是反例

python 计算召回95 准确率 python计算召回率代码_深度学习_03

假如说我们有一组飞机和大雁的图片集,我们想从中找出飞机的图片。
此时飞机就是正例,大雁或者说其它就是反例。
之后我们算出所有图片经测试为飞机的概率,(当然这里有两组概率,为飞机或者为大雁,这时我们不管为大雁的概率,只关注为飞机的概率),并从大到小进行排序。

python 计算召回95 准确率 python计算召回率代码_分类_04

 

 

蓝色虚线是我们设置阈值为0.5时候的分类情况,大于0.5是测试为飞机的概率,小于0.5是测试不为飞机的概率。

当阈值变小时,更多样本会被测试成飞机,虚线下移。假设取极限,阈值为0,那么所有样本都会被预测为飞机,召回率最大,为1;而精确率为 5/10 等于0.5。同理,阈值变大,虚线上移,精确率会变高,但召回率反而变低。

在设置阈值的时候,有两种方法:
1、从0-1之间按照等间隔设置,比如0,0.1,0.2,…,0.9,1.0。这样能得到10组 “p” “r” 值。当然也可以把间隔设置的小一点,可以得到更多组 “p” “r” 值。
2、把所有样本的概率预测值从小到大排序去重,并以此数列分别为阈值,进行计算 “p" “r” 值,可以得到更多组 “p” “r” 值。