sklearn 多分类多标签算法

转至元数据结尾

转至元数据起始

原文链接 : http://scikit-learn.org/stable/modules/multiclass.html

译文链接 : http://cwiki.apachecn.org/pages/viewpage.action?pageId=10814370

贡献者 : 片刻 ApacheCN Apache中文网

警告: scikit-learn中的所有分类器都是开箱即用的多类分类。您不需要使用该sklearn.multiclass模块,除非您想要尝试不同的多类策略。

sklearn.multiclass模块通过将这些问题分解为二进制分类问题来实现元估计来解决 multiclassmultilabel分类问题。还支持多目标回归。

  • 多类分类是指具有两类以上的分类任务; 例如,分类一组可能是橘子,苹果或梨的水果图像。多类分类假设每个样品分配到一个且仅一个标签:水果可以是苹果或梨,但不能同时两个。

  • 标签分类为每个样本分配一组目标标签。这可以被认为是预测不相互排斥的数据点的属性,例如与文档相关的主题。一个文字可能是宗教,政治,金融或教育的任何一个或者同时或没有一个。

  • Multioutput回归为每个样本分配一组目标值。这可以被认为是预测每个数据点的几个属性,例如在某个位置的风向和幅度。

  • 多输出多类分类多任务分类 意味着单个估计器必须处理多个联合分类任务。这既是多标签分类任务的泛化,它只考虑二进制分类,以及多类分类任务的泛化。 输出格式是2d numpy数组或稀疏矩阵。

    每个输出变量的标签集可以不同。例如,一个样本可以被分配给一个输出变量的“梨”,该输出变量在有限集合的物种如“梨”,“苹果”中获取可能的值; 和“蓝色”或“绿色”表示第二个输出变量,它在“绿色”,“红色”,“蓝色”,“黄色”等有限颜色集中取得可能的值

    这意味着任何处理多输出多类或多任务分类任务的分类器都可以作为特殊情况支持多标签分类任务。多任务分类与具有不同模型公式的多输出分类任务相似。有关更多信息,请参阅相关估计器文档。

所有scikit学习分类器都能够进行多类分类,但是通过sklearn.multiclass 允许改变他们处理多于两个类的方式提供的元估计器,因为这可能对分类器性能(无论是泛化错误还是所需的计算资源)都有影响。

以下是按照策略分组的scikit-learn支持的分类器的总结; 如果您正在使用其中之一,则不需要此类中的元估计,除非您想要自定义多类行为:

一些估计也支持多输出多类分类任务决策树随机森林, 最近的邻居

警告: 目前,没有sklearn.metrics 支持多输入多类分类任务的度量。

多标签分类格式

在多标签学习中,二元分类任务的联合集合用标签二进制指示符数组表示:每个样本是具有二进制值的2d数组形状(n_samples,n_classes)的一行,即非零元素对应于标签的子集。第一个样本中表示标签0 的数组 ,第二个样本中的标签1和2,第三个样本中没有标签。np.array([[1, 0, 0], [0, 1, 1], [0, 0, 0]])

生成多标签数据作为标签集合的列表可能更直观。该MultiLabelBinarizer 变压器可用于标签的集合的集合和指标格式之间的转换。

>>> from sklearn.preprocessing import MultiLabelBinarizer

>>> y = [[234], [2], [013], [01234], [012]]

>>> MultiLabelBinarizer().fit_transform(y)

array([[00111],

       [00100],

       [11010],

       [11111],

       [11100]])

One-Vs-The-Rest

这个策略,也被称为一对一全部,被执行 OneVsRestClassifier。该策略在于每个类装配一个分类器。对于每个分类器,该类适用于所有其他类。除了其计算效率(仅 需要n_classes分类器)之外,这种方法的一个优点是其可解释性。由于每个类都由一个分类器表示,所以可以通过检查其对应的分类器来获得有关该类的知识。这是最常用的策略,是一个公平的默认选择。

多类学习

下面是使用OvR进行多类学习的例子:

>>> from sklearn import datasets

>>> from sklearn.multiclass import OneVsRestClassifier

>>> from sklearn.svm import LinearSVC

>>> iris = datasets.load_iris()

>>> X, y = iris.data, iris.target

>>> OneVsRestClassifier(LinearSVC(random_state=0)).fit(X, y).predict(X)

array([00000000000000000000000,

       00000000000000000000000,

       00001111111111111111111,

       12111111111111221111111,

       11111111222222222222222,

       22222222222222122212222,

       222222222222])

多标签学习

OneVsRestClassifier也支持多标签分类。要使用此功能,请为分类器提供一个指标矩阵,其中单元格[i,j]表示样本i中标签j的存在。

例子:

One-Vs-One

OneVsOneClassifier每对类构造一个分类器。在预测时候,选出最多票数的课程。如果是一个关系(在两个票数相等的两个类别中),则通过对基于二进制分类器计算的成对分类置信水平进行求和来选择具有最高总分类置信度的类。

由于它需要适合分类器,因为它的O(n_classes ^ 2)复杂度,所以这种方法通常比一对一休息慢。然而,该方法对于诸如不能很好地缩放的内核算法的算法可能是有利的 。这是因为每个单独的学习问题只涉及数据的一小部分,而使用一对一休息时,完整的数据集将被使用。n_classes * (n_classes - 1) / 2n_samplesn_classes

多类学习

下面是使用OvO进行多类学习的例子:

>>> from sklearn import datasets

>>> from sklearn.multiclass import OneVsOneClassifier

>>> from sklearn.svm import LinearSVC

>>> iris = datasets.load_iris()

>>> X, y = iris.data, iris.target

