使用Scikit-Learn实现多标签分类,助力机器学习

news2024/12/26 0:46:44

大家好,在机器学习任务中,分类是一种监督学习方法,用于根据输入数据预测标签。例如,我们想要根据历史特征预测某人是否对销售优惠感兴趣,通过使用可用的训练数据训练机器学习模型,可以对输入数据执行分类任务。

平常会遇到一些经典分类任务,例如二元分类(两个标签)和多类分类(两个以上标签)。在这种情况下,我们会训练分类器,模型会尝试从所有可用标签中预测一个标签。用于分类的数据集类似于下面的图像:

图片

上面的图像显示目标(销售优惠)在二元分类中包含两个标签,在多类分类中包含三个标签,模型会从可用特征中进行训练,然后仅输出一个标签。

多标签分类与二元或多类分类不同,在多标签分类中,我们不仅尝试预测一个输出标签,相反,多标签分类会尝试预测尽可能多的适用于输入数据的标签,输出可以是从没有标签到最大数量的可用标签。

多标签分类通常用于文本数据分类任务,下面是一个多标签分类的示例数据集。

在上面的示例中,假设文本1到文本5是可以归类为四个类别的句子:事件、体育、流行文化和自然。通过上述训练数据,多标签分类任务可以预测哪个标签适用于给定的句子。每个类别之间并不相互对立,因为它们不是互斥的;每个标签可以被视为独立的。

更详细地说,我们可以看到文本1标记为体育和流行文化,而文本2标记为流行文化和自然。这表明每个标签是互斥的,多标签分类的预测输出可以是没有标签或同时包含所有标签。

有了上述介绍,接下来尝试使用Scikit-Learn搭建多标签分类器。

使用Scikit-Learn进行多标签分类

本文将使用Kaggle上公开可用的生物医学PubMed多标签分类数据集,该数据集包含各种特征,但本文只使用abstractText特征和它们的MeSH分类(A:解剖学,B:有机体,C:疾病等)。示例数据如下图所示:

【生物医学PubMed多标签分类数据集】:https://www.kaggle.com/datasets/owaiskhan9654/pubmed-multilabel-text-classification

上述数据集表明,每篇论文都可以被分为多个类别,这就是多标签分类的案例。有了这个数据集,那么就可以使用Scikit-Learn建立多标签分类器,在训练模型之前,首先准备好数据集。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

df = pd.read_csv('PubMed Multi Label Text Classification Dataset Processed.csv')
df = df.drop(['Title', 'meshMajor', 'pmid', 'meshid', 'meshroot'], axis =1)

X = df["abstractText"]
y = np.asarray(df[df.columns[1:]])

vectorizer = TfidfVectorizer(max_features=2500, max_df=0.9)
vectorizer.fit(X)

在上面的代码中,将文本数据转换为TF-IDF表示,以便Scikit-Learn模型能够接受训练数据。此外,为了简化教程,本文跳过了预处理数据的步骤,例如删除停顿词。

数据转换完成后,我们将数据集分割为训练集和测试集。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)
  
X_train_tfidf = vectorizer.transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)

完成所有准备工作后,我们将开始训练多标签分类器。在Scikit-Learn中,我们将使用MultiOutputClassifier对象来训练多标签分类器模型。该模型背后的策略是为每个标签训练一个分类器,每个标签都有自己的分类器。

在这个示例中,我们将使用逻辑回归,并使用MultiOutputClassifier将其扩展到所有标签。

from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import LogisticRegression

clf = MultiOutputClassifier(LogisticRegression()).fit(X_train_tfidf, y_train)

我们可以更改模型并调整传递给MultiOutputClasiffier的模型参数,因此请根据自己的要求进行管理。训练完成后,使用模型预测测试数据。

prediction = clf.predict(X_test_tfidf)
prediction

图片

预测结果是每个MeSH类别的标签数组,每一行代表一个句子,每一列代表一个标签。

最后,我们需要对多标签分类器进行评估,可以使用准确率指标来评估模型。

