目录

  • 混淆矩阵
  • 准确率
  • 精确率
  • 召回率
  • P-R曲线
  • F1 score
  • 参考资料

分类是机器学习中比较常见的任务,对于分类任务常见的评价指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 score、ROC曲线(Receiver Operating Characteristic Curve)等。
这篇文章将结合sklearn对准确率、精确率、召回率、F1 score进行讲解,ROC曲线可以参考我的这篇文章: sklearn ROC曲线使用。

混淆矩阵


如上图所示,要了解各个评价指标,首先需要知道混淆矩阵,混淆矩阵中的P表示Positive,即正例或者阳性,N表示Negative,即负例或者阴性。
表中FP表示实际为负但被预测为正的样本数量,TN表示实际为负被预测为负的样本的数量,TP表示实际为正被预测为正的样本数量,FN表示实际为正但被预测为负的样本的数量。
另外,TP+FP=P’表示所有被预测为正的样本数量,同理FN+TN为所有被预测为负的样本数量,TP+FN为实际为正的样本数量,FP+TN为实际为负的样本数量。

准确率

准确率是分类正确的样本占总样本个数的比例,即
A c c u r a c y = n c o r r e c t n t o t a l Accuracy = \frac{n_{correct}}{n_{total}} Accuracy=ntotal​ncorrect​​
其中, n c o r r e c t n_{correct} ncorrect​为被正确分类的样本个数, n t o t a l n_{total} ntotal​为总样本个数。
结合上面的混淆矩阵,公式还可以这样写:
A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy = \frac{TP+TN}{TP+TN+FP+FN} Accuracy=TP+TN+FP+FNTP+TN​
准确率是分类问题中最简单直观的评价指标,但存在明显的缺陷。比如如果样本中有99%的样本为正样本,那么分类器只需要一直预测为正,就可以得到99%的准确率,但其实际性能是非常低下的。也就是说,当不同类别样本的比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素。
下面我们看一下sklearn中计算准确率的示例:

import numpy as np
from sklearn.metrics import accuracy_scorey_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
print(accuracy_score(y_true, y_pred))  # 0.5
print(accuracy_score(y_true, y_pred, normalize=False))  # 2# 在具有二元标签指示符的多标签分类案例中
print(accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2))))  # 0.5

函数接口的描述是这样的:

准确度分类得分
 
在多标签分类中,此函数计算子集精度:为样本预测的标签集必须完全匹配y_true(实际标签)中相应的标签集。
 
参数
y_true : 一维数组,或标签指示符 / 稀疏矩阵,实际(正确的)标签.
y_pred : 一维数组,或标签指示符 / 稀疏矩阵,分类器返回的预测标签.
normalize : 布尔值, 可选的(默认为True). 如果为False,返回分类正确的样本数量,否则,返回正 确分类的得分.
sample_weight : 形状为[样本数量]的数组,可选. 样本权重.
 
返回值
score : 浮点型
如果normalize为True,返回正确分类的得分(浮点型),否则返回分类正确的样本数量(整型).
当normalize为True时,最好的表现是score为1,当normalize为False时,最好的表现是score未样本数量.

代码的输出我已经写在注释中了,需要注意的是最后一行代码中,y_true为 [ 0 1 1 1 ] \begin{bmatrix}0 & 1 \\ 1 & 1 \\\end{bmatrix} [01​11​],y_pred为 [ 1 1 1 1 ] \begin{bmatrix}1 & 1 \\ 1 & 1 \\\end{bmatrix} [11​11​],矩阵的行表示样本,列表示标签(样本具有两个标签,标签0和1共同确定样本类别),那么这时实际上只有一个样本是预测正确的,因此准确率为 1 2 \frac{1}{2} 21​,即0.5。
另外,因为准确率的缺陷比较明显,所以在多分类问题中一般不直接使用整体的分类准确率,而是使用每个类别下的样本准确率的算术平均作为模型的评估指标。

精确率

精确率指模型预测为正的样本中实际也为正的样本占被预测为正的样本的比例。计算公式为:
P r e c i s i o n = T P T P + F P Precision = \frac{TP}{TP+FP} Precision=TP+FPTP​
sklearn中的函数接口precision_score的描述如下:

计算精确率
 
精确率是 tp / (tp + fp)的比例,其中tp是真正性的数量,fp是假正性的数量. 精确率直观地可以说是分类器不将负样本标记为正样本的能力.
 
精确率最好的值是1,最差的值是0.
 
