Precision-Recall

准确率-召回率

本文翻译自 Precision-Recall
更多翻译可以看 Scikit-learn 某部分的中文翻译

用于评估分类器输出质量的 准确率-召回率 指标示例。
当类别非常不平衡时, 准确率-召回率 是衡量预测成功与否的有用指标。在信息检索中,准确率是衡量结果相关性的指标,而召回率是衡量返回多少真正相关结果的指标。

准确率-召回率 曲线显示了不同阈值下准确率召回率之间的权衡。曲线下方的高面积代表高召回率和高精度,其中高精度与低误报率相关,高召回率与低误报率相关。两者的高分表明分类器正在返回准确的结果(高精度),以及返回大部分阳性结果(高召回率)。

召回率高但精度低的系统会返回很多结果,但与训练标签相比,其大部分预测标签是不正确的。精度高但召回率低的系统恰恰相反,返回的结果很少,但与训练标签相比,它的大部分预测标签都是正确的。具有高精度和高召回率的理想系统将返回许多结果,并且所有结果都正确标记。

准确率 ( P ) 定义为真阳性数 (Tp) 加上真阳性数加上假阳性数 (Fp)。

P=TpTp+TfP= {T_p \above{1px} T_p+T_f} P=Tp​+Tf​Tp​​
召回率 ( R ) 定义为真阳性数 (Tp) 加上真阳性数加上假阴性数 (Fn)。
P=TpTp+FnP= {T_p \above{1px} T_p+F_n} P=Tp​+Fn​Tp​​
这些数量也与 (F1) 分数有关,该分数被定义为准确率和召回率的调和平均值。

P=2×P×RP+RP= 2×{P×R \above{1px} P+R} P=2×P+RP×R​

请注意,准确率可能不会随着召回率而降低。准确率的定义表明降低分类器的阈值可以通过增加返回结果的数量来增加分母。如果之前阈值设置得太高,新的结果可能都是真阳性,这会提高准确率。如果之前的阈值大约正确或太低,进一步降低阈值会引入误报,从而降低准确率。

召回率的坟墓 Tp+Fn 不依赖于分类器阈值。这意味着降低分类器阈值可能会通过增加真阳性结果的数量来提高召回率。降低阈值也有可能使召回率保持不变,而准确率会波动。

在图的阶梯区域可以观察到召回率准确率之间的关系——在这些步骤的边缘,阈值的微小变化会大大降低精度,而召回率只有很小的提高。

平均精度 (Average precision - AP) 总结了这样一个图,即在每个阈值处实现的准确率的加权平均值,并将前一个阈值的召回率增加用作权重:

AP=∑n(Rn−Rn−1)PnAP = \textstyle\sum_n(R_n - R_{n-1}) P_n AP=∑n​(Rn​−Rn−1​)Pn​
其中 Pn 和 Rn 是第 n 个阈值的准确率和召回率。一对 (Rk,Pk) 被称为 工作点 ( operating point )。
AP 和操作点下的梯形面积 (sklearn.metrics.auc) 是总结导致不同结果的精确召回曲线的常用方法。在用户指南中内容。

准确率-召回率 曲线通常用于二元分类以研究分类器的输出。为了将 准确率-召回率 曲线和平均精度扩展到多类或多标签分类,需要对输出进行二值化。每个标签可以绘制一条曲线,但也可以通过将标签指标矩阵的每个元素视为二元预测(微平均 - micro-averaging)来绘制准确召回曲线。

提示 也可以参考
sklearn.metrics.average_precision_score,
sklearn.metrics.recall_score,
sklearn.metrics.precision_score,
sklearn.metrics.f1_score

在二分问题内

数据集和模型

我们将使用线性 SVC 分类器来区分两种类型的鸢尾花。

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_splitX, y = load_iris(return_X_y=True)# 加入噪声特征
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.concatenate([X, random_state.randn(n_samples, 200 * n_features)], axis=1)# 限制为前两个类别,然后拆分训练集跟测试集
X_train, X_test, y_train, y_test = train_test_split(X[y < 2], y[y < 2], test_size=0.5, random_state=random_state
)

线性 SVC 期望每个特征具有相似的值范围。因此,我们将首先使用 StandardScaler 缩放数据。

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVCclassifier = make_pipeline(StandardScaler(), LinearSVC(random_state=random_state))
classifier.fit(X_train, y_train)

绘制 准确率-召回率 曲线

要绘制 准确率-召回率 曲线,您应该使用 PrecisionRecallDisplay。实际上,有两种方法可用,具体取决于您是否已经计算了分类器的预测。

让我们首先绘制没有分类器预测的 准确率-召回率 曲线。我们使用 from_estimator 在绘制曲线之前为我们计算预测。

