Ошибка памяти в Python при использовании hstack - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь объединить все функции, которые векторизованы друг с другом.Некоторые из этих признаков представлены в виде разреженных матриц.Я получаю сообщение об ошибке при использовании hstack для объединения всех функций.

Код:

from scipy.sparse import hstack
a_train = hstack((categories_one_hot_train, sub_categories_one_hot_tr, text_bow_train, price_standardized_tr,title_bow_train))

a_test  = hstack((categories_one_hot_test, sub_categories_one_hot_test, text_bow_test, price_standardized_test,title_bow_test))

b_train = hstack((categories_one_hot_train, sub_categories_one_hot_tr,text_tfidf_train, price_standardized_tr,title_tfidf_train))

b_test  = hstack((categories_one_hot_test, sub_categories_one_hot_test,text_tfidf_test, price_standardized_test,title_tfidf_test))

c_train = hstack((categories_one_hot_train , sub_categories_one_hot_tr,avg_w2v_vectors_train, price_standardized_tr,avg_w2v_vectors_title_train))

c_test  = hstack((categories_one_hot_test , sub_categories_one_hot_test,avg_w2v_vectors_test, price_standardized_test,avg_w2v_vectors_title_test))

d_train = hstack((categories_one_hot_train, sub_categories_one_hot_tr,tfidf_w2v_vectors_train, price_standardized_tr,tfidf_w2v_vectors_title_train))

d_test  = hstack((categories_one_hot_test, sub_categories_one_hot_test,tfidf_w2v_vectors_test, price_standardized_test,tfidf_w2v_vectors_title_test))

Сообщение об ошибке:

MemoryError                               Traceback (most recent call last)
<ipython-input-55-b8d41d748e49> in <module>()
     17 set2_test  = hstack((categories_one_hot_test, sub_categories_one_hot_test,text_tfidf_test, price_standardized_test,title_tfidf_test))
     18 #set3 avg word2vec
---> 19 set3_train = hstack((categories_one_hot_train , sub_categories_one_hot_tr,avg_w2v_vectors_train, price_standardized_tr,avg_w2v_vectors_title_train))
     20 set3_test  = hstack((categories_one_hot_test , sub_categories_one_hot_test,avg_w2v_vectors_test, price_standardized_test,avg_w2v_vectors_title_test))
     21 #set4 tfidf word2vec

~/.local/lib/python3.6/site-packages/scipy/sparse/construct.py in hstack(blocks, format, dtype)
    463 
    464     """
--> 465     return bmat([blocks], format=format, dtype=dtype)
    466 
    467 

~/.local/lib/python3.6/site-packages/scipy/sparse/construct.py in bmat(blocks, format, dtype)
    572         for j in range(N):
    573             if blocks[i,j] is not None:
--> 574                 A = coo_matrix(blocks[i,j])
    575                 blocks[i,j] = A
    576                 block_mask[i,j] = True

~/.local/lib/python3.6/site-packages/scipy/sparse/coo.py in __init__(self, arg1, shape, dtype, copy)
    190             self.data = self.data.astype(dtype, copy=False)
    191 
--> 192         self._check()
    193 
    194     def reshape(self, *args, **kwargs):

~/.local/lib/python3.6/site-packages/scipy/sparse/coo.py in _check(self)
    272         idx_dtype = get_index_dtype(maxval=max(self.shape))
    273         self.row = np.asarray(self.row, dtype=idx_dtype)
--> 274         self.col = np.asarray(self.col, dtype=idx_dtype)
    275         self.data = to_native(self.data)
    276 

~/anaconda3/lib/python3.6/site-packages/numpy/core/numeric.py in asarray(a, dtype, order)
    490 
    491     """
--> 492     return array(a, dtype, copy=False, order=order)
    493 
    494 

MemoryError: 

Где я ошибся?

Если я не могу устранить эту ошибку, есть ли другие функции, которые используются для объединения разреженных матриц с обычными матрицами после кодирования данных, чтобы я мог построить модель на них.

1 Ответ

0 голосов
/ 27 февраля 2019

Как указывалось в сообщении об ошибке, ваша оперативная память недостаточно велика для размещения этих кадров данных друг над другом.Я предполагаю, что это очень большие наборы данных, и когда вы вызываете их таким образом, вы загружаете все данные за один раз, что ваш текущий компьютер не может обработать.

Таким образом, чтобы ответить на ваш вопрос, вы ошиблись, пытаясь загрузить все эти данные за один шаг, вместо того, чтобы использовать пакетную загрузку или некоторые необычные манипуляции , описанные в этом посте.

Основная причина, по которой вы это видите, заключается в том, что вы постоянно вызываете categories_one_hot_train и sub_categories_one_hot_tr в вашу программу и выделяете для нее память.В зависимости от размера этих фреймов данных, это может очень легко вызвать ошибку памяти, так как Python будет выделять память для каждого экземпляра, который он назвал.

Лучшим методом (попытаться, без какой-либо информации о ваших данных или о том, сколько памяти занимает каждый набор данных, невозможно узнать, достаточно ли у вас памяти, чтобы хотя бы прочитать эти данные), было бы вызвать categories_one_hot_train и sub_categories_one_hot_tr один раз и создайте все свои кадры данных (от a_train до d_test) как один гигантский кадр данных.После этого вы можете нарезать свой фрейм данных на основе столбцов, которые вам нужны для получения суб-фреймов.

Используя этот метод, вы вызываете categories_one_hot_train и sub_categories_one_hot_tr только один раз, а не 8 раз, поэтому Python нужно будет выделять память для этих кадров только один раз, а не 8 раз.

И если это не сработает, то лучше всего провести обучение и протестировать подмножество данных, чтобы избежать нехватки памяти.

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