from sklearn.metrics import accuracy_score
print('Accuracy Score: ', accuracy_score(y_test, prediction))****

准确率得分为0.145。

准确度得分结果为0.145,这表明该模型只能在不到14.5%的情况下能预测出准确的标签组合。然而,对于多标签预测评估来说,准确率得分存在不足。准确率得分需要每个句子的所有标签都出现在准确的位置上,否则就会被认为是错误的。

例如,第一行预测与测试数据之间仅有一个标签的差异。

图片

对于准确率得分来说,这将被认为是错误的预测,因为标签组合不同,这就是模型具有较低度量分数的原因。

为了解决这个问题,我们必须评估标签的预测而不是它们的组合。在这种情况下,我们可以使用Hamming Loss评估指标。汉明损失通过将错误预测与总标签数的比例来计算,因为汉明损失是一种损失函数,得分越低越好(0表示没有错误预测,1表示所有预测都错误)。

from sklearn.metrics import hamming_loss
print('Hamming Loss: ', round(hamming_loss(y_test, prediction),2))

汉明损失为0.13。

我们的多标签分类器Hamming Loss模型为0.13,这意味着我们的模型在独立情况下约有13%的错误预测,也就是说每个标签的预测可能有13%的错误。

总结

多标签分类是一种机器学习任务,其输出可以是没有标签或给定输入数据的所有可能标签。这与二元或多类分类不同,其中标签输出是相互排斥的。

使用Scikit-Learn的MultiOutputClassifier,我们可以开发多标签分类器,为每个标签训练一个分类器。在模型评估方面,最好使用Hamming Loss指标,因为准确率得分可能无法正确反映整体情况。

 

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

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

相关文章

【手写数据库toadb 造不一样的轮子】行列混合存储模型 就是为大模型分析准备的

行列混合存储模型 ​专栏内容: postgresql内核源码分析手写数据库toadb并发编程个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 概述 混合模型的由来 我们虽然造轮子,但是也会造完全一样的轮子。所以toadb在选择存储模型时,行存模型已经成熟…

Spring Boot 知识集锦之Spring-Batch批处理组件详解

文章目录 0.前言1.参考文档2.基础介绍2.1. 核心组件 3.步骤3.1. 引入依赖3.2. 配置文件3.3. 核心源码 4.示例项目5.总结 0.前言 背景: 一直零散的使用着Spring Boot 的各种组件和特性,从未系统性的学习和总结,本次借着这个机会搞一波。共同学…

驱动开发——字符设备

字符设备 Linux 将系统设备分为:字符设备、块设备、网络设备。工作原理 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节, 按照字节流进行读写操作的设备,读写数据是分先后顺序的。在Linux的世界里面一切…

第5章 性能分析方法

有时看到修改后程序的运行时间发生变化时,却不清楚具体原因是什么。单独的时间信息有时无法给出问题发生的根本原因。 程序运行时硬件和软件都可以采集性能数据,硬件是指运行程序的CPU,软件是指操作系统和所有可用于分析的工具。通常软件栈提…

设计模式篇---抽象工厂(包含优化)

文章目录 概念结构实例优化 概念 抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 工厂方法是有一个类型的产品,也就是只有一个产品的抽象类或接口,而抽象工厂相对于工厂方法来说,是有…

qsort函数详解

大家好,我是苏貝,本篇博客带大家了解qsort函数,如果你觉得我写的不错的话,可以给我一个赞👍吗,感谢❤️ 文章目录 一. qsort函数参数详解1.数组首元素地址base2.数组的元素个数num和元素所占内存空间大小w…

Xxl-job安装部署以及SpringBoot集成Xxl-job使用

1、安装Xxl-job: 可以使用docker拉取镜像部署和源码编译两种方式,这里选择源码编译安装。 代码拉取地址: https://github.com/xuxueli/xxl-job/tree/2.1.2 官方开发文档: https://www.xuxueli.com/xxl-job/#%E3%80%8A%E5%88%…

