这是我的代码以及调用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...
此致,林
回答:
这里有多个问题:
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,这是错误的。您应该在测试数据上使用与训练数据相同的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。
更新:
您需要设置如下内容:
# 合并稀疏矩阵from scipy.sparse import hstackresult_matrix_train = Noneresult_matrix_test = Nonefor feature_colunm_name in feature_columns_to_use: cv = CountVectorizer() X_train_cv = cv.fit_transform(X_train[feature_colunm_name]) # 将向量与其他合并 result_matrix_train = hstack((result_matrix_train, X_train_cv)) if result_matrix_train is not None else X_train_cv # 现在转换测试数据 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)