Как сделать MultiLabelBinarizer в огромном списке списков - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь обучить алгоритм OneVsRest, в котором он получает матрицу tf-idf (называемую x_train), которая имеет такую ​​форму:

<3323504x900282 разреженная матрица типа '' с 119378243 сохраненными элементами вСжатый формат разреженной строки>

и y_train, представляющий собой список списков (длиной 3323499). Каждый участник имеет 5 ярлыков (максимум). Итак, y_train выглядит так:

[['mysql', 'triggers'], ['mercurial', 'rebase'], ['c #', '.net'], ...]

Когда я выполняю этот код:

ovr_clf = OneVsRestClassifier(SVC(gamma="auto", random_state=42))
ovr_clf.fit(x_train, y_train)

, я получаю следующее сообщение:

ValueError: Вы выглядите какиспользование устаревшего представления данных с несколькими метками. Последовательности последовательностей больше не поддерживаются;используйте вместо этого двоичный массив или разреженную матрицу - преобразователь MultiLabelBinarizer может преобразовать в этот формат.

После попытки выполнить MultiLabelBinarizer, например так:

mlb = MultiLabelBinarizer()
mlb.fit_transform(y_train)

Я получаю сообщение:

MemoryError Traceback (последний последний вызов) в 1 mlb = MultiLabelBinarizer () ----> 2 mlb.fit_transform (y_train)

D: \ Anaconda3\ lib \ site-packages \ sklearn \ preprocessing \ label.py в fit_transform (self, y) 884 885, если не self.sparse_output: -> 886 yt = yt.toarray () 887 888 вернуть yt

D: \ Anaconda3 \ lib \ site-packages \ scipy \ sparse \ressed.py в toarray (self, order, out) 960, если out равен None, а order равен None: 961 order = self._swap ('cf') [0] -> 962 out = self._process_toarray_args (order, out) 963, если нет (out.flags.c_contiguous или out.flags.f_contiguous): 964 повысить ValueError («Выходной массив должен быть C или F непрерывным»)

D: \ Anaconda3 \ lib \ site-packages \ scipy \ sparse \ base.py в _process_toarray_args (self, order, out) 1185вернуть 1186 иначе: -> 1187 вернуть np.zeros (self.shape, dtype = self.dtype, order = order) 1188 1189

MemoryError:

Я предполагаю, что этопроисходит потому, что не хватает памяти. Есть ли способ сделать это частично, чтобы мне не хватило памяти?

1 Ответ

0 голосов
/ 10 ноября 2019

Используйте разреженный формат

mlb = MultiLabelBinarizer(sparse_output=True)
mlb.fit_transform(y_train)

Кстати, сначала вы должны назвать «соответствовать» всему вашему набору данных, а затем выполнить преобразование в поезде и проверить индивидуально. Таким образом, если у вас есть ярлыки в y_test, которых нет в y_train, вы не получите ошибку.

...