首先介绍一下性能度量

性能度量:对学习器的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量

性能度量反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的"好坏"是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求。

分类任务中常用的性能度量

  • 错误率与精度:通常我们把分类错误的样本数占样本总数的比例称为"错误率" ,即如果在m 个样本中有α 个样本分类错误,则错误率E= α/m; 相应的,1-α/m 称为"精度",即"精度=1一错误率

    错误率和精度虽常用,但并不能满足所有任务需求。以西瓜问题为例,假定瓜农拉来一车西瓜,我们用训练好的模型对这些西瓜进行判别,显然,错误率衡量了有多少比例的瓜被判别错误。但是若我们关心的是"挑出的西瓜中有多少比例是好瓜",或者"所有好瓜中有多少比例被挑了出来,那么错误率显然就不够用了,“查准率”与“查全率”更适合此类需求的性能度量

  • 查准率查全率

    对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划 分为真正例(true positive) 、假正例(false positive) 、真反倒(true negative) 、假反例(false negative) 四种情形

TP:被正确划分为正例的个数,即实际为正例且被分类器划分为正例的样例数

FP:被错误地划分为正例的个数,即实际为反例但被分类器划分为正例的样例数

FN:被错误地划分为反例的个数,即实际为正例但被分类器划分为反例的样例数

TN:被正确划分为反例的个数,即实际为反例且被分类器划分为反例的样例数

查准率P:

查全率R:

查准率和查全率是一对矛盾的度量。一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。

例如:查全率是希望将好瓜尽可能的选出来,可通过增加选瓜的数量来实现,如果将所有西瓜都选上,那么所有的好瓜也必然都被选上了,这样查准率就会比较低;查准率是希望选出的瓜中好瓜比例尽可能高,则可只挑选最有把握的瓜, 但这样就难免会漏掉不少好瓜,使得查全率较低.

P-R曲线:

在很多情形下,我们可根据学习器的预测结果对样例进行排序,排在前面的是学习器认为"最可能"是正例的样本,排在最后的则是学习器认为"最不可能"是正例的样本。按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率,以查准率为纵轴、查全率为横轴作图,就得到了查准率-查全率曲线,简称" P-R 曲线"

如何通过P-R曲线比较两个机器学习模型的效果:

  • 若一个学习器的P-R 曲线被另一个学习器的曲线完全"包住" , 则可断言后者的性能优于前者, 例如图2.3 中学习器A 的性能优于学习器C; 如果两个学习器的P-R 曲线发生了交叉, 例如图2.3 中的A 与B ,则难以一般性地断言两者孰优孰劣,只能在具体的查准率或查全率条件下进行比较。

  • 在很多情形下,人们往往仍希望把学习器A 与B 比出个高低。这时一个比较合理的判据是比较P-R 曲线下面积的大小,它在一定程度上表征了学习器在查准率和查全率上取得相对"双高"的比例。但这个值不太容易估算, 因此,人们设计了一些综合考虑查准率、查全率的性能度量,如平衡点,F1度量.

