numpy.ndarray разреженная матрица для плотного - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу запустить sklearn RandomForestClassifier для некоторых данных, которые упакованы как numpy.ndarray, что оказывается разреженным.Вызов fit дает ValueError: setting an array element with a sequence..Из других сообщений я понимаю, что случайный лес не может обрабатывать разреженные данные.

Я ожидал, что у объекта будет метод todense, но его нет.

>>> X_train
array(<1443899x1936774 sparse matrix of type '<class 'numpy.float64'>'
    with 141256894 stored elements in Compressed Sparse Row format>,
      dtype=object)
>>> type(X_train)
<class 'numpy.ndarray'>

Я попытался обернуть егос SciPy csr_matrix, но это также дает ошибки.

Есть ли способ заставить случайный лес принять эти данные?(не уверен, что плотность действительно уместилась бы в памяти, но это другое дело ...)

РЕДАКТИРОВАТЬ 1

Код, генерирующий ошибку, выглядит следующим образом:

X_train = np.load('train.npy') # this returns a ndarray
train_gt = pd.read_csv('train_gt.csv')

model = RandomForestClassifier()
model.fit(X_train, train_gt.target)

Что касается предложения использовать toarray(), у ndarray такого метода нет.AttributeError: 'numpy.ndarray' object has no attribute 'toarray'

Более того, как уже упоминалось, для этих конкретных данных мне потребуется терабайт памяти для хранения массива.Можно ли запустить RandomForestClassifier с разреженным массивом?

РЕДАКТИРОВАТЬ 2

Кажется, что данные должны были быть сохранены с использованием разреженного SciPy, как указано здесь Сохранение / загрузка разреженного файла csr_matrix в переносимом формате данных .При использовании сохранения / загрузки в NumPy необходимо было сохранить больше данных.

Ответы [ 3 ]

1 голос
/ 11 апреля 2019
>>> X_train
array(<1443899x1936774 sparse matrix of type '<class 'numpy.float64'>'
    with 141256894 stored elements in Compressed Sparse Row format>,
      dtype=object)

означает, что ваш код или то, что он вызывает, выполнил np.array(M), где M - это csr разреженная матрица. Он просто оборачивает эту матрицу в массив dtype объекта.

Чтобы использовать разреженную матрицу в коде, который не принимает разреженные матрицы, сначала необходимо преобразовать их в плотную:

 arr = M.toarray()    # or M.A same thing
 mat = M.todense()    # to make a np.matrix

Но, учитывая размеры и количество ненулевых элементов, вполне вероятно, что это преобразование даст memory error.

1 голос
/ 11 апреля 2019

Я полагаю, вы ищете метод toarray, как показано в документации .

Так что вы можете сделать, например, X_dense = X_train.toarray().

Конечно, тогда ваш компьютер выходит из строя (если у вас нет необходимых 22 терабайт оперативной памяти?).

0 голосов
/ 14 апреля 2019

Кажется, что данные должны были быть сохранены с использованием разреженного SciPy, как упомянуто здесь Сохранить / загрузить scipy разреженный csr_matrix в формате переносимых данных .При использовании сохранения / загрузки в NumPy необходимо было сохранить больше данных.

RandomForestClassifier может работать с использованием данных в этом формате.Код был запущен в течение 1:30, поэтому, надеюсь, он действительно завершится: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...