赞
踩
传统的多分类算法是对一个训练样本仅标记一个类别标签。而多标签分类(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主要可以应用于文本分类、医学诊断分类、蛋白质分类、音乐或视频分类等。
传统的多标签分类算法主要分为两种基本处理思路:基于问题转化法和基于算法适应法。
该类方法是通过转换样本数据标签,将其处理为传统多分类任务下的数据形式,再借助传统机器学习方法进行训练,从而达到实现多标签分类算法。常见的算法有:Binary Relevance(BR)、Label Powerset(lR)、Calibrated Label Ranking(CLR)、Random k-labelsets等。
基于算法适应法的思想是从算法角度入手,借助对传统机器学习算法的改造,以算法模型其能够接受多标签学习样本,进而达到多标签分类的目的。目前常见的基于算法适应方法的多标记分类算法有: ML-kNN、Rank-SVM等。这些模型不需要对数据做标签集的转化,通过最小化汉明损失或者排序损失调整算法权重的优化更新策略,以处理多标签分类任务。
在处理标签之间相关性方面,已有的多标记方法的策略思路主要分为以下三类:一阶策略、二阶策略和高阶策略,分别从考察单标签之间、两两标签之间、单标签对其余标签的影响关系。可以借助神经网络模型和深度学习方法,对多标签之间的相关性进行建模。
本篇使用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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。