【问题标题】:LabelBinarizer yields different result in multiclass exampleLabelBinarizer 在多类示例中产生不同的结果
【发布时间】:2018-08-31 04:27:39
【问题描述】:

在执行 scikit-learn 教程中的多类示例时

我遇到了一些奇怪的事情。

>>> import sklearn
>>> sklearn.__version__
0.19.1

>>> from sklearn.svm import SVC
>>> from sklearn.multiclass import OneVsRestClassifier
>>> from sklearn.preprocessing import LabelBinarizer

>>> X = [[1, 2], [2, 4], [4, 5], [3, 2], [3, 1]]
>>> y = [0, 0, 1, 1, 2] # Three classes

>>> clf = OneVsRestClassifier(estimator=SVC(random_state=0))
>>> clf.fit(X, y).predict(X)
array([0, 0, 1, 1, 2])

这一切都很好。现在使用 one-hot 编码:

>>> y = LabelBinarizer().fit_transform(y)
>>> y
array([[1, 0, 0],
       [1, 0, 0],
       [0, 1, 0],
       [0, 1, 0],
       [0, 0, 1]])

我希望标签 binarizerencode 目标,但对分类器没有影响。但是它会产生不同的结果:

>>> clf.fit(X, y).predict(X)
array([[1, 0, 0],
       [1, 0, 0],
       [0, 1, 0],
       [0, 0, 0],
       [0, 0, 0]])

Google Colab 上的笔记本(奇怪的是,相同的代码会产生不同的错误):

【问题讨论】:

    标签: python machine-learning scikit-learn svm one-hot-encoding


    【解决方案1】:

    OneVsRestClassifier 在后台应用LabelBinarizer 本身(sklearn/multiclass.py 中的源代码):

    def fit(self, X, y):
      ...
      self.label_binarizer_ = LabelBinarizer(sparse_output=True)
      Y = self.label_binarizer_.fit_transform(y)
      Y = Y.tocsc()
      self.classes_ = self.label_binarizer_.classes_
    

    因此不需要额外的手动转换。实际上,它将您的单热编码 y 解释为 multi-label 输入。来自documentation

    y:(稀疏)类数组,shape = [n_samples, ], [n_samples, n_classes]

    多类目标。指示矩阵开启多标签 分类。

    【讨论】:

      猜你喜欢
      • 2018-05-23
      • 2017-09-11
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多