参数
y_true : 一维数组,或标签指示符 / 稀疏矩阵,实际(正确的)标签.
y_pred : 一维数组,或标签指示符 / 稀疏矩阵,分类器返回的预测标签.
labels : 列表,可选值. 当average != binary时被包含的标签集合,如果average是None的话还包含它们的顺序. 在数据中存在的标签可以被排除,比如计算一个忽略多数负类的多类平均值时,数据中没有出现的标签会导致宏平均值(marco average)含有0个组件. 对于多标签的目标,标签是列索引. 默认情况下,y_true和y_pred中的所有标签按照排序后的顺序使用.
pos_label : 字符串或整型,默认为1. 如果average = binary并且数据是二进制时需要被报告的类. 若果数据是多类的或者多标签的,这将被忽略;设置labels=[pos_label]和average != binary就只会报告设置的特定标签的分数.
average : 字符串,可选值为[None, ‘binary’ (默认), ‘micro’, ‘macro’, ‘samples’, ‘weighted’]. 多类或 者多标签目标需要这个参数. 如果为None,每个类别的分数将会返回. 否则,它决定了数据的平均值类型.
‘binary’: 仅报告由pos_label指定的类的结果. 这仅适用于目标(y_{true, pred})是二进制的情况.
‘micro’: 通过计算总的真正性、假负性和假正性来全局计算指标.
‘macro’: 为每个标签计算指标,找到它们未加权的均值. 它不考虑标签数量不平衡的情况.
‘weighted’: 为每个标签计算指标,并通过各类占比找到它们的加权均值(每个标签的正例数).它解决了’macro’的标签不平衡问题;它可以产生不在精确率和召回率之间的F-score.
‘samples’: 为每个实例计算指标,找到它们的均值(只在多标签分类的时候有意义,并且和函数accuracy_score不同).
sample_weight : 形状为[样本数量]的数组,可选参数. 样本权重.
 
返回值
precision : 浮点数(如果average不是None) 或浮点数数组, shape =[唯一标签的数量]
二分类中正类的精确率或者在多分类任务中每个类的精确率的加权平均.

官方示例代码为:

from sklearn.metrics import precision_scorey_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(precision_score(y_true, y_pred, average='macro'))  # 0.2222222222222222
print(precision_score(y_true, y_pred, average='micro'))  # 0.3333333333333333
print(precision_score(y_true, y_pred, average='weighted'))  # 0.2222222222222222
print(precision_score(y_true, y_pred, average=None))  # [0.66666667 0.         0.        ]

直接看函数接口和示例代码还是让人有点云里雾里的,我们这里先介绍两个与多分类相关的概念,再说说上面的代码是如何计算的。

  • Macro Average
    宏平均是指在计算均值时使每个类别具有相同的权重,最后结果是每个类别的指标的算术平均值。
  • Micro Average
    微平均是指计算多分类指标时赋予所有类别的每个样本相同的权重,将所有样本合在一起计算各个指标。

根据precision_score接口的解释,我们可以知道,当average参数为None时,得到的结果是每个类别的precision。上面的y_true有3个类别,分别为类0、类1、类2。我们将每个类别的TP、FP、FN列在下表中。

类别 TP FP FN
类0 2 1 0
类1 0 2 2
类2 0 1 1

那么每个类别的precision也就得到了,如下所示:
P 0 = 2 1 + 2 = 2 3 ≈ 0.667 P_0=\frac{2}{1+2} = \frac{2}{3}\approx0.667 P0​=1+22​=32​≈0.667
P 1 = 0 0 + 2 = 0 P_1=\frac{0}{0+2}=0 P1​=0+20​=0
P 2 = 0 0 + 1 = 0 P_2=\frac{0}{0+1}=0 P2​=0+10​=0
从而Macro Precision也就知道了,就是 ( P 0 + P 1 + P 2 ) / 3 = 2 / 9 ≈ 0.222 (P_0+P_1+P_2)/3=2/9\approx0.222 (P0​+P1​+P2​)/3=2/9≈0.222。
Micro Precision的计算要从每个样本考虑,所有样本中预测正确的有两个,那么TP就是2,剩下的4个预测结果都可以看做FP,那么Micro Precision就是 2 / ( 2 + 4 ) = 1 / 3 ≈ 0.333 2/(2+4)=1/3\approx0.333 2/(2+4)=1/3≈0.333。
最后还有一个average='weighted’的情况,因为这里每个类别的数量都恰好占比1/3,所以结果是 P w = 1 3 ∗ P 0 + 1 3 ∗ P 1 + 1 3 ∗ P 2 ≈ 0.222 P_w = {1\over3}*P_0+{1\over3}*P_1+{1\over3}*P_2\approx0.222 Pw​=31​∗P0​+31​∗P1​+31​∗P2​≈0.222
虽然,我们是主要讲精确率的,但是宏平均和微平均的概念也很重要,这里顺便对比一下。

  • 如果每个类别的样本数量差不多,那么宏平均和微平均没有太大差异
  • 如果每个类别的样本数量差异很大,那么注重样本量多的类时使用微平均,注重样本量少的类时使用宏平均
  • 如果微平均大大低于宏平均,那么检查样本量多的类来确定指标表现差的原因
  • 如果宏平均大大低于微平均,那么检查样本量少的类来确定指标表现差的原因

