【问题标题】:MemoryError in Python but not IPythonPython 中的 MemoryError 但不是 IPython
【发布时间】:2013-12-21 08:47:43
【问题描述】:

通常——你能想到为什么会发生这种情况(即 Python 中的 MemoryError 但 IPython 中没有(控制台——不是笔记本)?)

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

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,但我想去 >2000)。 Ysklearn 转换为密集矩阵(因此 Y = np.zeros((len(y), len(classes)), dtype=np.int) MemoryError ),即使它是作为稀疏传入的。

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

有什么想法吗?

【问题讨论】:

  • 最好更具体一些,你有重现问题的示例代码吗?
  • Xy 的尺寸是多少,你有多少 RAM,你运行的是 32 位还是 64 位 python?
  • X --> 600 万乘 140k(稀疏矩阵); Y --> 600 万乘 21(密集(稀疏,但被 sklearn 转换为密集)); 60GB 内存; 64位蟒蛇
  • 32 位还是 64 位 python?

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


【解决方案1】:

听起来您遇到了标签二值化器当前实现的限制:请参阅问题 #2441。有PR #2458可以修复。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2019-08-12
    • 2011-04-28
    • 2018-03-06
    相关资源
    最近更新 更多