ошибка памяти при todense в python с использованием CountVectorizer - PullRequest
0 голосов
/ 06 сентября 2018

Вот мой код и ошибка памяти при вызове todense(), я использую модель GBDT и задаюсь вопросом, есть ли у кого-нибудь хорошие идеи, как обойти ошибку памяти? Благодаря.

  for feature_colunm_name in feature_columns_to_use:
    X_train[feature_colunm_name] = CountVectorizer().fit_transform(X_train[feature_colunm_name]).todense()
    X_test[feature_colunm_name] = CountVectorizer().fit_transform(X_test[feature_colunm_name]).todense()
  y_train = y_train.astype('int')
  grd = GradientBoostingClassifier(n_estimators=n_estimator, max_depth=10)
  grd.fit(X_train.values, y_train.values)

Подробное сообщение об ошибке,

in _process_toarray_args
    return np.zeros(self.shape, dtype=self.dtype, order=order)
MemoryError
...

С уважением, Lin

1 Ответ

0 голосов
/ 06 сентября 2018

Здесь несколько вещей не так:

for feature_colunm_name in feature_columns_to_use:
    X_train[feature_colunm_name] = CountVectorizer().fit_transform(X_train[feature_colunm_name]).todense()
    X_test[feature_colunm_name] = CountVectorizer().fit_transform(X_test[feature_colunm_name]).todense()

1) Вы пытаетесь присвоить столбцы с несколькими строками (результатом CountVectorizer будет двумерный массив, в котором столбцы представляют объекты) одному столбцу 'feature_colunm_name' объекта DataFrame. Это не сработает и приведет к ошибке.

2) Вы снова подключаете CountVectorizer к тестовым данным, что неверно. Вы должны использовать тот же объект CountVectorizer для тестовых данных, который вы использовали для данных trainind, и вызывать только transform(), а не fit_transform().

Что-то вроде:

cv = CountVectorizer()
X_train_cv = cv.fit_transform(X_train[feature_colunm_name])
X_test_cv = cv.transform(X_test[feature_colunm_name])

3) GradientBoostingClassifier хорошо работает с разреженными данными. Это еще не упомянуто в документации (похоже на ошибку в документации).

4) Похоже, вы преобразовываете несколько столбцов ваших исходных данных в форму пакета слов. Для этого вам нужно будет использовать эти многочисленные объекты CountVectorizer, а затем объединить все выходные данные в один массив, который вы передадите в GradientBoostingClassifier.

Обновление

Вам нужно настроить что-то вроде этого:

# To merge sparse matrices
from scipy.sparse import hstack

result_matrix_train = None
result_matrix_test = None

for feature_colunm_name in feature_columns_to_use:
    cv = CountVectorizer()
    X_train_cv = cv.fit_transform(X_train[feature_colunm_name])

    # Merge the vector with others
    result_matrix_train = hstack((result_matrix_train, X_train_cv)) 
                          if result_matrix_train is not None else X_train_cv

    # Now transform the test data
    X_test_cv = cv.transform(X_test[feature_colunm_name])
    result_matrix_test = hstack((result_matrix_test, X_test_cv)) 
                         if result_matrix_test is not None else X_test_cv

Примечание: Если у вас есть и другие столбцы, которые вы не обработали через Countvectorizer, потому что они уже числовые или около того, которые вы хотите объединить с result_matrix_train, вы также можете сделать это с помощью:

result_matrix_train = hstack((result_matrix_test, X_train[other_columns].values)) 
result_matrix_test = hstack((result_matrix_test, X_test[other_columns].values)) 

Теперь используйте их для обучения:

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