首页 > 编程语言 >分类模型评估(混淆矩阵, precision, recall, f1-score)的原理和Python实现

分类模型评估(混淆矩阵, precision, recall, f1-score)的原理和Python实现

时间:2023-12-20 14:25:09浏览次数:33  
标签:f1 frac Python recall TP score pred 类别 true

混淆矩阵

当我们已经获取到一个分类模型的预测值,可以通过不同指标来进行评估。

往往衡量二分类模型是基于以下的混淆矩阵概念:

  • True Positive:真实值为正、预测值为正(真阳性)
  • False Positive:真实值为负、预测值为正(假阳性)
  • False Negative:真实值为正、预测值为负(假阴性)
  • True Negative:真实值为负、预测值为负(真阴性)

但面对多个分类,比如40多个类别时无法单纯通过正负来混淆矩阵的每个值。在多个类别分类中,可以将每个类别视为应该独立的二元分类问题。对于每个类别A,其余不是类别A的样本可以临时合并为应该“非A”类别。我们将以上定义为:

  • 真阳性 (TP):对于特定类别A,TP是正确标记为A的样本数量。

  • 假阳性 (FP):对于特定类别A,FP是错误地标记为A的其他类别的样本数量。

  • 假阴性 (FN):对于特定类别A,FN是实际为A没有被标记为A的样本数量。

  • 真阴性 (TN):对于特定类别A,TN是既不属于A也没有被标记为A的样本数量。

多分类指标

准确度 Accuracy

$$
Accuracy = \frac{TP+TN}{\text{No.samples}}
$$

  • 准确率指的是所有预测准确的样本的占比。
  • 适用于类别分布平衡的情况,但是再类别不平衡的数据集中可能不是非常靠谱。

精确度 Precision

$$ Precision = \frac{TP}{TP+FP} $$

  • 精确度指的是真阳性在所有正类中的比例,又叫测准率。对于某个类别A,相当于正确判断为A的数量在所有类别A的数量中的比例。
  • 精确度高意味着较少的假阳性(误报)

召回率 Recall(灵敏度 Sensitivity)

$$
Recall = \frac{TP}{TP+FN}
$$

  • 召回率指的是真阳性在所有被预测为正类数据中的比例,表示的是模型获取正类的能力。
  • 召回率高表示漏报正确样本的情况少

F1 Score

$$
F1 Score = 2 \times \frac{Precision \times Recall}{Presision+Recall}
$$

  • F1 Score用于衡量精确度和召回率之间的平衡,作为评估标准更加全面。

  • 适用于评估类别不平衡的情况。

  • F1 Score相当于 Precision 和 Recall的调和平均数
    $$
    F1 Score = \frac {2TP}{2TP+FP+FN}
    $$

    • 调和平均数 (Harmonic mean) 经常被用与分子相同、分母不同的场合,将分母调成平均数再当分母。
      $$
      H_n = \frac{n}{\sum_{i=1}^n \frac{1}{x_i}}
      $$

其中后三种measure在衡量整个数据时,通过以下方式汇总这些指标:

  • 宏观平均 (Macro-average):对每个类别计算指标,然后计算这些指标的平均值。这种方法对所有类别给予了相同的重要性,即使它们的样本量不同。
  • 加权平均 (Weighted-average):与宏观平均类似,但是在计算平均值时考虑到了每个类别的样本量。这对于不平衡的数据集特别有用。
  • 微观平均 (Micro-average):将所有类别的TP、FP和FN累加起来,然后计算指标。在不平衡的数据集中,微观平均通常被认为更为公平。

在Python中绘制混淆矩阵

import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

y_true = [...]	# 正确的标签
y_pred = [...]	# 预测的标签

conf_mat = confusion_matrix(y_true, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=conf_mat,
                              display_labels=np.unique(y_true)
                              )
disp.plot()

在Python中计算各分类指标

python中想要计算如上指标主要是使用 sklearn 包中预先写好的函数。可以使用以下代码进行计算:

from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score

y_true = [...]	# 正确的标签
y_pred = [...]	# 预测的标签

# 计算正确率
accuracy = accuracy_score(y_true, y_pred)
# 计算精确度、召回率和F1分数
precision = precision_score(y_true, y_pred, average='macro')  # 'macro'表示未加权平均
recall = recall_score(y_true, y_pred, average='macro')
f1 = f1_score(y_true, y_pred, average='macro')