召回率

召回率指实际为正的样本中被预测为正的样本所占实际为正的样本的比例。
sklearn中recall_score方法和precision_score方法的参数说明都是一样的,所以这里不再重复,只是把函数和返回值说明贴在下面:

计算召回率
 
召回率是比率tp / (tp + fn),其中tp是真正性的数量,fn是假负性的数量. 召回率直观地说是分类器找到所有正样本的能力.
召回率最好的值是1,最差的值是0.
 
返回值
recall : 浮点数(如果average不是None) 或者浮点数数组,shape = [唯一标签的数量]
二分类中正类的召回率或者多分类任务中每个类别召回率的加权平均值.

官方示例代码为:

from sklearn.metrics import recall_scorey_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(recall_score(y_true, y_pred, average='macro'))  # 0.3333333333333333
print(recall_score(y_true, y_pred, average='micro'))  # 0.3333333333333333
print(recall_score(y_true, y_pred, average='weighted'))  # 0.3333333333333333
print(recall_score(y_true, y_pred, average=None))  # [1. 0. 0.]

Recall和Precision只有计算公式不同,它们average参数为’macro’,‘micro’,'weighted’和None时的计算方式都是相同的,具体计算可以使用上节列出来的TP、FP、FN表,这里不再赘述。

P-R曲线

评价一个模型的好坏,不能仅靠精确率或者召回率,最好构建多组精确率和召回率,绘制出模型的P-R曲线。
下面说一下P-R曲线的绘制方法。P-R曲线的横轴是召回率,纵轴是精确率。P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。整条P-R曲线是通过将阈值从高到低移动而生成的。原点附近代表当阈值最大时模型的精确率和召回率。
关于P-R曲线,因为我自己使用的比较少,所以这里就不深入给大家说了。
sklearn里P-R曲线的使用可以参考:precision_recall_cure。
P-R曲线的理解可以参考这篇博客:P-R曲线深入理解。

F1 score

F1 score是精确率和召回率的调和平均值,计算公式为:
F 1 = 2 ∗ p r e c i s i o n ∗ r e c a l l p r e c i s i o n + r e c a l l F1 = \frac{2 * precision * recall}{precision + recall} F1=precision+recall2∗precision∗recall​
Precision体现了模型对负样本的区分能力,Precision越高,模型对负样本的区分能力越强;Recall体现了模型对正样本的识别能力,Recall越高,模型对正样本的识别能力越强。F1 score是两者的综合,F1 score越高,说明模型越稳健。
sklearn中f1_score方法和precision_score方法、recall_score方法的参数说明都是一样的,所以这里不再重复,只是把函数和返回值说明贴在下面:

计算F1 score,它也被叫做F-score或F-measure.
 
F1 score可以解释为精确率和召回率的加权平均值. F1 score的最好值为1,最差值为0. 精确率和召回率对F1 score的相对贡献是相等的. F1 score的计算公式为:
F1 = 2 * (precision * recall) / (precision + recall)
 
在多类别或者多标签的情况下,这是权重取决于average参数的对于每个类别的F1 score的加权平均值.
返回值
f1_score : 浮点数或者是浮点数数组,shape=[唯一标签的数量]
二分类中的正类的F1 score或者是多分类任务中每个类别F1 score的加权平均.

官方示例代码为:

from sklearn.metrics import f1_scorey_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(f1_score(y_true, y_pred, average='macro'))  # 0.26666666666666666
print(f1_score(y_true, y_pred, average='micro'))  # 0.3333333333333333
print(f1_score(y_true, y_pred, average='weighted'))  # 0.26666666666666666
print(f1_score(y_true, y_pred, average=None))  # [0.8 0.  0. ]

这里计算还是套公式,所以也就不再多说了。

参考资料

多标签分类的结果评估—macro-average和micro-average介绍
《百面机器学习》(诸葛越主编、葫芦娃著)第二章第1节——评估指标的局限性

