摘要:多标签(multi-label)学习方法解决的是一个实例同时具有多个标签的学习问题。本文总结几个经典的多标签学习方法及度量指标,并基于sklearn的给出具体实现过程。
【1】“A Review on Multi-Label Learning Algorithms”
【2】“http://scikit.ml/”
多标签问题的度量指标可以分为两类。
具体分类如下图所示。
多标签问题的学习策略主要有三种,分别是一阶策略,二阶策略和高阶策略。
学习方法可以分为两大类,分别是基于问题转化的方法和基于算法改编的方法。
部分算法总结如下表所示。
下面按照结合sklearn说明基于问题转化的学习方法,度量方法可直接使用sklearn.metrics
。使用数据集如下:
from sklearn.datasets import make_multilabel_classification
from sklearn.model_selection import train_test_split
X, Y = make_multilabel_classification(n_samples=150, n_features=6, n_classes=5, n_labels=2, allow_unlabeled=False)
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
基本思想:将多标签学习问题转化为多个独立的二分类问题。
由于没有考虑标签之间的相关性,是一阶策略。
优点:
缺点:
构造二分类器的方法使用one-vs-rest的方式。可以直接使用如下接口实现,其中的基分类器可以使用任意sklearn中的预设分类器。
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from skmultilearn.problem_transform import BinaryRelevance
classifier = BinaryRelevance(
classifier = RandomForestClassifier(),
require_dense = [False, True]
)
classifier.fit(x_train, y_train)
pred = classifier.predict(x_test)
metrics.f1_score(y_test, pred, average="micro")
基本思想:对标签进行排序,然后将问题转化为二分类问题。对第j个二分类问题,将前j-1个标签值同样作为特征输入。
虽然还是作为二分类问题解决的,但以链式的方式随机考虑了多个标签的相关性,这是高阶策略。
优点:
缺点:
构造二分类器的方法使用one-vs-rest的方式,接口实现方法和Binary Relevance相同。
from skmultilearn.problem_transform import ClassifierChain
基本思想:将多标签学习转化为一个多类分类问题,每个不同的标签组合认为是一个不同的类。
考虑了多个标签之间的相关性,是高阶策略。
优点:
缺点
接口实现方法和Binary Relevance相同。也可以直接变成常规的多分类问题。
from skmultilearn.problem_transform import LabelPowerset
基本思想:将多标签学习转化为多个多类分类问题的集成,每次只在标签集合中取长度为K的子集,从而缓解Label Powerset的缺点。
随机考虑了多个标签之间的相关性,是高阶策略。
优点:
缺点:
接口实现方法如下,稍微有些不同,查一下官方文档即可了解。
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from skmultilearn.ensemble import RakelD
classifier = RakelD(
base_classifier=RandomForestClassifier(),
base_classifier_require_dense=[True, True],
labelset_size=4
)
classifier.fit(X_train, y_train)
pred = classifier.predict(X_train, y_train)
在此基础上,又发展了一些确定子集划分的方法,均可在skmultilearn的官网找到相应的接口,各分类器的链接是这个:http://scikit.ml/modelselection.html。