Ошибка памяти при использовании логистической регрессии - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть массив с формой 57159x924, который я буду использовать в качестве обучающих данных.896 из этих 924 столбцов являются характерными и оставшиеся надписи.Я хочу использовать логистическую регрессию для этого, но когда я использую функцию подгонки из логистической регрессии, я получаю ошибку памяти.Я предполагаю, что это потому, что это слишком много данных для памяти моего компьютера для обработки.Есть ли способ обойти эту проблему?

Код, который я хочу использовать:

lr = LogisticRegression(random_state=1)
lr.fit(train_set, train_label)
lr.predict_proba(x_test)

И вот ошибка

строка 21 в main lr.fit (train_set, train_label)

....

возвращаемый массив (a, dtype, copy = False, order = order) MemoryError

1 Ответ

0 голосов
/ 05 декабря 2018

Вы не предоставили достаточно подробностей, чтобы действительно понять проблему или дать определенный ответ, но вот несколько вариантов, которые, я надеюсь, помогут:

  1. Объем доступной памяти может быть настраиваемым.
  2. Обучение на всех данных одновременно может вызвать проблемы OOM во многих контекстах, поэтому обычной практикой является использование SGD (стохастический градиентный спуск) при обучении по партиям, т.е.вводить только подмножества данных на каждой итерации и получать решение глобальной оптимизации в стохастическом смысле.Если я правильно угадываю, вы используете sklearn.linear_model.LogisticRegression , который имеет разные «решатели».Возможно, решатель saga лучше справится с вашей ситуацией.
  3. Существуют и другие реализации, и некоторые из них, безусловно, имеют встроенные опции пакетной обработки, которые легко настраиваются.И если худшее приходит к худшему, реализация модели логистической регрессии довольно проста, и тогда вы можете легко и просто сделать все как есть.

Редактировать (из-за обсуждения в комментариях):
Вот практический способ сделать это, с очень очень простым (и легким) примером -

from sklearn.linear_model import SGDClassifier
import numpy as np
import random

X1 = np.random.multivariate_normal(mean=[10, 5], cov = np.diag([3, 8]), size=1000)  # diagonal covariance for simplicity
Y1 = np.zeros((1000, 1))

X2 = np.random.multivariate_normal(mean=[-4, 55], cov = np.diag([5, 1]), size=1000)  # diagonal covariance for simplicity
Y2 = np.ones((1000, 1))

X = np.vstack([X1, X2])
Y = np.vstack([Y1, Y2]).reshape([2000,])

sgd = SGDClassifier(loss='log', warm_start=True)  # as mentioned in answer. note that shuffle is defaulted to True.
sgd.partial_fit(X, Y, classes = [0, 1])  # first time you need to say what your classes are

for k in range(1000):
    batch_indexs = random.sample(range(2000), 20)
    sgd.partial_fit(X[batch_indexs, :], Y[batch_indexs])

На практике вы должны смотреть на потери и точность и использовать подходящий while вместо for, но читателю остается так много; -)

Обратите внимание, что вы можете контролировать большечем я показал (например, количество итераций и т. д.), поэтому вам следует внимательно прочитать документацию SGDClassifier .
Еще одна вещь, на которую следует обратить внимание, это то, что существуют разные методы пакетирования.Я просто выбирал случайное подмножество на каждой итерации, но некоторые предпочитают, чтобы каждая точка в данных была просмотрена равное количество раз (например, перемешать данные, а затем взять пакеты в индексах порядка или что-то в этом роде).

...