sklearn中多分类和多标签分类评估方法总结

news2025/1/16 16:08:29

一、任务区分

  1. 多分类分类任务:在多分类任务中,每个样本只能被分配到一个类别中。换句话说,每个样本只有一个正确的标签。例如,将图像分为不同的物体类别,如猫、狗、汽车等。

  2. 多标签分类任务:在多标签分类任务中,每个样本可以被分配到一个或多个类别中。换句话说,每个样本可以有多个正确的标签。例如,在图像标注任务中,一张图像可能同时包含猫和狗,因此它可以同时被分配到 "猫" 和 "狗" 这两个标签。

二、sklearn评估方式

 1、多分类(multiclass)任务

多分类任务的标签有两种,一种是原始标签,例如[0,1,2],另一种是独热编码的形式,[[1,0,0],[0,1,0],[0,0,1]]

经过模型分类之后的结果一般是各类的预测分数

(1)准确率(Accuracy):是分类正确的样本数与总样本数之比,是最简单的评估方法,但在类别不平衡的情况下可能会失效。

(2)混淆矩阵(Confusion Matrix):是一个 N×N 的矩阵(N 为类别数量),将真实类别与预测类别的对应关系表示出来。基于混淆矩阵可以计算精确率、召回率、F1 分数等指标。

(3)精确率(Precision)召回率(Recall):精确率表示被分类器正确分类的正样本数量与分类器预测为正样本的样本数量之比;召回率表示被分类器正确分类的正样本数量与数据集中所有正样本数量之比。

(4)F1 分数:精确率和召回率的调和平均数,综合考虑了分类器的准确性和完整性。

(5)ROC 曲线和AUC(Area Under the Curve):对于二分类任务,可以绘制ROC曲线,以真正例率(True Positive Rate)作为纵轴,假正例率(False Positive Rate)作为横轴。AUC表示ROC曲线下的面积,是一个评估分类器性能的常用指标。对于多分类任务,通常使用微平均(micro-average)或宏平均(macro-average)来计算AUC。

- 引入模块,并自己定义一下模型输出

from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, precision_score, recall_score, f1_score, roc_auc_score, roc_curve
import numpy as np
import matplotlib.pyplot as plt
import torch

# 示例真实标签和预测结果
true_labels = np.array([0, 1, 2, 1, 0, 2, 2, 1, 0, 1])
print("true label",true_labels)
# 生成随机数据作为概率值,实际应用中需要替换为模型的预测概率值
model_output = torch.randn(len(true_labels), 3)
print("model output",model_output)
# 获得最大类别的index
_, predicted_labels = torch.max(model_output, 1)
print("predicted label",predicted_labels)

 示例数据如下:

- 进行模型评估

注意,计算roc_auc时需要将输出概率归一化,否则会报错

ValueError: Target scores need to be probabilities for multiclass roc_auc, i.e. they should sum up to 1.0 over classes

 准确率等的计算用的是模型输出后最大类别的index,而计算roc_auc直接用模型输出的概率,但需要归一化。

# 准确率
accuracy = accuracy_score(true_labels, predicted_labels)
print("Accuracy:", accuracy)
# 混淆矩阵
conf_matrix = confusion_matrix(true_labels, predicted_labels)
print("Confusion Matrix:\n", conf_matrix)
# 分类报告
class_report = classification_report(true_labels, predicted_labels)
print("Classification Report:\n", class_report)
# 精确率
precision = precision_score(true_labels, predicted_labels, average='macro')
print("Precision:", precision)
# 召回率
recall = recall_score(true_labels, predicted_labels, average='macro')
print("Recall:", recall)
# F1 分数
f1 = f1_score(true_labels, predicted_labels, average='macro')
print("F1 Score:", f1)
# ROC AUC
# 计算ROC需要将模型输出概率归一化
prob_new = torch.nn.functional.softmax(model_output, dim=1)
print(prob_new)
roc_auc = roc_auc_score(true_labels, prob_new, average='macro', multi_class='ovo')
print("ROC AUC Score:", roc_auc)

结果:

 

- 独热编码

但如果是对原始的标签数据进行了独热编码,那么在进行准确率等的计算的时候,需要将输出也转化为与独热编码类似的形式,然后再使用sklearn的函数进行计算

from sklearn.preprocessing import label_binarize
# 进行独热编码
true_one_hot = label_binarize(true_labels, classes=np.arange(3))
# 获取每行最大值的索引
max_indices = torch.argmax(model_output, dim=1)
# 创建一个与模型输出相同形状的零张量
predicted_labels = torch.zeros_like(model_output)
# 将每行最大值的位置设为1
predicted_labels[torch.arange(len(max_indices)), max_indices] = 1
print("predicted labels",predicted_labels)

accuracy = accuracy_score(true_one_hot, predicted_labels)
print("Accuracy:", accuracy)
roc_auc = roc_auc_score(true_one_hot, model_output, average='macro')
print("ROC AUC Score:", roc_auc)

