【问题标题】:memory error when todense in python using CountVectorizer使用CountVectorizer在python中todense时出现内存错误
【发布时间】:2019-02-11 03:28:40
【问题描述】:

这是我在调用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
...

问候, 林

【问题讨论】:

  • 你得到的错误究竟是什么?
  • 你尝试过使用密集数组吗?
  • @LinMa:那是因为试图将稀疏矩阵分配给数据框列,就好像它是一个数组一样。
  • 默认情况下CountVectorizer.fit 提供稀疏矩阵,但是当您尝试转换为密集数组时会占用大量内存,如果您的系统没有太多内存,则会出现内存错误
  • 您的系统有多少内存?以及数组的理论大小是多少(即X_trainX_test 的尺寸是多少)?

标签: python machine-learning scikit-learn xgboost


【解决方案1】:

这里有很多问题:

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 的结果将是一个二维数组,其中列表示特征)分配给 DataFrame 的单个列“feature_colunm_name”。那是行不通的,会产生错误。

2) 您在测试数据上再次拟合 CountVectorizer,这是错误的。您应该在测试数据上使用与 trainind 数据相同的 CountVectorizer 对象,并且只调用 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)

【讨论】:

  • 感谢 Vivek,您能否详细说明“将所有输出数据合并到一个数组中”的含义?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
相关资源
最近更新 更多