公司新闻

多标签(multi-label)数据的学习问题,常用的分类器或者分类策略有哪些?

多标签(multi-label)数据常用的分类器有哪些?
多标签(multi-label)数据常用的分类策略有哪些?

常用分类器:meta的算法常用分类器就是二类,多类的分类器;非meta的算法通常是现有二类,多类分类器的改造。大部分多标记算法主要是针对数据的特性,从机制上去优化解决这个问题,并不发明新的分类器出来。

剩下的,直接看论文吧。综述有非常多篇了。

早期较好的:Mining multi-label data,优点:短;

现在较好的:

A Review on Multi-Label Learning Algorithms

,优点:长;

又一篇:A Tutorial on Multilabel Learning,优点:实践出发,最适合你。

其他的不推介,别看了。

其实

A Review on Multi-Label Learning Algorithms

也并不长,只有19页,而且还介绍得比较全面。

Multi-Label 和传统的分类问题的区别主要在于多Label下,输出空间呈现指数级增长。那么目前对于Multi-Label的这类特性,学界一般是集中在更好的分析Label之间的相关性,就可以避免这种指数增长。

主要的Strategy大致可以分为三类:

First-Order Strategy: 考虑的是label之间相互独立,那么就可以把Multi-label问题转换为普通的分类问题。如果一个Label有多类的话,那么就用传统的One vs All来解决。

Second-Order Strategy: 这一类是考虑Label之间的两两相关性,结果会导致计算复杂度有显著的增加。

High-Order Strategy: 这个就是考虑多Label之间的相关性,计算复杂度会更高。

目前有的一些分类算法:Binary Relevance,如名字所写,这是一个First-Order Strategy;Classifier Chains,把原问题分解成有先后顺序的一系列Binary Classification,然后前边的Binary Classification会对后边的产生影响;Calibrated label ranking,这个有点像Multi-Classification中One vs One的策略,就是通过两两对比,然后进行投票决定分类效果。

题主还是最开始提到的那篇论文吧,写得蛮全面的。

多标记分类和传统的分类问题相比较,主要难点在于以下两个方面

(1)类标数量不确定,有些样本可能只有一个类标,有些样本的类标可能高达几十甚至上百个。

(2)类标之间相互依赖,例如包含蓝天类标的样本很大概率上包含白云,如何解决类标之间的依赖性问题也是一大难点。

对于多标记学习领域的研究,国外起步较早,起源于2000年Schapire R E等人提出的基于boost方法的文本多分类,著名的学者有G Tsoumakas、Eyke Hüllermeier、Jesse Read,Saso Dzeroski等等。在国内,南京大学的周志华和张敏灵和哈工大的叶允明等等学者在这一领域较都有很好研究成果。

目前有很多关于多标签的学习算法,依据解决问题的角度,这些算法可以分为两大类:一是基于问题转化(Problem Transformation)的方法,二是基于算法适应的方法和算法适应方法(Algorithm Adaptation)。基于问题转化的多标记分类是转化问题数据,使之适用现有算法;基于算法适应的方法是指针对某一特定的算法进行扩展,从而能够直接处理多标记数据,改进算法,适应数据。基于这两种思想,目前已经有多种相对成熟的算法被提出,如下图所示:


问题转化方法(Problem Transformation):该类方法的基本思想是通过对多标记训练样本进行处理,将多标记学习问题转换为其它已知的学习问题进行求解。代表性学习算法LP[[1]],Binary Relevance[[2]],Calibrated Label Ranking[[3]], Random k-labelsets[[4]]。总体来说,这类方法有考虑类标之间的联系,但是对于类标较多、数据量较大的数据集,这类方法的计算复杂度是一个很明显的缺陷。

算法适应方法与问题转化方法不同,问题转化方法是将多标记问题转化成一个或者多个单类标问题,算法适应方法是在多标记的基础上研究算法。近年来,用于多标记的算法适应的算法越来越多,代表性学习算法ML-kNN[[5]],Rank-SVM[[6]],LEAD[[7]],CML。

对于分类策略,基于考察标记之间相关性的不同方式,已有的多标记学习算法的策略思路大致可以分为以下三类[[8]]:

a) “一阶(first-order)”策略:该类策略通过逐一考察单个标记而忽略标记之间的相关性,如将多标记学习问题分解为个独立的二类分类问题,从而构造多标记学习系统。该类方法效率较高且实现简单,但由于其完全忽略标记之间可能存在的相关性,其系统的泛化性能往往较低。

