首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OneVsRestClassifier和MultiOutputClassifier在scikit学习中有什么区别?

OneVsRestClassifier和MultiOutputClassifier在scikit学习中有什么区别?
EN

Stack Overflow用户
提问于 2017-03-15 19:54:20
回答 3查看 20.8K关注 0票数 36

请有人解释一下(例如,也许)什么是科学知识中的,OneVsRestClassifierMultiOutputClassifier之间的区别?

我读过文档,我理解我们使用:

  • OneVsRestClassifier -当我们想要进行多类或多标签分类时,它的策略包括拟合每类一个分类器。对于每个分类器,类与所有其他类相匹配。(这很清楚,这意味着多类/多标签分类问题被分解为多个二进制分类问题)。
  • MultiOutputClassifier -当我们想做多目标分类时(这是什么?)它的策略包括拟合每个目标的一个分类器(目标在那里意味着什么?)

我已经将OneVsRestClassifier用于多标签分类,我可以理解它是如何工作的,但是我找到了MultiOutputClassifier,无法理解它是如何与OneVsRestClassifier不同的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-23 13:48:39

多类分类

为了更好地说明这些差异,让我们假设您的目标是将所以的问题分类为不同的、相互排斥的类。为了简单起见,在这个示例中,我们只考虑四个类,即'Python''Java''C++''Other language'。让我们假设您有一个由6个SO问题组成的数据集,这些问题的类标签存储在一个数组y中,如下所示:

代码语言:javascript
运行
复制
import numpy as np
y = np.asarray(['Java', 'C++', 'Other language', 'Python', 'C++', 'Python'])

上面描述的情况通常称为多类分类(也称为多项式分类)。为了对分类器进行拟合,并通过scikit学习库对模型进行验证,需要将文本类标签转换成数字标签。要做到这一点,您可以使用LabelEncoder

代码语言:javascript
运行
复制
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_numeric = le.fit_transform(y)

数据集的标签是这样编码的:

代码语言:javascript
运行
复制
In [220]: y_numeric
Out[220]: array([1, 0, 2, 3, 0, 3], dtype=int64)

其中,这些数字表示以下数组的索引:

代码语言:javascript
运行
复制
In [221]: le.classes_
Out[221]: 
array(['C++', 'Java', 'Other language', 'Python'], 
      dtype='|S14')

一个重要的特殊情况是只有两个类,即n_classes = 2。这通常被称为二进制分类

多标号分类

现在让我们假设您希望使用n_classes二进制分类器池执行这样的多类分类,即n_classes --不同类的数量。这些二进制分类器中的每一个都决定一个项是否属于特定的类。在这种情况下,不能将类标签编码为从0n_classes - 1的整数,您需要创建一个二维指示矩阵。假设示例n属于k类。然后,指示矩阵的[n, k]条目是1,行n中的其余元素是0。需要注意的是,如果类不是互斥的,那么一行可以有多个1。这种方法名为多标签分类,可以通过MultiLabelBinarizer轻松实现。

代码语言:javascript
运行
复制
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
y_indicator = mlb.fit_transform(y[:, None])

指标如下:

代码语言:javascript
运行
复制
In [225]: y_indicator
Out[225]: 
array([[0, 1, 0, 0],
       [1, 0, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1],
       [1, 0, 0, 0],
       [0, 0, 0, 1]])

1的列数实际上是这个数组的索引:

代码语言:javascript
运行
复制
In [226]: mlb.classes_
Out[226]: array(['C++', 'Java', 'Other language', 'Python'], dtype=object)

多输出分类

如果您想同时根据两个不同的标准,例如语言和应用程序,对一个特定的SO问题进行分类,该怎么办?在这种情况下,您打算执行多输出分类。为了简单起见,我只考虑三个应用程序类,即'Computer Vision''Speech Processing‘和'Other application’。数据集的标签数组应该是二维的:

代码语言:javascript
运行
复制
y2 = np.asarray([['Java', 'Computer Vision'],
                 ['C++', 'Speech Recognition'],
                 ['Other language', 'Computer Vision'],
                 ['Python', 'Other Application'],
                 ['C++', 'Speech Recognition'],
                 ['Python', 'Computer Vision']])

同样,我们需要将文本类标签转换为数字标签。据我所知,这个功能还没有在scikit中实现,所以您需要编写自己的代码。这个帖子描述了一些聪明的方法来实现这一点,但是为了本文的目的,下面的一行应该足够了:

代码语言:javascript
运行
复制
y_multi = np.vstack((le.fit_transform(y2[:, i]) for i in range(y2.shape[1]))).T

编码的标签如下所示:

代码语言:javascript
运行
复制
In [229]: y_multi
Out[229]: 
array([[1, 0],
       [0, 2],
       [2, 0],
       [3, 1],
       [0, 2],
       [3, 0]], dtype=int64)

可以从以下数组推断每列中的值的含义:

代码语言:javascript
运行
复制
In [230]: le.fit(y2[:, 0]).classes_
Out[230]: 
array(['C++', 'Java', 'Other language', 'Python'], 
      dtype='|S18')

In [231]: le.fit(y2[:, 1]).classes_
Out[231]: 
array(['Computer Vision', 'Other Application', 'Speech Recognition'], 
      dtype='|S18')
票数 38
EN

Stack Overflow用户

发布于 2021-01-05 21:00:12

这是@tonec已有答案的分机。在读这篇文章之前先读一下答案。OVR只支持当每个标签是一个二进制标签/类(也称为二进制多标签),即要么样本属于该标签,要么不支持。当目标是多输出时(也称为多类多标签),即当每个样本可以属于标签中的任何一个类时,它就不能工作了。对于后一种情况,您需要使用sklearn多输出分类器。

换句话说,当目标变量如下所示时,sklearn不起作用,

代码语言:javascript
运行
复制
y_true = np.arr([[2, 1, 0],
                 [0, 2, 1],
                 [1, 2, 4]])

其中label1有4类0,1,2,3;label2有3类0,1,2;label3有5类0,1,2,3,4。认为它是不相互排斥的标签,而每个标签中的类是互斥的。

史考特·奥VR会在

代码语言:javascript
运行
复制
y_true = np.arr([[0, 1, 1],
                 [0, 0, 1],
                 [1, 1, 0]])

在label1 labe2中,label3每个只有2个类。因此,一个示例要么属于该标签,要么不属于。例如:第一个示例属于label1和label2。

很抱歉,我找不到这种用法的真实世界的例子。

票数 4
EN

Stack Overflow用户

发布于 2022-04-19 13:13:08

对此有什么答案吗?接受的答案只是简单地描述了这些概念,但实际上并没有明确地解决OP的问题“sklearn的OneVsRestClassifier类和MultiOutputClassifier类之间的区别是什么?”

我认为这个问题的作者自己回答了

MultiOutputClassifier -当我们想做多目标分类时(这是什么?)它的策略包括每个目标拟合一个分类器(目标在那里意味着什么?)

目标是Y (依赖变量)

P.S. MultiClass或MultiLabel --意思是“多”-nominal features,被认为是独立的X。(分别在多进行或feature_columns.count>1中)

p.p.s.我想在sklearn图书馆内部,每个目标都有一个单独的培训(适合)--关于作者的引文。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42819460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档