uni-app的Vue.js实现微信小程序的紧急事件登记页面功能

主要功能实现 完成发生时间选择功能,用户可以通过日期选择器选择事件发生的时间。实现事件类型选择功能,用户可以通过下拉选择框选择事件的类型。添加子养殖场编号输入框,用户可以输入与事件相关的子养殖场编号。完成事件描述输入功能&#…

C++笔记之条件变量(Condition Variable)与cv.wait 和 cv.wait_for的使用

C笔记之条件变量(Condition Variable)与cv.wait 和 cv.wait_for的使用 参考博客:C笔记之各种sleep方法总结 code review! 文章目录 C笔记之条件变量(Condition Variable)与cv.wait 和 cv.wait_for的使用1.条件变量&…

msf和cs联动

cs设置外部监听器 在vps上执行 vim /etc/ssh/sshd_config AllowTcpForwarding yes GatewayPorts yes TCPKeepAlive yes PasswordAuthentication yes systemctl restart sshd.service 在kali上执行,进行端口转发 ssh -C -f -N -g -R 0.0.0.0:1234:192.168.1.30:…

STM32开关输入控制220V灯泡亮灭源代码(附带PROTEUSd电路图)

//main.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body************************************************************************…

525. 连续数组

525. 连续数组 原题链接:完成情况:解题思路:参考代码: 原题链接: 525. 连续数组 https://leetcode.cn/problems/contiguous-array/description/ 完成情况: 解题思路: 参考代码: …

奇舞周刊第503期:图解串一串 webpack 的历史和核心功能

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 图解串一串 webpack 的历史和核心功能 提到打包工具,可能你会首先想到 webpack。那没有 webpack 之前,都是怎么打包的呢?webpack 都有哪些功能&…

喜讯?宁德时代首个零碳工厂成功建立,碳中和“任重道远”

8月19日消息,据宁德时代消息,广东瑞庆时代新能源科技有限公司宣布获得国际认可机构SGS颁发的PAS2060碳中和认证证书,从而正式成为一家零碳工厂。这标志着宁德时代首个储能电池为主的零碳工厂成功建立,也是公司继四川时代宜宾工厂之…

编程练习(3)

一.选择题 第一题: 函数传参的两个变量都是传的地址,而数组名c本身就是地址,int型变量b需要使用&符号,因此答案为A 第二题: 本题考察const修饰指针变量,答案为A,B,C,D 第三题: 注意int 型变…

速通蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统

一个完整的嵌入式系统,包括任务执行部分和人机交互部分。在前四节中,我们已经讲解了LED、LCD和按键,用这三者就能够实现一个人机交互系统,也即搭建整个嵌入式系统的框架。在后续,只要将各个功能加入到这个交互系统中&a…

赏味不足:详细来聊下轻资产运作,我从不做重资产

来源:BV1F84y1g7u3 好 大家好,是这样子的 对吧,因为最近聊了也很多,然后我在过程当中也发现,很多人对于不管是创业还是做副业,还是说找一条多种路,就是说可能不是那么清晰,然后我在这…

使用Dockerfile部署java项目

1、移动java包到创建的目录下 2、编写Dockerfile文件 在同一目录下使用如下命令创建文件 touch Dockerfile 文件内容如下: #依赖的父镜像 FROM java:8 #作者 MAINTAINER maxurui #jar包添加到镜像中 ADD springboot3-0.0.1-SNAPSHOT.jar springboot3-0.0.1-SNAPSHO…

射频同轴线阻抗

射频同轴线阻抗 射频同轴线的阻抗与线的绝缘介质的介电常数有关,与线的屏蔽层半径与内部导线半径的比值有关: R 0 1 2 π μ ′ ϵ ′ ln ⁡ ( r 2 r 1 ) \begin{align} R_0\frac{1}{2\pi}\sqrt{\frac{\mu^{}}{\epsilon^{}}}\ln(\frac{r_2}{r_1}) \en…