b) “二阶(second-order)”策略:该类策略通过考察两两标记之间的相关性,如相关标记与无关标记之间的排序关系,两两标记之间的交互关系等等,从而构造多标记学习系统。该类方法由于在一定程度上考察了标记之间的相关性,因此其系统泛化性能较优。

c) “高阶(high-order)”策略:该类策略通过考察高阶的标记相关性,如处理任一标记对其它所有标记的影响,处理一组随机标记集合的相关性等等,从而构造多标记学习系统。该类方法虽然可以较好地反映真实世界问题的标记相关性,但其模型复杂度往往过高,难以处理大规模学习问题。

[[1]]Madjarov G, Kocev D, Gjorgjevikj D, et al. An extensive experimental comparison of methods for multi-label learning[J]. Pattern Recognition, 2012, 45(9): 3084-3104.


[[2]]Boutell M R, Luo J, Shen X, Brown C M. Learning multi-label scene classification. Pattern Recognition, 2004, 37(9): 1757-1771.


[[3]]Fürnkranz J, Hüllermeier E, Loza Mencía E, Brinker K. Multilabel classification via calibrated label ranking. Machine Learning, 2008, 73(2): 133-153.


[[4]]Tsoumakas G, Vlahavas I. Random k-labelsets: An ensemble method for multilabel classification. In: Kok J N, Koronacki J, de Mantaras R L, Matwin S, Mladeni? D, Skowron A, eds. Lecture Notes in Artificial Intelligence 4701, Berlin: Springer, 2007, 406-417.


[[5]]Zhang M-L, Zhou Z-H. ML-kNN: A lazy learning approach to multi-label learning. Pattern Recognition, 2007, 40(7): 2038-2048.


[[6]]Elisseeff A, Weston J. A kernel method for multi-labelled classification. In: Dietterich T G, Becker S, Ghahramani Z, eds. Advances in Neural Information Processing Systems 14 (NIPS’01), Cambridge, MA: MIT Press, 2002, 681-687.


[[7]]Zhang M-L, Zhang K. Multi-label learning by exploiting label dependency. In: Pro ceedings of the 16th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD’10), Washington, D. C., 2010, 999-1007.


[[8]]Zhang M L, Zhang K. Multi-label learning by exploiting label dependency[C]// ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM, 2010:999-1008.

BY 余文礼

其他人回答的基本都是周老师和张敏灵老师那篇Multi-Label综述里面的内容,除了基本的方法之外,这里我列一下自己感觉比较好的几篇Multi-Label的paper:

(1)LEML: Large-scale Multi-label Learning with Missing Labels 一种针对弱标记数据的多标记学习方法

(2)TRAM:Transductive Multilabel Learning via Label Set Propagation 利用标记集合传递的直推式的多标记学习方法

(3)WELL(Multi-Label Learning with Weak Label):ai2-s2-pdfs.s3.amazonaws.com能够处理missing label

这几种方法都是比较新的,在我跑实验的时候效果比较好而且速度还不错的方法。良心推荐

最近几年,分类问题和回归问题在机器学习领域受到广泛关注。作为分类问题的一个变种,多标签分类也是个比较常见的问题,比如一部电影可以同时被分类为动作片和犯罪片, 一则新闻可以同时属于政治和法律等等。简单说,多标签分类就是同一个实例,可以有多个标签,或者被分为多个类。


本文就分享一下数据科学家Shubham Jain对解决多标签分类问题的方法,首先会直观解释何为多标签分类问题,然后分享解决多标签分类问题的3种方法以及它们的Python实现,最后附以案例研究。

1. 什么是多标签分类?

2. 多类VS多标签

3. 加载和生成多标签数据集

4. 解决多标签分类的方法

  • 问题转换法
  • 自适应算法
  • 集成法

5. 案例研究


我们先看看下面这张图。

如果我问你下面这张图包含一座房子吗?选项会是YES或NO。

再想想另外一种情况,比如和这张照片相关的所有东西(或标签)都有什么?

像这种类型的问题,即我们有一组目标变量,就被称为多标签分类问题。那么前面这两种情况有区别吗?很显然有,在第二种情况中,任何图像都可能包含不同图像的多个不同的标签。

在我们深入了解多标签之前,先讲讲它和多类问题之间的区别。

我们举个例子以及下面这张图来理解这二者的区别。

对于任何一部电影,负责电影审核的官方机构(比如印度的印度电影分级中央委员会)会根据电影内容为电影颁发上映证书。


