机器学习:多标签学习及skmultilearn库

摘要:多标签(multi-label)学习方法解决的是一个实例同时具有多个标签的学习问题。本文总结几个经典的多标签学习方法及度量指标,并基于sklearn的给出具体实现过程。

目录

  1. 度量、学习策略和学习方法
  2. Binary Relevance
  3. Classifier Chain
  4. Label Powerset
  5. Random k-Labelsets

主要参考

【1】“A Review on Multi-Label Learning Algorithms”

【2】“http://scikit.ml/”

1. 度量、学习策略和学习方法

多标签问题的度量指标可以分为两类。

  1. 基于样本的度量指标:在每个样本上度量并取均值;
  2. 基于标签的度量指标:在每个标签上度量并取均值。

具体分类如下图所示。
机器学习:多标签学习及skmultilearn库_第1张图片
多标签问题的学习策略主要有三种,分别是一阶策略二阶策略高阶策略

  1. 一阶策略不考虑标签相关性,效率高;
  2. 二阶策略考虑两个标签之间的相关性;
  3. 高阶策略考虑多个标签之间的相关性,性能好。

学习方法可以分为两大类,分别是基于问题转化的方法基于算法改编的方法

  1. 基于问题转化的方法:将多标签问题转化为容易处理的形式,例如二分类问题,类别排序问题或多分类问题,然后用已有的方法解决;
  2. 基于算法改编的方法:改编现有的算法,例如ML-KNN,ML-DT,Rank-SVM等。

部分算法总结如下表所示。
机器学习:多标签学习及skmultilearn库_第2张图片
下面按照结合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。

你可能感兴趣的:(机器学习)