结果如下:

总之,无论是采用原始标签的形式,还是独热编码的形式,在计算accuracy,recall,precision,F1-score的时候,都需要将模型输出转化为0,1且与真实标签维度一致的格式,而在计算roc的时候,若是独热编码的真实标签,则可以直接用模型输出,但如果不是,就需要归一化概率。

2、多标签(multilabel)分类任务

对于多标签分类,初始的真实标签要用到独热编码

 针对模型输出的概率分数,需要设定一个阈值,大于阈值的标记为1,低于阈值的标记为0,如下代码所示:

import torch
# 示例模型输出
model_output = torch.tensor([[0.8, 0.3, 0.9],
                             [0.2, 0.7, 0.4],
                             [0.9, 0.1, 0.3]])
# 设置阈值
threshold = 0.5
# 将概率分数转换为0-1结果
predicted_labels = (model_output > threshold).float()
print(predicted_labels)

然后直接使用sklearn的函数进行评估

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, hamming_loss, jaccard_score, coverage_error, average_precision_score, roc_auc_score
import numpy as np

# 示例标签和预测结果
true_labels = np.array([[1, 0, 1], [0, 1, 1], [1, 1, 0]])
predicted_labels = np.array([[1, 0, 1], [0, 1, 0], [1, 0, 0]])
# 准确率
accuracy = accuracy_score(true_labels, predicted_labels)
print("Accuracy:", accuracy)
# 精确率
precision = precision_score(true_labels, predicted_labels, average='micro')
print("Precision:", precision)
# 召回率
recall = recall_score(true_labels, predicted_labels, average='micro')
print("Recall:", recall)
# F1 分数
f1 = f1_score(true_labels, predicted_labels, average='micro')
print("F1 Score:", f1)
# 平均准确率
average_precision = average_precision_score(true_labels, predicted_labels, average='micro')
print("Average Precision:", average_precision)
# ROC AUC
roc_auc = roc_auc_score(true_labels, predicted_labels, average='micro')
print("ROC AUC Score:", roc_auc)

得到的结果如下:

详细对于多标签分类的指标解释可以参考下面的文章:

sklearn中多标签分类场景下的常见的模型评估指标_51CTO博客_sklearn模型评估icon-default.png?t=N7T8https://blog.51cto.com/liguodong/4290183总的来说,要根据自己的任务和目标来制定合适的评估指标,因为评估指标是实验结果的体现。


都看到了这里了,给个小心心♥呗~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1674851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商家利器!手机智能无人直播实时场景,轻松解决获客难、成本高难题

​​随着互联网的飞速发展,直播行业正在成为一种新型的商业模式。然而,许多商家在进行直播带货时面临着获客困难和高成本的挑战。为了解决这些问题,本文将介绍一种名为"自动直播"的功能,并详述如何利用手机实现实时场景…

使用TimeSum教你打造一套最牛的知识笔记管理系统!

从用户使用场景进行介绍软件的使用: 一、用户需求: 我需要一款软件记录我每天: 干了啥事有啥输出(文档)需要时间统计,后续会复盘记录的内容有好的逻辑关系需要有日历进行展示。 二、软件使用介绍&#xf…

《告别重复:Spring AOP让你的代码花园绽放》

厌倦了在代码花园中重复种植相同的植物(代码)吗?Spring AOP将是你的园艺师,帮助你修剪和优化代码,让花园更加丰富多彩! 文章目录 面向切面编程(AOP)主题文章一. 引言1.1 引入面向切面…

基于 Kernel PCA 的故障检测与诊断

基于 Kernel PCA 的故障检测与诊断 在工业领域,轴承是一种常见但重要的机械元件,负责支撑旋转部件并减少摩擦。然而,由于长时间的使用和环境因素等原因,轴承可能会出现各种故障,如磨损、裂纹等,这些故障如…

Vue的学习 —— <初识vue>

目录 前言 目标 前端的发展历程 正篇开始——Vue讲解 一、Vue简介 二、Vue特性 1、数据驱动视图 2、双向数据绑定 3、指令 4、插件 三、vue的三大版本 前言 在这个快速迭代的互联网时代,前端技术的发展日新月异,Vue.js的出现无疑为前端开发领…

普华永道:首席数据官在规模较小企业中的渗透率攀升

5月13日,普华永道发布第三期《全球首席数据官调研》显示,数据持续受到企业高层重视,用于解决最紧迫的公共问题,且首席数据官在规模较小的企业中的渗透率攀升。 调研发现,2023年,全球市值排名前2500家上市企…

探索制造业中 AI 人工智能与 MES 的协同效应

AI已经渗透到我们日常生活中的各种工具中——从语音助手到语言翻译,以及允许我们从图片、手写笔记中提取结构化数据的工具。AI还为许多流程自动化提供动力,纾解管理、物流、会计和人力资源部门员工的工作量和压力。 AI、物联网和新兴的超高速网络&#…