比如说,你看看上图这张图,你会发现电影被划分为“U/A”类(意为“12岁以下儿童需在父母陪同下观看”)。另外还有其它类型的证书类别,比如“A”(仅限成人观看)或“U”(不受限制的公开放映),但是肯定每部电影只能被划分为其中的一个类别。


简而言之,有多个类别,但只能将每个实例划分到一个类别,那么这种问题就是我们所说的多类分类问题


接着你再看看这张图,会发现这部电影还被归类为喜剧和爱情剧。但不同的是,这一次每部电影都能被归类为一个或多个不同的种类。


因此,可以将每个实例分类到多个种类,那么这种类型的问题就是我们说的多标签分类问题,在这种问题中我们有一组目标变量。


很好!现在你应该能分清多标签和多类问题的区别了。下面我们瞧瞧怎么应对这种类型的问题。

Scikit-learn中有个叫scikit-multilearn的分离程序库,用于多标签分类。


为了能更好的理解,我们用一个多标签数据集进行实践。从MULAN程序包提供的仓库中(mulan.sourceforge.net/d)找到一个真实数据集,用如下Python代码可以将其加载到你的Jupyter notebook中。这里我从该仓库下载了Yeast数据集。

import scipy
from scipy.io import arff
data, meta=scipy.io.arff.loadarff('/Users/shubhamjain/Documents/yeast/yeast-train.arff')
df=pd.DataFrame(data)


数据集如下所示:


这里,Att表示属性或独立变量,Class表示目标变量。

处于实践目的,我们还可以选择生成一个人工的多标签数据集。

from sklearn.datasets import make_multilabel_classification

# 这会生成一个随机多标签数据集
X, y=make_multilabel_classification(sparse=True, n_labels=20,
return_indicator='sparse', allow_unlabeled=False)


我们先理解一下上面用到的参数。


Sparse:如果为True,则返回一个稀疏矩阵,它是指一个有着大量0元素的矩阵。

N_labels:每个实例的平均标签数。

Return_indicator:如果为True,“sparse”则以稀疏的二进制指示器格式返回Y。

Allow_unlabeled:如果为True,某些实例可能不属于任何类。


你一定注意到我们几乎到处在用稀疏矩阵,Scikit-multi也推荐我们使用稀疏的数据集,因为现实中的数据集很少是致密类型。一般而言,分配给每个实例的标签数量非常少。

现在我们已经准备好了数据集,下面就快速学习如何解决多标签问题。



基本来讲,解决多标签分类问题有3种方法,分别是:

  • 问题转换
  • 自适应算法
  • 集成方法


4.1 问题转换法

在这种方法中,我们会尝试将多标签问题转换为单标签问题。

该方法的实现方式有3种:

  • 二元关联(Binary Relevance)
  • 分类器链(Classifier Chains)
  • LP法(Label Powerset)


4.1.1二元关联

这种技巧最简单,它基本上是将每个标签看作一个单独的类分类问题。

例如,我们考虑如下所示的一种情况。我们有一个像这样的数据集,其中X为独立特征,Y是目标变量。

在二元关联中,这个问题会被分解为4个不同的单类分类问题,如下图所示。

我们无需手动完成,multi-learn库提供了它的Python实现。我们快速看看它在随机所选数据上的实现。

# 使用二元关联
from skmultilearn.problem_transform import BinaryRelevance
from sklearn.naive_bayes import GaussianNB

# 用一个基于高斯朴素贝叶斯的分类器
# 初始化二元关联多标签分类器 
classifier=BinaryRelevance(GaussianNB())

# 训练
classifier.fit(X_train, y_train)

# 预测
predictions=classifier.predict(X_test)

注意:这里我们用了一个简单的朴素贝叶斯算法,但你可以使用任何其它分类算法。


现在,在多标签分类问题中,我们不能简单使用正常的指标来计算我们预测结果的准确率。为了能衡量预测的准确率,我们使用准确率分数指标,该函数计算的是子集的准确率,意味着标签的预测集应该和标签的真实集正好匹配。


所以我们来计算预测结果的准确率。

from sklearn.metrics import accuracy_score
accuracy_score(y_test,predictions)

0.45454545454545453


最后我们得到准确率分数为45%,还不是很差。我们快速总结一下这种方法的优缺点。

这是种最简单最搞笑的方法,但唯一一个缺点是它没有考虑标签之间的关联,因为它是单独处理每个目标变量。


4.1.2 分类器链

在这种方法中,第一个分类器只用输入数据训练,然后在输入空间以及链条上前面所有分类器上训练接下来的每个分类器。

