摘要:多标签(multi-label)学习方法解决的是一个实例同时具有多个标签的学习问题。本文总结几个经典的多标签学习方法及度量指标,并基于sklearn的给出具体实现过程。
目录
- 度量、学习策略和学习方法
- Binary Relevance
- Classifier Chain
- Label Powerset
- Random k-Labelsets
主要参考
【1】“A Review on Multi-Label Learning Algorithms”
1. 度量、学习策略和学习方法
多标签问题的度量指标可以分为两类。
- 基于样本的度量指标:在每个样本上度量并取均值;
- 基于标签的度量指标:在每个标签上度量并取均值。
具体分类如下图所示。
多标签问题的学习策略主要有三种,分别是一阶策略,二阶策略和高阶策略。
- 一阶策略不考虑标签相关性,效率高;
- 二阶策略考虑两个标签之间的相关性;
- 高阶策略考虑多个标签之间的相关性,性能好。
学习方法可以分为两大类,分别是基于问题转化的方法和基于算法改编的方法。
- 基于问题转化的方法:将多标签问题转化为容易处理的形式,例如二分类问题,类别排序问题或多分类问题,然后用已有的方法解决;
- 基于算法改编的方法:改编现有的算法,例如ML-KNN,ML-DT,Rank-SVM等。
部分算法总结如下表所示。
下面按照结合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)
2. Binary Relevance
基本思想:将多标签学习问题转化为多个独立的二分类问题。
由于没有考虑标签之间的相关性,是一阶策略。
优点:
- 估计单标签分类器;
- 可以推广到超出标签组合的范围。
缺点:
- 标签数目很多的时候不适合;
- 忽略标签之间的相关性。
构造二分类器的方法使用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")
3. Classifier Chain
基本思想:对标签进行排序,然后将问题转化为二分类问题。对第j个二分类问题,将前j-1个标签值同样作为特征输入。
虽然还是作为二分类问题解决的,但以链式的方式随机考虑了多个标签的相关性,这是高阶策略。
优点:
- 估计单标签分类器;
- 可以推广到超出标签组合的范围;
- 考虑了标签之间的相关性。
缺点:
- 标签数目很多的时候不适合;
- 十分依赖标签排序的顺序。
构造二分类器的方法使用one-vs-rest的方式,接口实现方法和Binary Relevance相同。
from skmultilearn.problem_transform import ClassifierChain
4. Label Powerset
基本思想:将多标签学习转化为一个多类分类问题,每个不同的标签组合认为是一个不同的类。
考虑了多个标签之间的相关性,是高阶策略。
优点:
- 利用一个分类器考虑了多标签的相关性;
- 在训练数据包括全部标签组合时通常是最优解。
缺点
- 要求训练数据包括所有的标签组合;
- 当标签空间大时,很容易过拟合。
接口实现方法和Binary Relevance相同。也可以直接变成常规的多分类问题。
from skmultilearn.problem_transform import LabelPowerset
5. Random k-Labelsets
基本思想:将多标签学习转化为多个多类分类问题的集成,每次只在标签集合中取长度为K的子集,从而缓解Label Powerset的缺点。
随机考虑了多个标签之间的相关性,是高阶策略。
优点:
- 相比Binary Relevance,可能只需要更少的分类器;
- 考虑了标签之间的相关性;
- 相比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。