>>> OneVsOneClassifier(LinearSVC(random_state=0)).fit(X, y).predict(X)

array([00000000000000000000000,

       00000000000000000000000,

       00001111111111111111111,

       12121111111111211111111,

       11111111222222222222222,

       22222222222222222222222,

       222222222222])

参考文献:

[1]

“模式识别与机器学习。Springer“,Christopher M. Bishop,第183页,(第一版)

错误校正输出代码 

基于输出代码的策略与一对一休息和一对一相比是截然不同的。使用这些策略,每个类都在欧几里德空间中表示,其中每个维度只能为0或1.另一种方法是每个类由二进制代码(0和1的数组)表示。跟踪每个类的位置/代码的矩阵称为代码簿。代码大小是上述空间的维度。直观地,每个类应该尽可能唯一的代码表示,并且应该设计好的代码簿来优化分类精度。在这个实现中,我们只是简单地使用[3]中倡导的随机生成的代码本,尽管将来可能会添加更复杂的方法。

在拟合时,编码簿中的每位一个二进制分类器。在预测时间,分类器用于投射类空间中的新点,并且选择最接近点的类。

OutputCodeClassifiercode_size属性中,该属性允许用户控制将被使用的分类器的数量。这是课程总数的百分比。

0和1之间的数字将比一对一休息所需的分类数少。在理论上,足以明确地表示每个类。然而,实际上,它可能不会导致良好的准确性,因为它比n_classes小得多。log2(n_classes) / n_classeslog2(n_classes)

大于1的数字将需要比一次休息的更多的分类器。在这种情况下,一些分类器将理论上纠正其他分类器所犯的错误,因此名称为“纠错”。然而,实际上,这可能不会发生,因为分类器错误通常会相关。错误纠正输出代码对包装具有相似的效果。

多类学习

以下是使用输出代码进行多类学习的示例:

>>> from sklearn import datasets

>>> from sklearn.multiclass import OutputCodeClassifier

>>> from sklearn.svm import LinearSVC

>>> iris = datasets.load_iris()

>>> X, y = iris.data, iris.target

>>> clf = OutputCodeClassifier(LinearSVC(random_state=0),

...                            code_size=2, random_state=0)

>>> clf.fit(X, y).predict(X)

array([00000000000000000000000,

       00000000000000000000000,

       00001111112111111111211,

       12111111211111222111111,

       11111111222222222222222,

       22221222222222122211222,

       222222222222])

参考文献:

[2] “通过纠错输出代码解决多类学习问题”,Dietterich T.,Bakiri G.,Journal of Artificial Intelligence Research 2,1995。
[3] “The error coding method and PICTs”,James G.,Hastie T.,Journal of Computational and Graphical statistics 7,1998。
[4]

“统计学习的要素”,Hastie T.,Tibshirani R.,Friedman J.,第606页(第二版)2008。

多输出回归

多输出回归支持可以添加到任何回归 MultiOutputRegressor。该策略包括每个目标拟合一个回归。由于每个目标都由恰好一个回归函数表示,因此可以通过检查其对应的回归函数来获得关于目标的知识。对于 MultiOutputRegressor每个目标,它适合一个回归者,它不能利用目标之间的相关性。

以下是多输出回归的示例:

>>> from sklearn.datasets import make_regression

>>> from sklearn.multioutput import MultiOutputRegressor

>>> from sklearn.ensemble import GradientBoostingRegressor

>>> X, y = make_regression(n_samples=10, n_targets=3, random_state=1)

>>> MultiOutputRegressor(GradientBoostingRegressor(random_state=0)).fit(X, y).predict(X)

array([[-154.75474165-147.03498585,  -50.03812219],

       [   7.12165031,    5.12914884,  -81.46081961],

       [-187.8948621 -100.44373091,   13.88978285],

       [-141.62745778,   95.02891072-191.48204257],

       [  97.03260883,  165.34867495,  139.52003279],

       123.92529176,   21.25719016,   -7.84253   ],

       [-122.25193977,  -85.16443186-107.12274212],

       -30.170388  ,  -94.80956739,   12.16979946],

       140.72667194,  176.50941682,  -17.50447799],

       149.37967282,  -81.15699552,   -5.72850319]])

多输出分类

Multioutput分类支持可以添加到任何分类器 MultiOutputClassifier。这个策略包括每个目标的一个分类器。这允许多个目标变量分类。该类的目的是扩展估计器以能够估计在单个X预测矩阵上训练的一系列目标函数(f1,f2,f3 ...,fn),以预测一系列的代表(y1,y2 ,Y3,...,YN)。

以下是多输出分类的示例:

>>> from sklearn.datasets import make_classification

>>> from sklearn.multioutput import MultiOutputClassifier

>>> from sklearn.ensemble import RandomForestClassifier

>>> from sklearn.utils import shuffle

>>> import numpy as np

>>> X, y1 = make_classification(n_samples=10, n_features=100, n_informative=30, n_classes=3, random_state=1)

>>> y2 = shuffle(y1, random_state=1)

>>> y3 = shuffle(y1, random_state=2)

>>> Y = np.vstack((y1, y2, y3)).T

>>> n_samples, n_features = X.shape # 10,100

>>> n_outputs = Y.shape[1# 3

>>> n_classes = 3

>>> forest = RandomForestClassifier(n_estimators=100, random_state=1)

>>> multi_target_forest = MultiOutputClassifier(forest, n_jobs=-1)

>>> multi_target_forest.fit(X, Y).predict(X)

array([[220],

       [121],

       [210],

       [002],

       [021],

       [002],

       [110],

       [111],

       [002],

       [200]])

猜你喜欢

转载自blog.csdn.net/mixiaolemy/article/details/84529051