举个例子帮你理解,在下面的数据集中,我们以X为输入空间,Y为标签。

在分类器链中,这个问题可以被转换为4个不同的单标签问题,如下所示。这里黄色部分是输入空间,白色部分表示目标变量。

这和二元关联非常相似,唯一的区别是它是按顺序组成链条以保存标签之间的关联。我们用multi-learn库实现这种方法。

# 使用分类器链
from skmultilearn.problem_transform import ClassifierChain
from sklearn.naive_bayes import GaussianNB

# 用一个基于高斯朴素贝叶斯的分类器
# 初始化分类器链多标签分类器 
classifier=ClassifierChain(GaussianNB())

# 训练
classifier.fit(X_train, y_train)

# 预测
predictions=classifier.predict(X_test)

accuracy_score(y_test,predictions)

0.21212121212121213

我们可以看到使用这种方法我们得到的准确率约为21%,大幅小于二元关联得到的结果。这可能是因为标签关联的存在,因为我们是随机生成的数据。


4.1.3 LP法

在LP法(Label Powerset)中,我们将问题转换为一个多类问题,我们用在训练数据中发现的所有唯一标签的组合训练一个多类分类器。

我们用一个例子来理解。

在这种方法中,我们发现x1和x4有相同的标签,同样地,x3和x6也有相同的标签。LP法会将这个问题转换为一个单一的多类问题,如下所示。

LP法向训练集中每个可能的标签组合分配了一个唯一类。

我们看看它在Python中的实现。

# 使用LP法
from skmultilearn.problem_transform import LabelPowerset
from sklearn.naive_bayes import GaussianNB

# 用一个基于高斯朴素贝叶斯的分类器
# 初始化LP多标签分类器
classifier=LabelPowerset(GaussianNB())

# 训练
classifier.fit(X_train, y_train)

# 预测
predictions=classifier.predict(X_test)

accuracy_score(y_test,predictions)
0.5757575757575758

从结果来看,这种方法得到的准确率分数最高,57%。其唯一的缺点是由于训练数据增加,类的数量相应变得更多。这样以来,会增加模型的复杂性,会降低准确率。

下面我们看看解决多标签分类问题的第二种方法。


4.2 自适应算法

如其名字所示,自适应算法就是通过改编算法让其直接执行多标签分类任务,而非将问题转换为多个不同的问题子集。例如,将KNN的多标签版本表示为MLKNN。我们用随机生成的数据集快速实现这种方法。

from skmultilearn.adapt import MLkNN

classifier=MLkNN(k=20)

# 训练
classifier.fit(X_train, y_train)

# 预测
predictions=classifier.predict(X_test)

accuracy_score(y_test,predictions)
0.69

很好,我们这次在训练集上达到了69%的准确率分数。



在一些算法中,如随机森林和岭回归,Sci-kit learn库中都提供了解决多标签分类问题的内置支持。所以你可以直接调用它们,预测输出。

如果想了解更多其它类型的自适应算法,可以查看multi-learn库:

scikit.ml/api/api/skmul


4.3 集成法

集成总是能产生更好的结果。Scikit-Multilearn库提供了很多不同的集成分类函数,你可以用它们获得更好的结果。

这种方法的直接实现,可以点击这里查看:

scikit.ml/api/classify.

多标签分类问题在现实世界中非常常见,我们一起看看用到它的一些领域。


5.1音频分类

我们都知道歌曲会被划分为不同的流派,但根据感情或心境比如“放松平和”或“孤单悲伤”等也能分类歌曲。


5.2 图像分类

使用图像的多标签分类也有广泛的应用,图像可以标记为不同的物体、人物或概念。


5.3 生物信息

多标签分类在生物信息领域也有很多应用,例如酵母数据集中的基因分类。此外还能用于借助未标记的蛋白质来预测蛋白质的多种功能。


5.4 文本分类

你一定有过在网上看新闻的经历,那么新闻网站所做的就是将每条新闻标记为一个或多个类别,这样它就能展示在不同的类别下。比如,下面这张图片。

同样的一条新闻被展示在印度、技术、最新等多个类别下,因为它被归类到了上述这些不同的标签中,那么这就是个典型的多标签分类问题。


还有很多应用多标签分类的领域,有兴趣可以去探索一番。


在本文,我们学习了什么是多标签分类问题,它与多类问题的区别,以及解决多标签分类问题的3种方法。并举出了一些实践案例,和它们的Python实现。希望本文对你解决多标签分类问题能有所帮助。


参考资料:

analyticsvidhya.com/blo


平台注册入口