有人可以(举例说明)解释scikit-learn中OneVsRestClassifierMultiOutputClassifier之间的区别吗?

我已阅读文档,并且了解我们使用以下内容:

  • OneVsRestClassifier -当我们想进行多类或多标签分类时,它的策略是由组成,每个类适合一个分类器。对于每个分类器,该分类将与所有其他分类进行拟合。 (这很清楚,这意味着将多类/多标签分类问题分解为多个二进制分类问题)。
  • MultiOutputClassifier -当我们想进行多目标分类时(这是什么?),它的策略包括为每个目标拟合一个分类器(目标是什么意思?)

  • 我已经使用过OneVsRestClassifier进行多标签分类,我可以理解它是如何工作的,但是后来我发现了MultiOutputClassifier,并且无法理解它与OneVsRestClassifier的不同之处。

    最佳答案

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

    import numpy as np
    y = np.asarray(['Java', 'C++', 'Other language', 'Python', 'C++', 'Python'])
    
    上述情况通常称为多类分类(也称为多项式分类)。为了适合分类器并通过scikit-learn库验证模型,您需要将文本类标签转换为数字标签。为此,您可以使用LabelEncoder:
    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder()
    y_numeric = le.fit_transform(y)
    
    这是数据集标签的编码方式:
    In [220]: y_numeric
    Out[220]: array([1, 0, 2, 3, 0, 3], dtype=int64)
    
    这些数字表示以下数组的索引:
    In [221]: le.classes_
    Out[221]:
    array(['C++', 'Java', 'Other language', 'Python'],
          dtype='|S14')
    
    一个重要的特殊情况是只有两个类,即n_classes = 2。通常将其称为二进制分类
    多标签分类
    现在让我们假设您希望使用n_classes二进制分类器池执行这种多类分类,而n_classes是不同类的数量。这些二进制分类器中的每一个都决定一项是否属于特定类别。在这种情况下,您不能将类标签编码为从0n_classes - 1的整数,而需要创建一个二维指示器矩阵。考虑样本nk类。然后,指标矩阵的[n, k]条目为1,而n行中的其余元素为0。重要的是要注意,如果这些类不是互斥的,则可以连续存在多个1。这种方法称为多标签分类,可以通过MultiLabelBinarizer轻松实现:
    from sklearn.preprocessing import MultiLabelBinarizer
    mlb = MultiLabelBinarizer()
    y_indicator = mlb.fit_transform(y[:, None])
    
    该指标如下所示:
    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实际上是此数组的索引的列号:
    In [226]: mlb.classes_
    Out[226]: array(['C++', 'Java', 'Other language', 'Python'], dtype=object)
    
    多输出分类
    如果要同时根据两个不同的标准(例如语言和应用程序)对特定的SO问题进行分类怎么办?在这种情况下,您打算进行多输出分类。为了简单起见,我将仅考虑三个应用程序类,即'Computer Vision''Speech Processing'和'Other application'。数据集的标签数组应为二维:
    y2 = np.asarray([['Java', 'Computer Vision'],
                     ['C++', 'Speech Recognition'],
                     ['Other language', 'Computer Vision'],
                     ['Python', 'Other Application'],
                     ['C++', 'Speech Recognition'],
                     ['Python', 'Computer Vision']])
    
    同样,我们需要将文本类标签转换为数字标签。据我所知,此功能尚未在scikit-learn中实现,因此您将需要编写自己的代码。 This thread描述了一些聪明的方法,但是出于这篇文章的目的,下面的单行代码就足够了:
    y_multi = np.vstack((le.fit_transform(y2[:, i]) for i in range(y2.shape[1]))).T
    
    编码的标签如下所示:
    In [229]: y_multi
    Out[229]:
    array([[1, 0],
           [0, 2],
           [2, 0],
           [3, 1],
           [0, 2],
           [3, 0]], dtype=int64)
    
    并且可以从以下数组中推断出每列中值的含义:
    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')
    

    关于python - scikit learning中的OneVsRestClassifier和MultiOutputClassifier有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42819460/

    10-10 02:18