首页 > 解决方案 > MultiLabelBinarizer:inverse_transform 在单个样本上失败?

问题描述

我想将inverse_transformMultiLabelBinarizer 应用于单个样本,例如:

labels = ['Architektur & Garten',
          'Ganzheitliches Bewusstsein',
          'Glaube & Ethik',
          'Kinderbuch & Jugendbuch',
          'Künste',
          'Literatur & Unterhaltung',
          'Ratgeber',
          'Sachbuch']

samples = []
for l in labels:
   samples.append([l])

from sklearn.preprocessing import MultiLabelBinarizer
m = MultiLabelBinarizer()
m.fit_transform(samples)

如果我现在将 MultiLabelBinarizer 应用于矩阵,它可以工作:

s = np.array([[0, 1, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 1]])
m.inverse_transform(s)
[('Ganzheitliches Bewusstsein',), ('Sachbuch',)]

但是,如果我尝试将其应用于单个样本,即它失败的向量:

import numpy as np
s = np.array([0, 1, 0, 0, 0, 0, 0, 0])
m.inverse_transform(s)

--> 957         if yt.shape[1] != len(self.classes_):
    958             raise ValueError('Expected indicator for {0} classes, but got {1}'
    959                              .format(len(self.classes_), yt.shape[1]))

标签: scikit-learnmultilabel-classification

解决方案


从您的评论来看,您似乎已经解决了它。如果这对其他人有帮助,请提供更多详细信息:

在第一个例子中,如果我们打印s我们得到的尺寸(2, 8)

>>> s = np.array([[0, 1, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 1]])
>>> s.shape
(2,8)

在第二个例子中,如果我们做同样的事情,我们会得到(8,)

>>> s = np.array([0, 1, 0, 0, 0, 0, 0, 0])
>>> s.shape
(8,)

问题出在第二个示例中,错误inverse_transform抛出有助于表明它期望yt.shape[1]可用。在第二个示例中,该维度不可用,因此出现错误。

这可以通过两种方式解决:

  1. 只需添加方括号:s = np.array([0, 1, 0, 0, 0, 0, 0, 0])变为s = np.array([ [0, 1, 0, 0, 0, 0, 0, 0]])
  2. 重塑:s = np.reshape(s, (1, s.shape[0]))

无论哪种方式,s.shapeafter的输出(1, 8)m.inverse_transform(s)将按预期工作。


推荐阅读