英文原文: 点我.
声明:此博文为对原英文文章的翻译加个人的理解,一方面为自己学习所用,另一方面为需要中文scikit-multilearn文档的小伙伴提供便利。
侵删
多标记分类的有关概念
在这一节,你将会学习到多标记分类背后的一些概念
2.1 目标
分类就是给物体打上标记,物体通常是现实生活中我们经常遇到的一些东西,比如照片、录音、文本、视频等,并且还包括复杂的一些生态系统。
通常用挑选出的特征来表示物体(特征在文本中的个数表示为n_features),特征就是物体的特点,使之易区分于其他的物体。比如,文本就可以用在文本中出现的单词来表示。
一个给定物体分类的输出既可以是一个类也可以是多个类。由于计算能力的限制,传统的分类仅仅致力于解决单一标记的场景,在这种场景下,一个物体最多只属于一个类。
2.2 单标记vs多标记分类
可以识别两种类型的单标记分类问题:
(1)单类,决策就是是否指定一个类。例如,从某人胰腺获取照片样本,确定它是否是癌症样本的照片。有时这也被叫做二分类,因为预测的输出结果总是0或者1。
(2)多类问题,指定的类是从多个可选的类中挑选的。例如,指定车的品牌。
在多标记分类中,可以将可用n_labels中的多个标签/类分配给给定物体。
Madjarov et al. 将多标记分类方法分为3种,你应该根据你的分类器背后的原理选择一个scikit-multilearn基类:
(1)算法适应,当前不在scikit-multilearn中,将来会被放在skmultilearn.adapt中。
(2)问题转移,比如二分类(Binary Relevance), Label Powerset等等,可以在skmultilearn.problem_transformation中使用。
(3)集成分类,比如RAKEL或者标记空间划分分类器(label space partitioning classifiers),可以在skmultilearn.ensemble中使用。
一个单标记分类器是一个函数,给定一个物体,为表示长度为n_features的特征向量,指定一个类(数字或无)。一个多标记分类器输出一系列分配的标记,分配的标记是以列表的方式或者一个二元向量,弟i个位置为1表示第i个标记分配,否则不分配。
为了学习一个分类器,需要使用一个训练集,次训练集提供由n_features表示的采样对象的n_samples,以及关于n_labels中的哪些标签被分配给每个物体的证据。分类器的质量是用同等形式的测试集来测试。
2.3.1多标记数据表示
scikit-multilearn期望的输入:
X是一个大小为(n_samples, n_features)的矩阵;
y是一个大小为(n_samples, n_labels)的矩阵。
让我们实际加载一个数据集看一下:
from skmultilearn.dataset import load_dataset
X_train, Y_train, _, _ = load_dataset('emotions', 'train')
print('X_train is {}'.format(X_train.shape))
print('Y_train is {}'.format(Y_train.shape))
加载数据时会显示
emotions:train - does not exists downloading
Downloaded emotions-train
不用管它。
从这个emotions数据中可以看到:
n_samples: 391
n_features: 72
n_labels: 6
通过矩阵scikit-multilearn了解遵循A [i,j]元素访问方案。应使用稀疏矩阵替代密集矩阵,特别是输出空间。Scikit-multilearn在内部将密集表示转换为最适合给定分类过程的稀疏表示。
X可以存储给定分类方法可以处理的任何类型的数据,但名义编码总是有用的。 使用:meth:skmultilearn.dataset.Dataset.load_arff_to_numpy helper, 加载数据时,默认启用名义编码,它还返回从ARFF数据文件加载的X和y的稀疏表示。
y应是二进制整数指示符形状的矩阵。在这个矩阵中,A[i,j]为1,表示为标记j被分配给物体i,为0则不分配。
我们强烈建议将每个多标签输出空间存储在稀疏矩阵中,并期望scikit-multilearn分类器仅在内部对稀疏二进制标记指示符矩阵进行操作。 这也是预测标记分配的格式。 稀疏表示被用作默认值,因为实际输出空间y非常罕见。 通常,每个实例分配的标记数量只是所有标记的一小部分。 每个物体分配的标记的平均百分比称为标记密度,在已建立的数据集中,它往往很小。http://mulan.sourceforge.net/datasets-mlc.html_.
2.3.2 在问题转移中的单标记表示
对于多标记分类来说,问题转移就是将多标记问题转换为单标记问题:单类或者多类。然后这些问题可以使用一些基本的分类器解决。Scikit-multilearn保持与单标记分类器的scikit-learn数据格式的兼容性,期望:
X是(n_samples,n_features)的形状,并且是以下之一:
a)像数组一样的数组,通常意味着嵌套数组,其中第i行和第j列作为X [i] [j]被处理,在许多情况下,分类器期望数组类似于np.array
b)np.matrix类型的密集矩阵
c)一个scipy稀疏矩阵
y是一个像形状(n_samples,)一样的数组,每个样本有一个类值,这是单标记问题的自然表示。
.
require_dense需要一个两元素列表:[bool或None,bool或None],它们分别控制输入和输出空间格式。
一些scikit-learn分类器支持X的稀疏表示,特别是对于文本数据,将其转发到scikit-learn分类器,需要将require_dense = [False,None]传递给scikit-multilearn分类器的构造函数。如果您确定您使用的基本分类器将能够处理y的稀疏矩阵表示 - pass require_dense = [None,False]。如果稀疏表示支持X和y,则传递require_dense = [False,False]。
个人能力有限,望各位批评指正。