MultiLabelBinarizer: сбой inverse_transform на одном примере? - PullRequest
0 голосов
/ 06 апреля 2019

Я хочу применить inverse_transform MultiLabelBinarizer к одному сэмплу, например:

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

1 Ответ

1 голос
/ 26 июня 2019

Судя по вашему комментарию, похоже, что вы решили это.В случае, если это поможет кому-то еще, немного подробнее:

В первом примере, если мы напечатаем размеры 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 throws полезна, показывая, что она ожидает, что 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.shape после будет (1, 8) и m.inverse_transform(s) будет работать как положено.

...