或者可以一次性获取所有分类指标的报告。输出的是一个string,每一行为每个类别的统计指标。

from sklearn.metrics import classification_report

# 如果使用`output_dict=True`将获得字典输出, 每个key为一个类别,value为这个类别的各指标dict。
report = classification_report(y_true, y_pred, output_dict=False)	
print(report)

标签:f1,frac,Python,recall,TP,score,pred,类别,true
From: https://www.cnblogs.com/tungsten106/p/17916416.html

相关文章

  • python-docx删除文档部分内容
    1fromdocx.documentimportDocumentas_Document2fromdocx.oxml.text.paragraphimportCT_P3fromdocx.oxml.tableimportCT_Tbl4fromdocx.tableimport_Cell,Table5fromdocx.text.paragraphimportParagraph678defword_cut(document):9......
  • python 数据结构与算法知识图
    1.算法思想:递归、分治(归并排序、二分查找、快速排序)、贪心(贪心策略排序+当前最优)、动态规划(最优子结构+递推式)、回溯(解空间:排列树+子集树、深度搜索+剪枝)、分支限界(解空间:排列树+子集树、广度搜索+剪枝))2.排序算法:(low:冒泡、插入、选择;mid:快排、归并、堆排(完全二叉树),其他:桶排序、基......
  • schedule 定时运行 Python 函数
    安装pipinstallschedule例子每x分钟运行一次importscheduleimporttimedefjob():print("I'mworking...")#每3秒/分钟/小时/天/周运行一次任务、#从现在开始每3秒/分钟/小时/天/周运行一次作业schedule.every(3).seconds.do(job)schedule.every(3).mi......
  • Python实现软件设计模式6:单例模式 Singleton Pattern
    动机针对某个类,为了保证系统中只创建一个示例,并且易于被访问(例如操作系统的任务管理器,软件的登陆注册界面)自行创建这个实例,无法从外部创建这个实例,向系统提供这个实例饿汉式单例Java版本在类加载的时候,就创建对象,如果后续得不到使用,可能会造成内存资源浪费懒汉式单......
  • 《Python网络爬虫:从入门到实战》
    ......
  • CF1914 G Light Bulbs 题解
    LinkCF1914GLightBulbsQuestion有\(2n\)盏灯摆放在一条直线上,每盏灯有一个颜色\(a_i\),灯的颜色一共有\(n\)种,每个颜色的颜色的灯刚好两盏,灯开始都是熄灭的。你选择几盏灯先打开,然后通过以下规则让其他的灯打开选择\(i,j\)是相同颜色的,一盏亮,一盏不亮,你可以使两盏......
  • Python实现软件设计模式5:原型模式 Prototype Pattern
    动机对象的克隆问题,想要复制出本对象的一个副本,属性方法一模一样从需求上来说,先快速克隆对象,后续根据需求再进行对象局部属性的修改区分为深克隆和浅克隆两个版本,默认为浅克隆角色Prototype抽象原型类ConcretePrototype具体原型类Client客户类浅克隆与深克隆......
  • CF1914F Programming Competition
    原题链接感觉有点类似agc034eCompleteCompress,但那题比这个难得多。定义\(f_x\)为以\(x\)为根的子树中,尽可能组队后最多剩下多少人,\(siz_x\)为子树大小。记\(y\inson(x)\)中\(f_y\)最大的点为\(hson_x\)。当\(\sum\limits_{y\inson(x),y\not=hson_x}siz_y<......
  • 如何将 Python 项目打包成 exe,另带卸载功能!
    前言虽然我是做web的,但是对Python的众多开源项目一直都很关注。像之前的stablediffusion的AI绘画,和so-vits-svc音色替换等源码的部署文档都很完善了。尽管如此,对于刚入门的和本地环境搭建各种踩坑的同学,又急于一试就显得不太友好了。针对这一现象,网上早有了各种大佬做......
  • 手把手教你用python做一个年会抽奖系统
    引言马上就要举行年会抽奖了,我们都不知道是否有人能够中奖。我觉得无聊的时候可以尝试自己写一个抽奖系统,主要是为了娱乐。现在人工智能这么方便,写一个简单的代码不是一件困难的事情。今天我想和大家一起构建一个简易的抽奖系统,这样也能够巩固一下我自己对Python语法和框架的理解......