LabelBinarizer在多类示例

时间:2018-03-21 21:20:26

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

在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])

这一切都很好。现在使用单热编码:

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

我希望标签 binarizer 编码目标,但不会对分类器产生影响。然而,它产生了不同的结果:

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

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

1 个答案:

答案 0 :(得分: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解释为多标签输入。来自documentation

  

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

     

多级目标。指标矩阵打开多标签   分类