sklearn计算准确率、精确率、召回率、F1 score相关推荐

  1. 『NLP学习笔记』Sklearn计算准确率、精确率、召回率及F1 Score

    Sklearn计算准确率.精确率.召回率及F1 Score! 文章目录 一. 混淆矩阵 1.1. 混淆矩阵定义 1.2. 例子演示 二. 准确率 2.1. 准确率定义 2.2. 例子演示 三. 精确率 ...

  2. 【机器学习入门】(13) 实战:心脏病预测,补充: ROC曲线、精确率--召回率曲线,附python完整代码和数据集

    各位同学好,经过前几章python机器学习的探索,想必大家对各种预测方法也有了一定的认识.今天我们来进行一次实战,心脏病病例预测,本文对一些基础方法就不进行详细解释,有疑问的同学可以看我前几篇机器学习 ...

  3. 准确率 召回率_机器学习中F值(F-Measure)、准确率(Precision)、召回率(Recall)

    在机器学习.数据挖掘.推荐系统完成建模之后,需要对模型的效果做评价. 业内目前常常采用的评价指标有准确率(Precision).召回率(Recall).F值(F-Measure)等,下图是不同机器学习 ...

  4. 机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)

    转载自:https://www.cnblogs.com/Zhi-Z/p/8728168.html 摘要: 数据挖掘.机器学习和推荐系统中的评测指标-准确率(Precision).召回率(Recall) ...

  5. 准确率(Precision)、召回率(Recall)以及F值(F-Measure)

    在信息检索.分类体系中,有一系列的指标,搞清楚这些指标对于评价检索和分类性能非常重要,因此最近根据网友的博客做了一个汇总. 准确率.召回率.F1 信息检索.分类.识别.翻译等领域两个最基本指标是召回率 ...

  6. 机器学习:准确率(Precision)、召回率(Recall)、F值(F-Measure)、ROC曲线、PR曲线

    增注:虽然当时看这篇文章的时候感觉很不错,但是还是写在前面,想要了解关于机器学习度量的几个尺度,建议大家直接看周志华老师的西瓜书的第2章:模型评估与选择,写的是真的很好!! 以下第一部分内容转载自:机 ...

  7. 推荐系统评测指标—准确率(Precision)、召回率(Recall)、F值(F-Measure)

     下面简单列举几种常用的推荐系统评测指标: 1.准确率与召回率(Precision & Recall) 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量.其 ...

  8. 自然语言处理:分词评测指标——准确率(Precision)、召回率(Recall)、F值(F-Measure)

    下面简单列举几种常用的推荐系统评测指标: 1.准确率与召回率(Precision & Recall) 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量.其中精度 ...

  9. 机器学习深度学习:准确率(Precision)、召回率(Recall)、F值(F-Measure)、ROC曲线、PR曲线

    增注:虽然当时看这篇文章的时候感觉很不错,但是还是写在前面,想要了解关于机器学习度量的几个尺度,建议大家直接看周志华老师的西瓜书的第2章:模型评估与选择,写的是真的很好!! 以下第一部分内容转载自:机 ...

最新文章

  1. android的NDK和java进行本地socket通信
  2. leetcode 516. Longest Palindromic Subsequence | 516. 最长回文子序列(递归 -> 傻缓存 ->DP)
  3. 与詹金斯一起将GitLab中的Gradle项目发布到Artifactory
  4. 关于数组首地址a、a+1、a[0]、a[0]+1、*a、*a、a+0的解析
  5. 红橙Darren视频笔记 view的绘制流程(下)基于API27
  6. html5 导航栏置顶,html5导航栏横向
  7. android 入门记录
  8. “3D 元宇宙技术”在汽车新零售领域的应用与实践
  9. 高绩效团队-VUCA时代的五个管理策略《二》—代际管理
  10. 阿里巴巴python招聘_作为应届生,我在阿里巴巴的成功面试经历!
  11. 盘点十大生鲜商城平台,生鲜电商还值不值得做
  12. 如何完全清除linux内核,清除旧的Linux内核
  13. python猜拳if判断语句_python使用if语句实现一个猜拳游戏详解
  14. 输入法(IME)实现原理
  15. 来自Jdon的DDD总结
  16. NCP1251BSN65T1G一款高度集成的 PWM 控制器 用于离线电源
  17. 《杜拉拉升职记》第二部,一本失败的小说,一本中层管理的最佳实践手册
  18. python+selenium实现学术网站上的pdf下载
  19. python中出栈的方法,python中栈的原理及实现方法示例
  20. 一张图了解三方支付流程

热门文章

  1. CCC3.0学习笔记_SPAKE2+ Flow 流程
  2. tp5 Auth权限认证方法与步骤
  3. 六、SAR(合成孔径雷达)数据样本标注
  4. Spring依赖注入的三种实现方式
  5. 【目标检测 DeformableDETR】通俗理解 DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION,值得一看。
  6. 保存彩信图片到sd卡指定文件夹中
  7. Red Hat Ansible Automation Platform 安装
  8. NOIP 2011 普及组 数字反转
  9. [商汤]一个狗妈妈有70块肉,狗宝宝距离狗妈妈60步。每次狗妈妈最多拿40块肉,每走2步需要吃掉一块肉,则它最多能把 多少 块肉拿给狗宝宝。
  10. android 带刻度的滑动条_android 滚轮刻度尺的实现