机器学习:Python实现多标签分类(Multi-label Classification)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1 多标签分类
1.1 定义
传统的多分类算法是对一个训练样本仅标记一个类别标签。而多标签分类(Multi-label Classification, MLC)是指对每个训练样本分配一个或一个以上的类别标签。其数学模型如下
给定一个
d
d
d维输入空间
X
=
{
X
1
,
X
2
,
…
,
X
d
}
X=\{X_{1},X_{2},\dots,X_{d}\}
X={X1,X2,…,Xd}和一个输出标签
Y
=
{
λ
1
,
λ
2
,
…
,
λ
q
}
,
q
>
1
Y=\{\lambda_{1},\lambda_{2},\dots,\lambda_{q}\},q\gt 1
Y={λ1,λ2,…,λq},q>1。多标签实例可以定义为一对
(
x
,
y
)
(x,y)
(x,y)其中
x
=
(
x
1
,
x
2
,
…
,
x
d
)
∈
X
x=(x_{1},x_{2},\dots,x_{d})\in X
x=(x1,x2,…,xd)∈X并且
y
⊆
Y
y \subseteq Y
y⊆Y其中
y
y
y被称为标签集。当标签
j
j
j和实例
x
x
x相关时
λ
j
\lambda_{j}
λj为1否则为0。MLC的目标就是构建一个预测模型
h
:
X
→
2
Y
h:X \rightarrow 2^{Y}
h:X→2Y。
MLC主要可以应用于文本分类、医学诊断分类、蛋白质分类、音乐或视频分类等。
1.2 解决思路
传统的多标签分类算法主要分为两种基本处理思路基于问题转化法和基于算法适应法。
1.2.1 基于问题转化法
该类方法是通过转换样本数据标签将其处理为传统多分类任务下的数据形式再借助传统机器学习方法进行训练从而达到实现多标签分类算法。常见的算法有Binary Relevance(BR)、Label Powerset(lR)、Calibrated Label Ranking(CLR)、Random k-labelsets等。
- BR算法对标签集 Y Y Y对应建立 ∣ Y ∣ |Y| ∣Y∣个独立的二分类器对每个标签依次判断是否属于该文本即将多标签问题转化为 ∣ Y ∣ |Y| ∣Y∣个二分类问题。当标签集比较大时模型训练的工作量迅速增加同时BR算法丢弃了标签之间的关联信息难以达到很高的预测精度
- LR算法将训练集中每两个标签组合作为一个新的标记从而使多标签数据转化为单标签数据但是无法处理未出现的标记组合同时当标签集很大时转化后的组合标签集将更大导致分类效果降低
- CLR的基本思想是通过引入虚拟标记(virtual label)的概念——在待分类对象的相关标签集合与无关标记集合中加入一个人工分割点使得在标记排序中虚拟标记应该位于所有相关标记之后无关标记之前但增加了算法的复杂度。
1.2.2 基于算法适应法
基于算法适应法的思想是从算法角度入手借助对传统机器学习算法的改造以算法模型其能够接受多标签学习样本进而达到多标签分类的目的。目前常见的基于算法适应方法的多标记分类算法有: ML-kNN、Rank-SVM等。这些模型不需要对数据做标签集的转化通过最小化汉明损失或者排序损失调整算法权重的优化更新策略以处理多标签分类任务。
1.2.3 标签相关性
在处理标签之间相关性方面已有的多标记方法的策略思路主要分为以下三类一阶策略、二阶策略和高阶策略分别从考察单标签之间、两两标签之间、单标签对其余标签的影响关系。可以借助神经网络模型和深度学习方法对多标签之间的相关性进行建模。
2 Python实现多标签分类
2.1 具体代码
本篇使用scikit-multilearn(这个包需要使用pip指令安装)来实现多标签分类具体代码如下
import pandas as pd
import numpy as np
from sklearn.datasets import make_multilabel_classification
from skmultilearn.problem_transform import BinaryRelevance #基于问题转化
from sklearn.tree import DecisionTreeClassifier
from skmultilearn.adapt import MLkNN #基于算法适应
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import warnings
warnings.filterwarnings('ignore')
#生成多标签分类数据
#n_classes标签集总数
X,y=make_multilabel_classification(n_samples=1000,n_features=20,
n_classes=5,n_labels=2)
#划分训练集、测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,
random_state=0)
#基于问题转化
classifier=BinaryRelevance(DecisionTreeClassifier())
classifier.fit(X_train,y_train)
y_test_pred=classifier.predict(X_test)
accu_score=accuracy_score(y_test, y_test_pred)
print(accu_score)
#基于算法适应性
classifier2=MLkNN()
classifier2.fit(X_train,y_train)
y_test_pred2=classifier2.predict(X_test)
accu_score2=accuracy_score(y_test, y_test_pred2)
print(accu_score2)
参考
- 《基于UGC的情感多标签分类的研究与应用》
- 《监督和半监督学习下的多标签分类综述》
- https://blog.csdn.net/weixin_35976295/article/details/113659030