将稀疏矩阵转换为密集矩阵时出现MemoryError错误?(numpy,scikit)

3
lr = lm.LogisticRegression(penalty='l2', dual=True, tol=0.0001, 
                             C=1, fit_intercept=True, intercept_scaling=1.0, 
                             class_weight=None, random_state=None)

rd = AdaBoostClassifier( base_estimator=lr, 
                                           learning_rate=1, 
                                           n_estimators=20, 
                                           algorithm="SAMME")
##here, i am deleting unnecesseary objects
##print X.shape
##(7395, 412605)
print "20 Fold CV Score: ", np.mean(cross_validation.cross_val_score(rd, X, y, cv=20, scoring='roc_auc'))

当我运行此代码时,出现以下错误:

TypeError: 传入了稀疏矩阵,但需要的是密集数据。使用 X.toarray() 将其转换为密集的 numpy 数组。

接着,我将代码更改为以下形式:
print "20 Fold CV Score: ", np.mean(cross_validation.cross_val_score(rd, X.toarray(), y, cv=20, scoring='roc_auc'))

现在,我遇到了以下异常:
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py", line 559, in toarray
    return self.tocoo(copy=False).toarray(order=order, out=out)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/coo.py", line 235, in toarray
    B = self._process_toarray_args(order, out)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/base.py", line 628, in _process_toarray_args
    return np.zeros(self.shape, dtype=self.dtype, order=order)
MemoryError

有解决此问题的建议吗?
1个回答

12

MemoryError表示您的系统上没有足够的RAM来分配矩阵。为什么呢?因为一个 7395 x 412605的矩阵有3,051,213,975个元素。如果它们是默认的 float64 (通常在C中是double)数据类型,那就是22.7GB。如果您将其转换为较低精度的float32(通常在C中是float),它将是11.4GB;也许这可以在您的计算机上处理。不过速度仍然会很慢。

看起来AdaBoostClassifier不支持稀疏输入(如您可以在此代码中看到的)。我不知道是否对于该算法需要密集表示或者只是实现假定了这一点。


3
这取决于执行。稀疏矩阵支持决策树,因此所有高级集成估计器的实现,长期以来一直在待办清单上。 - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接