sklearn计算准确率、精确率、召回率、F1 score

sklearn计算准确率、精确率、召回率、F1 score目录混淆矩阵准确率精确率召回率分类是机器学习中比较常见的任务 对于分类任务常见的评价指标有准确率 Accuracy 精确率 Precision 召回率 Recall F1score ROC 曲线 ReceiverOper 等 这篇文章将结合 sklearn 对准确率 精确率 召回率 F1score 进行讲解 ROC 曲线可以参考我的这篇文章

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

混淆矩阵

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






准确率

import numpy as np from sklearn.metrics import accuracy_score y_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为 [ 0 1 1 1 ] \begin{bmatrix}0 & 1 \\ 1 & 1 \\\end{bmatrix} [0111],y_pred为 [ 1 1 1 1 ] \begin{bmatrix}1 & 1 \\ 1 & 1 \\\end{bmatrix} [1111],矩阵的行表示样本,列表示标签(样本具有两个标签,标签0和1共同确定样本类别),那么这时实际上只有一个样本是预测正确的,因此准确率为 1 2 \frac{1}{2} 21,即0.5。
另外,因为准确率的缺陷比较明显,所以在多分类问题中一般不直接使用整体的分类准确率,而是使用每个类别下的样本准确率的算术平均作为模型的评估指标。

精确率

官方示例代码为:

from sklearn.metrics import precision_score y_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.22222 print(precision_score(y_true, y_pred, average='micro')) # 0.33333 print(precision_score(y_true, y_pred, average='weighted')) # 0.22222 print(precision_score(y_true, y_pred, average=None)) # [0. 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
  • 如果每个类别的样本数量差不多,那么宏平均和微平均没有太大差异
  • 如果每个类别的样本数量差异很大,那么注重样本量多的类时使用微平均,注重样本量少的类时使用宏平均
  • 如果微平均大大低于宏平均,那么检查样本量多的类来确定指标表现差的原因
  • 如果宏平均大大低于微平均,那么检查样本量少的类来确定指标表现差的原因

召回率

官方示例代码为:

from sklearn.metrics import recall_score y_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.33333 print(recall_score(y_true, y_pred, average='micro')) # 0.33333 print(recall_score(y_true, y_pred, average='weighted')) # 0.33333 print(recall_score(y_true, y_pred, average=None)) # [1. 0. 0.] 

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

P-R曲线

F1 score

官方示例代码为:

from sklearn.metrics import f1_score y_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. print(f1_score(y_true, y_pred, average='micro')) # 0.33333 print(f1_score(y_true, y_pred, average='weighted')) # 0. print(f1_score(y_true, y_pred, average=None)) # [0.8 0. 0. ] 

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

参考资料




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204573.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午8:01
下一篇 2026年3月19日 下午8:01


相关推荐

  • 为了帮粉丝完成毕业设计,我发现了一款私活神器

    为了帮粉丝完成毕业设计,我发现了一款私活神器在 mac 自建一套 学员管理系统

    2026年3月19日
    2
  • jmeter 通过beanshell获取变量

    jmeter 通过beanshell获取变量第一种 1 测试计划输入用户自定义变量 2 添加 beanshellsam 通过 vars get 获取变量 vars get name vars put 赋值 格式为 vars put key value 3 添加 debugsampler 添加查看结果树 运行查看结果第二种 1 添加 beanshellsam 通过 test 方法 返回结果和值 2 添加 debugsample

    2026年3月18日
    1
  • volatile关键字及其作用「建议收藏」

    volatile关键字及其作用「建议收藏」概述:本文主要介绍Java语言中的volatile关键字,内容涵盖volatile的保证内存可见性、禁止指令重排等。

    2022年5月31日
    32
  • 每日一练No.1

    每日一练No.1

    2021年8月19日
    46
  • 向量范数和矩阵范数的理解

    向量范数和矩阵范数的理解向量范数今天来聊一聊机器学习矩阵论的相关知识——范数(Norm)。在学习机器学习基础算法的推导过程中,可以看到很多地方都应用到了这个范数。范数属于矩阵论的知识范围,可见数学基础的重要性。机器学习的数学基础重点推荐——MIT的机器学习数学基础课如果只需要快速了解,请参考——矩阵范数计算完整的MIT数学基础课程笔记可以参考:MIT18.06线性代数笔记这是个非常棒的手动演算流程,本文也将编码进行验算。向量范数定义:一个向量空间V到实数空间的映射,不仅如此,还要满足喜爱额条件:∣∣x∣∣⩾

    2026年1月21日
    4
  • pycharm修改字体大小和主题_pycharm调字体

    pycharm修改字体大小和主题_pycharm调字体PyCharm主题、字体设置从菜单栏File–>Settings,打开PyCharm设置界面点击Appearance&Behavior–>Appearance,设置IDE主题,推荐Darcula,主要是因为黑色比较不伤眼点击Editor–>Font设置代码编辑器的字体和字号字体(Font)推荐使用DejaVuSansMono。要是找不到这种字体,看见那个绿色的框了吗?取消showonlymonospacedfon

    2022年8月26日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号