使用逻辑回归时的内存错误

时间:2018-12-05 06:52:03

标签: python logistic-regression

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

我要使用的代码是

document
.querySelectorAll("[class^=fontColor]")
.forEach(x => {
  x.style.color = "#"+x.classList[0].replace(/^fontColor_/,"")
})

以下是错误

  

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

     

....

     

返回数组(a,dtype,copy = False,order = order)   MemoryError

1 个答案:

答案 0 :(得分:0)

您还没有提供足够的细节来真正理解问题或给出确切的答案,但是我希望有一些选择对您有所帮助:

  1. 可用内存量可能是可配置的。
  2. 同时训练 all 数据会在许多情况下引发OOM问题,这就是为什么通常的做法是通过对批次进行训练来使用SGD(随机梯度下降),即仅引入每次迭代都获得数据的子集,并从随机意义上获得全局优化解决方案。如果我猜对了,那么您使用的是sklearn.linear_model.LogisticRegression,它具有不同的“求解器”。也许saga求解器会更好地处理您的情况。
  3. 还有其他实现,其中某些确实具有以高度可配置的方式内置的批处理选项。而且,如果情况变得更糟,则实现逻辑回归模型非常简单,那么您可以轻松地批量生产。

编辑(由于评论中的讨论):
这是一种实用的解决方法,其中有一个非常简单(容易)的示例-

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,但还有很多留给读者;-)

请注意,您可以控制的内容比我已经显示的要多(例如迭代次数等),因此您应该正确阅读SGDClassifier的文档。
要注意的另一件事是,有不同的批处理方法。我只是在每次迭代中随机抽取一个子集,但是有些人更喜欢确保数据中的每个点都被看到了相同的时间(例如,将数据混洗,然后对订单索引进行批处理等)。