【问题标题】:Memory error when using logistic regression使用逻辑回归时的内存错误
【发布时间】:2019-05-06 16:37:04
【问题描述】:

我有一个形状为 57159x924 的数组,我将用作训练数据。这 924 列中的 896 列是特征和剩余的标签。我想对此使用逻辑回归,但是当我使用逻辑回归中的拟合函数时,出现内存错误。我想这是因为我的计算机内存无法处理的数据太多。有没有办法解决这个问题?

我要使用的代码是

lr = LogisticRegression(random_state=1)
lr.fit(train_set, train_label)
lr.predict_proba(x_test)

以下是错误

第 21 行,主要内容 lr.fit(train_set, train_label)

....

返回数组(a, dtype, copy=False, order=order) 内存错误

【问题讨论】:

  • 欢迎来到 SO!如果代码是独立的,那么任何人都可以运行它并立即尝试调试它,这将很有帮助。你能提供这样一个例子吗(MCVE)?
  • @sophros 数据集遗憾的是不公开,但无论如何拥有所有代码会有所帮助吗?到目前为止我所做的唯一的事情就是打开文件并将其分为测试/训练,所以它很基本

标签: python logistic-regression


【解决方案1】:

你没有给出足够的细节来真正了解问题或给出一个明确的答案,但这里有一些选择我希望有帮助:

  1. 可用的内存量可能是可配置的。
  2. 培训所有 em>这些数据同时会在许多上下文中提高OOM问题,这就是常见做法是通过通过批量训练使用SGD(随机梯度下降)的原因,即仅引入数据的子集每次迭代并在随机意义上获得全局优化解决方案。如果我正在正确猜测,您正在使用sklearn.linear_model.LogisticRegression,它具有不同的“求解器”。也许saga Solver将更好地处理您的情况。
  3. 其中还有其他实现,其中一些实施方案肯定以高度可配置的方式内置批处理选项。如果最糟糕的是最糟糕的,实现一个物流回归模型是相当简单的,然后你可以像馅饼一样容易批量。

编辑(由于CMETS中的讨论):
这是一个实用的方法,非常简单(且简单) -

from sklearn.linear_model import SGDClassifier
import numpy as np
import random

X1 = np.random.multivariate_normal(mean=[10, 5], cov = np.diag([3, 8]), size=1000)  # diagonal covariance for simplicity
Y1 = np.zeros((1000, 1))

X2 = np.random.multivariate_normal(mean=[-4, 55], cov = np.diag([5, 1]), size=1000)  # diagonal covariance for simplicity
Y2 = np.ones((1000, 1))

X = np.vstack([X1, X2])
Y = np.vstack([Y1, Y2]).reshape([2000,])

sgd = SGDClassifier(loss='log', warm_start=True)  # as mentioned in answer. note that shuffle is defaulted to True.
sgd.partial_fit(X, Y, classes = [0, 1])  # first time you need to say what your classes are

for k in range(1000):
    batch_indexs = random.sample(range(2000), 20)
    sgd.partial_fit(X[batch_indexs, :], Y[batch_indexs])
在实践中,您应该仔细研究丢失和准确性,并使用合适的while而不是for,但对读者留下了很多东西; - )

请注意,您可以控制比我所显示的更多(就像迭代的数量等),因此您应该正确阅读@ 987654322的文档@。
另一件事要注意的是,有不同的批处理实践。每次迭代都刚刚拍摄了一个随机的子集,但是一些更喜欢确保数据中的每一点都已被看到相同的次数(例如,随着订单索引或其他东西批量批量批量。

【讨论】:

  • 抱歉缺乏细节,是它特别要知道的吗?我对数据科学(和python)的新新手,但实现SGD是刚写的“> CLF = sgdclassififififir(lock =”log“,dencty =”l2“)> clf.fit(train_set,train_label) “?或者我需要考虑其他任何东西吗?因为通过使用这些代码行,我只会得到相同的错误。 span>
  • 没有任何东西(在我看来)只是“写出这些代码行的问题”。它是关于了解代码行与正确使用什么。对于您的特定点,Sklearn的SGDClassifer是一种选项,使用日志损耗确实将训练逻辑回归分类模型。但为了使用我所描述的迷你批次,您还需要在partial_fit(以及当然所需的循环中)使用@ 987654327。如果这有助于,请告诉我,我将它融入我的答案。 span>
  • 它有意义,所以你应该在答案中融合它。可悲的是,我在编码中的方式太糟糕了,以便能够正确实现它,但感谢您的帮助 span>
  • span>
  • 糟糕。这次示例也有批处理: - ) span>
猜你喜欢
  • 2012-06-27
  • 1970-01-01
  • 2016-02-21
  • 2019-03-05
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多