秒懂k8s中资源的介绍和用法

service介绍 解决什么问题 Pod的生命是有限的,死亡过后不会复活了,尽管每个Pod都有自己的IP地址,但是如果Pod重新启动了的话那么他的IP很有可能也就变化了。这就会带来一个问题:比如我们有一些后端的Pod的集合为集群中的其他前端…

shell脚本之函数和数组

目录 一.函数 1.函数的简介 2.函数具有的几个要素 3.定义函数 4.调用函数 5.传递参数 6.函数返回值 7.函数的变量作用范围 8.函数递归 9.查看函数 二.数组 1.数组简介 2.定义数组 3.数组索引 4.数组替换 一.函数 1.函数的简介 在Shell脚本中,函数是…

网络传输,请每次都开启 TCP_NODELAY

原文:Marc Brooker - 2024.05.09 (注:不必过于担心这个问题,大部分现代库,语言(如 Go),代理(如 Envoy),都默认设置了 TCP_NODELAY。如果遇到网络…

ubuntu编译pcl时报错

报错如下 cc1plus: warning: -Wabi wont warn about anything [-Wabi] cc1plus: note: -Wabi warns about differences from the most up-to-date ABI, which is also used by default cc1plus: note: use e.g. -Wabi11 to warn about changes from GCC 7 在网上找到了一封邮件…

深度剖析进程概念与进程状态

文章目录 1. 前言2. 什么是进程2.1 进程概念2.2 进程描述——PCB 3. 进程的一些基本操作3.1 查看进程3.2 结束进程3.3 通过系统调用获取进程标示符3.4 通过系统调用创建子进程 4. 进程状态4.1 普适的操作系统层面4.2 具体Linux操作系统层面 5. 两种特殊的进程5.1 僵尸进程5.2 孤…

2024第二届区块链、物联网与金融管理国际会议(ICBITFM2024)

2024第二届区块链、物联网与金融管理国际会议(ICBITFM2024) 会议简介 2024第二届区块链、物联网与金融管理国际会议(ICBITFM 2024)是一个重要的学术会议,旨在促进区块链、物联网和金融管理领域的交流和合作,对于推动这些领域的发展和创新具有重要意义。…

云商店如何让更多企业摘到技术普惠的“果实”?

文 | 智能相对论 作者 | 沈浪 现阶段,越是工业体系发达的地区,越需要加速技术普惠的步伐。比如,在苏州,华为云就在联合当地政府、企业伙伴打造以华为云云商店为重要链接的智能化商业增长底座。 华为云云商店以“电商式”的购物…

vue自定义权限指令

定义v-hasPermi指令 /*** v-hasPermi 操作权限处理*/import useUserStore from /store/modules/userexport default {mounted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions useUserStore().permissions&#xff…

[IMX6ULL驱动开发]-GPIO子系统和Pinctrl子系统

目录 Pinctrl子系统的概念 GPIO子系统的概念 定义自己的GPIO节点 GPIO子系统的函数 引脚号的确定 基于GPIO子系统的驱动程序 驱动程序 设备树修改 之前我们进行驱动开发的时候,对于硬件的操作是依赖于ioremap对寄存器的物理地址进行映射,以此来达…

VRRP协议-负载分担配置【分别在路由器与交换机上配置】

VRRP在路由器与交换机上的不同配置 一、使用路由器实现负载分担二、使用交换机实现负载分担一、使用路由器实现负载分担 使用R1与R2两台设备分别进行VRRP备份组 VRRP备份组1,虚拟pc1的网关地址10.1.1.254 VRRP备份组2,虚拟pc2的网关地址10.1.1.253 ①备份组1的vrid=1,vrip=…

图片压缩工具,这三款软件简单好用!

在数字化时代,图片已成为我们生活和工作中不可或缺的一部分。无论是社交媒体上的分享,还是工作中的文件传输,图片都扮演着重要的角色。然而,随着图片质量的提高,其占用的存储空间也越来越大,这给我们的存储…

ChatGPT官网5月14日凌晨1点发布会推出最新GPT4o大模型,贾维斯时刻要来了?

就在今天北京时间2024年5月14日凌晨1点中,OpenAI进行了发布会,这次发布会的内容炸裂,一起来看下吧! GPT4o多模态大模型发布 首先公开的是GPT4o多模态大模型的发布,相较于GPT-4turbo速度更快,更便宜。我刚开…

OIDC 与 OAuth2.0学习

OpenID Connect (OIDC) 和 OAuth 2.0 是两种不同的协议,它们通常一起使用,但服务于不同的目的。下面是它们的 主要区别和联系: OAuth 2.0 OAuth 2.0 是一个授权框架,它允许第三方应用代表用户获取对服务器资源的有限访问权限。…