from sklearn.metrics import PrecisionRecallDisplaydisplay = PrecisionRecallDisplay.from_estimator(classifier, X_test, y_test, name="LinearSVC"
)
_ = display.ax_.set_title("2-class Precision-Recall curve")

如果我们已经获得了模型的估计概率或分数,那么我们可以使用 from_predictions。

y_score = classifier.decision_function(X_test)display = PrecisionRecallDisplay.from_predictions(y_test, y_score, name="LinearSVC")
_ = display.ax_.set_title("2-class Precision-Recall curve")

译者注:
其实第一个就是把训练好的模型直接扔进去让他们帮我们把测试集算分,
第二个是把分数算好直接绘制。

在输出结果为多标签模型中

准确率-召回率 曲线不支持结果为多标签(多分类)模型。但是,人们可以决定如何处理这种情况。我们在下面展示了这样一个例子。

创建多标签数据、拟合和预测

我们创建了一个多标签数据集,以说明多标签模型中的准确率-召回率

from sklearn.preprocessing import label_binarize# 使用 label_binarize 进行多标签设置
Y = label_binarize(y, classes=[0, 1, 2])
n_classes = Y.shape[1]# 分为训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5, random_state=random_state
)

我们使用 OneVsRestClassifier 进行多标签预测。

from sklearn.multiclass import OneVsRestClassifierclassifier = OneVsRestClassifier(make_pipeline(StandardScaler(), LinearSVC(random_state=random_state))
)
classifier.fit(X_train, Y_train)
y_score = classifier.decision_function(X_test

多标签模型中的平均准确率分数

from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score# 对应每个分类(标签)
precision = dict()
recall = dict()
average_precision = dict()
for i in range(n_classes):precision[i], recall[i], _ = precision_recall_curve(Y_test[:, i], y_score[:, i])average_precision[i] = average_precision_score(Y_test[:, i], y_score[:, i])# "micro-average"(微平均): 联合量化所有分类(标签)的分数
precision["micro"], recall["micro"], _ = precision_recall_curve(Y_test.ravel(), y_score.ravel()
)
average_precision["micro"] = average_precision_score(Y_test, y_score, average="micro")

绘制 微平均 (micro-average) 准确率-召回率 曲线

绘制每个类别的 准确率-召回率 曲线和 iso-f1 曲线

import matplotlib.pyplot as plt
from itertools import cycle# 设置绘图细节
colors = cycle(["navy", "turquoise", "darkorange", "cornflowerblue", "teal"])_, ax = plt.subplots(figsize=(7, 8))f_scores = np.linspace(0.2, 0.8, num=4)
lines, labels = [], []
for f_score in f_scores:x = np.linspace(0.01, 1)y = f_score * x / (2 * x - f_score)(l,) = plt.plot(x[y >= 0], y[y >= 0], color="gray", alpha=0.2)plt.annotate("f1={0:0.1f}".format(f_score), xy=(0.9, y[45] + 0.02))display = PrecisionRecallDisplay(recall=recall["micro"],precision=precision["micro"],average_precision=average_precision["micro"],
)
display.plot(ax=ax, name="Micro-average precision-recall", color="gold")for i, color in zip(range(n_classes), colors):display = PrecisionRecallDisplay(recall=recall[i],precision=precision[i],average_precision=average_precision[i],)display.plot(ax=ax, name=f"Precision-recall for class {i}", color=color)# 加入 iso-f1 曲线的图例
handles, labels = display.ax_.get_legend_handles_labels()
handles.extend([l])
labels.extend(["iso-f1 curves"])
# 设置图例与坐标轴
ax.set_xlim([0.0, 1.0])
ax.set_ylim([0.0, 1.05])
ax.legend(handles=handles, labels=labels, loc="best")
ax.set_title("Extension of Precision-Recall curve to multi-class")plt.show()

源代码如下:
Download Python source code: plot_precision_recall.py

Download Jupyter notebook: plot_precision_recall.ipynb

准确率-召回率 - Precision-Recall相关推荐

  1. 准确率 召回率_机器学习tips(四):精确率(precision)和召回率(recall)

    精确率(precision)和召回率(recall) 混淆矩阵 True Positive(真正, TP):将正类预测为正类数. True Negative(真负 , TN):将负类预测为负类数. F ...

  2. 目标检测评价标准 精准度(precision)、召回率(recall)、准确率(accuracy)、交除并(IoU)【全】

    引用文章:目标检测评价标准 评价训练效果的值--精准度(precision).召回率(recall).准确率(accuracy).交除并(IoU) TP是正样本预测为正样本 FP是负样本预测为正样本 ...

  3. 一分钟看懂深度学习中的准确率(Accuracy)、精度(Precision)、召回率(Recall)和 mAP

    1. 真假阳性阴性 我们查体的时候,经常会听说检测结果呈"真阳性"."假阴性"等说法. 其中"真"."假"说的是检查结果 ...

  4. 精确率(precision)、召回率(recall)、准确率(accuracy)

    精确率-查准率--precision:你认为的该类样本,有多少猜对了(猜的准确率如何) 召回率-查全率-recall:该类样本有多少被找出来(召回了多少): 准确率-accuracy:正类和负类预测准 ...

  5. 机器学习中精确率(precision)、召回率(recall)和准确率(accuracy)的理解

    注:网上很多讲解都瞎讲,把precision和accuracy概念混淆,误人子弟. 1.精确率(precision)     就precision而言有很多版本,各种说法不一,有精确率也有正确率更有甚 ...

  6. 机器学习评估指标:准确率( Accuracy )、精确率(Precision)、召回率(Recall)、P-R 曲线、均方根误差

    在模型评估过程中,分类问题.排序问题.回归问题往往需要使用不同的指标进行评估.在诸多的评估指标中,大部分指标只能片面地反映模型的一部分性能. 如果不能合理地运用评估指标,不仅不能发现模型本身的问题,而 ...

  7. 准确率(precision)、召回率(recall)和F值

    摘要: 数据挖掘.机器学习和推荐系统中的评测指标-准确率(Precision).召回率(Recall).F值(F-Measure)简介. 引言: 在机器学习.数据挖掘.推荐系统完成建模之后,需要对模型 ...

  8. 如何理解准确率(accuracy)和查准率(Precision)和召回率(Recall)

    这三个概念在第一次接触的时候很容易弄混,又容易被遗忘. 建议大家根据英文去进行记忆,因为中文翻译的时候有许多叫法,会影响我们的理解,不过本文采用的中文是在我看了许多翻译之后,觉得中文最为贴切的一个. ...

  9. 准确率(Accuracy)、精度(Precision)、召回率(Recall)和 mAP 的图解

    机器学习的评价指标让人眼花缭乱.以前我写过一篇笔记总结了这个话题,有兴趣的可以参考一下:一分钟看懂深度学习中的准确率(Accuracy).精度(Precision).召回率(Recall)和 mAP. ...

  10. 准确率(Accuracy),精确率/查准率(Precision), 召回率/查全率(Recall)和F1-Measure

    机器学习(ML), 自然语言处理(NLP), 信息检索(IR)等领域, 评估(Evaluation)是一个必要的工作, 而其评价指标往往有如下几点: 准确率(Accuracy), 精确率(Precis ...

最新文章

  1. java 反序列化漏洞简介
  2. django+mysql 配置一系列问题
  3. 关于Window操作系统中对Oracle的性能监控
  4. Java黑皮书课后题第4章:*4.26(金融应用:货币单位)重写程序清单2-10,解决将float型值转换为int型值时可能会造成精度损失的问题。读取的输入值是一个字符串,比如“11.56“
  5. MySQL-05:pymysql与pycharm设置
  6. 钱少也就算了,为啥我们还越来越忙?
  7. 上周热点回顾(6.17-6.23)
  8. css3中的渐变效果及花斑动画的实现
  9. Vue条件渲染---vue工作笔记0008
  10. JSONObject.fromObject 日期类型转换问题
  11. 华为S9306简单实用配置合集
  12. Android-隐藏app图标以及隐式启动
  13. python中的文件操作:读取、写入、追加、关闭
  14. java实验3_Java实验3
  15. 李宏毅DLHLP.30.Controllable Chatbot
  16. 国外问卷调查一个月能有多大的收益呢?20w+吗?
  17. Labview调用EXE形式COM组件
  18. python10个骚操作
  19. MODBUS-RTU数据帧格式、报文实例
  20. 大学计算机操作题模拟,大学计算机一级模拟操作题1

热门文章

  1. 信贷系统——增加2种模式访问模式A模式(通过销售人员入户的)B模式(通过Erp入户的)
  2. 汇编语言中常用进制数据输出的程序实现
  3. 华为云GPU服务器部署PaddleOCR中英文识别服务
  4. 企业数字化转型的“迷途”和“指南”
  5. 阿里云——媒体云(视频直播)
  6. 达梦数据库如何在线替换dm.key
  7. python22个字符串长度_Python系列之——字符串格式化(xiaozhan is a boy of 22 years ol...
  8. Clone from GitHub with Git extension shows: Received HTTP code 407 from proxy after CONNECT(Git 代理)
  9. ngnix有版本要求吗_DNF:5.21版本更新,安图恩版本回归,熟悉的机制来临
  10. 支付宝小程序使用扩展组件安装