P-R曲线的绘制:(参考博客:http://t.csdn.cn/rbcFh)

图中有10个样本,真实标签和预测结果如下,首先根据学习器的预测结果对样例进行排序:

按此顺序逐个把样本作为正例进行预测, 我们把第一个样本作为正例:

此时可得到:

此时查准率P与查全率R分别为:

接着,我们把前三个当作正例:

此时可得到:

此时查准率P与查全率R分别为:

我们按顺序逐个把样本作为正例进行预测,就可以计算出当前的查全率、查准率。

ROC曲线:

ROC 全称是"受试者工作特征" (Receiver Operating Characteristic) 曲线,与P-R曲线相似,我们根据学习器的预测结果对样例进行排序,样本作为正例进行预测,每次计算出两个重要量的值,分别以它们为横、纵坐标作图'就得到了”ROC“曲线,与P-R 曲线使用查准率、查全率为纵、横轴不同, ROC 曲线的纵轴是"真正例率" (True Positive Rate,简称TPR) ,横轴是"假正例率" (False PositiveRate,简称FPR)

  • 若一个学习器的ROC 曲线被另一个学习器的曲线完全"包住", 则可断言后者的性能优于前者;若两个学习器的ROC 曲线发生交叉,则难以一般性地断言两者孰优孰劣。此时如果一定要进行比较, 则较为合理的判据是比较ROC 曲线下的面积,即AUC

P-R曲线和ROC曲线绘制的代码实现

导入需要的包:

from distutils.log import error
import matplotlib
import numpy as np
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn. model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import roc_curve
from sklearn.linear_model import LogisticRegression

加载数据集,进行训练,这里使用的是经典用于二分类任务的数据集, 乳腺癌数据集

# 使用Sklearn提供的乳腺癌数据集
data = load_breast_cancer()
X = data.data
y = data.target
​
# 划分训练集和测试集数据
X_train,X_test,y_train, y_test = train_test_split(X,y,test_size=0.3)
​
# 训练模型
model = LogisticRegression()
​
model.fit(X_train, y_train)
​
# predict_proba的输出是每个类别的概率,对于二分类问题,它的形状始终是(n_sample,2)
scores = model.predict_proba(X_test)      

P-R曲线的绘制:

plt.figure("P-R Curve")
plt.title('Precision/Recall Curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
​
# precision_recall_curve的输入为:
# y_test:二进制标签
# scores:估计的概率
# pos_label:正类的标签
# 计算不同的阈值的查全率和查准率,此实现仅限于二进制分类任务
precision, recall, thresholds = precision_recall_curve(y_test, scores[:,-1],pos_label=1)
plt.plot(recall,precision)
plt.show()

运行结果如下:

ROC曲线绘制

plt.figure("ROC Curve")
plt.title('TPR/FPR Curve')
plt.xlabel('FPR')
plt.ylabel('TPR')
​
# roc_curve的输入为:
# y: 样本标签
# scores: 模型对样本属于正例的概率输出
# pos_label: 标记为正例的标签,本例中标记为1的即为正例
fpr,tpr, thresholds = metrics.roc_curve(y_test,scores[:,-1],pos_label=1)
​
​
plt.plot(fpr,tpr)
plt.show()

运行结果如下:

PR曲线和ROC曲线的联系: (参考文章: ROC曲线和PR(Precision-Recall)曲线的联系_SEAN是一只程序猿 )

在机器学习中,ROC(Receiver Operator Characteristic)曲线被广泛应用于二分类问题中来评估分类器的可信度,但是当处理一些高度不均衡的数据集时,PR曲线能表现出更多的信息,发现更多的问题

参考书籍:[1]周志华. 机器学习[M]. 清华大学出版社, 2016.

机器学习(一)PR曲线和ROC曲线相关推荐

  1. 机器学习性能度量(1):P-R曲线与ROC曲线,python sklearn实现

    最近做实验要用到性能度量的东西,之前学习过现在重新学习并且实现一下. 衡量模型泛化能力的评价标准,这就是性能度量.性能度量反应了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判 ...

  2. 机器学习笔记--PR曲线和ROC曲线

    最近在看周志华老师的机器学习,本文主要是对PR图和ROC曲线的整理. 一.PR图 对于二分类问题,根据分类结果能形成"混淆矩阵". P是查准率,R是查全率,定义如下: 查准率P类似 ...

  3. 机器学习:python绘制P-R曲线与ROC曲线

    Python绘制P-R曲线与ROC曲线 查准率与查全率 P-R曲线的绘制 ROC曲线的绘制 查准率与查全率   P-R曲线,就是查准率(precision)与查全率(recall)的曲线,以查准率作为 ...

  4. 机器学习中的性能指标:精度、召回率,PR曲线,ROC曲线和AUC,及示例代码

    机器学习中的性能指标:精度.召回率.PR曲线,ROC曲线和AUC 精度.召回率 基本概念 F-Score 度量曲线 PR曲线 ROC曲线 PR曲线和ROC曲线的比较 AUC 精度.召回率 基本概念 可 ...

  5. 机器学习模型性能评估(二):P-R曲线和ROC曲线

    上文简要介绍了机器学习模型性能评估的四种方法以及应用场景,并详细介绍了错误率与精度的性能评估方法.本文承接上文,继续介绍模型性能评估方法:P-R曲线和ROC曲线.                   ...

  6. 百面机器学习 #2 模型评估:0102 精确率与召回率,假阳性与真阳性率,PR曲线和ROC曲线

    文章目录 1. P-R(Precision-Recall)曲线 F1 score 2. 平方根误差的局限性 3. ROC曲线 ROC曲线绘制 4. AUC predict Positive predi ...

  7. 机器学习笔记(一)P-R曲线与ROC曲线

    P-R曲线与ROC曲线 一.什么是P-R曲线? 二.什么是ROC曲线? 三.P-R曲线与ROC曲线有什么用? 三.绘制P-R曲线代码 一.什么是P-R曲线? 要知道什么是P-R曲线,首先,我们要先了解 ...

  8. 一文详尽混淆矩阵、准确率、精确率、召回率、F1值、P-R 曲线、ROC 曲线、AUC 值、Micro-F1 和 Macro-F1

    文章目录 二分类的评价指标 一.混淆矩阵与 TP.TN.FP.FN 二.准确率.精确率.召回率.F1值 三.P-R 曲线 四.ROC 曲线.AUC 值 五.P-R曲线和ROC曲线有什么区别,如何选择? ...

  9. 机器学习分类模型评价指标之ROC 曲线、 ROC 的 AUC 、 ROI 和 KS

    前文回顾: 机器学习模型评价指标之混淆矩阵 机器学习模型评价指标之Accuracy.Precision.Recall.F-Score.P-R Curve.AUC.AP 和 mAP 图裂的话请参考:ht ...

  10. P-R曲线与ROC曲线使用总结

    P-R曲线与ROC曲线总结 作者:jliang https://blog.csdn.net/jliang3 1.P-R曲线 1)实际预测时二分类的四种情况 真阳性/真正类(True Positive, ...

最新文章

  1. 全凭“脚感”,这个不看路的机器人就能稳稳爬楼梯,一脚踩空也不怕 | RSS 2021...
  2. http路径转file会变成反斜杠_PHP session反序列化漏洞
  3. GLUT库与GLAUX库
  4. android读取外部图片,Android读取本地图库与调用摄像头拍摄
  5. CodeForces 906D (欧拉降幂)
  6. RedHat/Centos修改root密码
  7. linux内核分析与移植,内核分析移植
  8. Kubernetes 入门(1)基本概念
  9. [C++] - 单例模式 释放资源 析构函数的应用
  10. 4.10_composite_结构型模式:组合模式
  11. 学JS的心路历程 - JS应用
  12. 针对binlog MIXED格式对表的增删改统计分析
  13. 用java语言求老汉卖西瓜程序_Java编程练习题
  14. mdl文件是c语言,mdl文件扩展名,mdl文件怎么打开?
  15. 中国移动短信MISC割接
  16. Docker学习总结
  17. SQL Server 函数汉字转首字母或全拼
  18. UMLChina建模竞赛第3赛季第8轮:交友辅助系统,赵雅芝
  19. z分数(z-score)——之前世今生
  20. 如何选择PXI与PXIe开关模块

热门文章

  1. 企业u盘系统服务器,服务器u盘装系统
  2. 小程序梦想贩卖机v2-1.0.88-带4插件(2022.9.8更新)
  3. 梦想贩卖机v2-1.069
  4. 计算机保研面试中,都有哪些令人窒息的问题?
  5. 中国莽草酸行业市场深度调查报告(2022版)
  6. 计算机上显示找不到无线网络连接,笔记本没有无线网络连接怎么办 解决方法介绍【图解】...
  7. 标签设计软件如何设计注册商标标识
  8. android提权工具包,安卓手机root权限一键提权工具_kingroot PC V4.8.5 免费版
  9. android百度地图公交路线,android百度地图api实现查询经过某站点的所有公交路线...
  10. java openoffic linux_怎样使用Java读取OpenOffice文档