Python中的MemoryError但不是IPython

时间:2013-12-04 18:02:48

标签: python memory machine-learning ipython scikit-learn

一般来说 - 你能想到出现这种情况的原因(即Python中的MemoryError而不是IPython中的MemoryError(控制台 - 不是笔记本)?)

更具体地说,我在sgdclassifiermulticlass案例中使用了sklearn' multilabel。给出以下代码时出错:

model = SGDClassifier(
    loss='hinge', 
    penalty='l2', 
    n_iter=niter, 
    alpha=alpha, 
    fit_intercept=True,
    n_jobs=1)

mc = OneVsRestClassifier(model)
mc.fit(X, y)

在调用mc.fit(X, y)时,会发生以下错误:

 File "train12-3b.py", line 411, in buildmodel
    mc.fit(X, y)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/multiclass.py", line 201, in fit
    n_jobs=self.n_jobs)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/multiclass.py", line 88, in fit_ovr
    Y = lb.fit_transform(y)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/base.py", line 408, in fit_transform
    return self.fit(X, **fit_params).transform(X)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/preprocessing/label.py", line 272, in transform
    neg_label=self.neg_label)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/preprocessing/label.py", line 394, in label_binarize
    Y = np.zeros((len(y), len(classes)), dtype=np.int)
MemoryError

Y是一个包含600万行和k列的矩阵,其中黄金标签为1,其余为0(在这种情况下为k = 21,但是我是&#39}。我喜欢去> 2000)。 Ysklearn转换为密集矩阵(因此Y = np.zeros((len(y), len(classes)), dtype=np.int) MemoryError),即使它是以稀疏方式传入的。

我有60 gb的ram,并且有21列,它不应该超过8 gb(600万* 21 * 64),所以我很困惑。我重写了Y = np.zeros((len(y), len(classes)), dtype=np.int以使用dtype = bool,但没有运气。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

听起来您正在限制标签二进制文件的当前实现:请参阅问题#2441。有PR #2458来修复它。

请随意尝试该分支,并将结果作为对该PR的评论报告。