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

Python 使用逻辑回归时的内存错误,python,logistic-regression,Python,Logistic Regression,我有一个形状为57159x924的数组,我将使用它作为训练数据。这924列中有896列是要素和其余标签。我想在这个问题上使用逻辑回归,但是当我使用逻辑回归的拟合函数时,我得到了一个记忆错误。我想这是因为我的电脑内存处理的数据太多了。有没有办法解决这个问题 我想使用的代码是 lr = LogisticRegression(random_state=1) lr.fit(train_set, train_label) lr.predict_proba(x_test) 下面是错误 第21行,总机 lr

我有一个形状为57159x924的数组,我将使用它作为训练数据。这924列中有896列是要素和其余标签。我想在这个问题上使用逻辑回归,但是当我使用逻辑回归的拟合函数时,我得到了一个记忆错误。我想这是因为我的电脑内存处理的数据太多了。有没有办法解决这个问题

我想使用的代码是

lr = LogisticRegression(random_state=1)
lr.fit(train_set, train_label)
lr.predict_proba(x_test)
下面是错误

第21行,总机 lr.配合(列车组、列车标签)

返回数组(a,数据类型,copy=False,order=order) 记忆者


您没有提供足够的详细信息来真正理解问题或给出明确的答案,但以下是一些我希望能有所帮助的选项:

  • 可用内存量可能是可配置的
  • 同时对所有数据进行训练会在许多情况下引发OOM问题,这就是为什么通常的做法是通过成批训练使用SGD(随机梯度下降),即每次迭代只引入数据子集,并获得随机意义下的全局优化解。如果我猜对了,您使用的是,它有不同的“解算器”。也许
    saga
    解算器会更好地处理您的情况
  • 还有其他的实现,其中一些肯定以高度可配置的方式内置了批处理选项。如果出现最坏的情况,实现逻辑回归模型是相当简单的,然后您可以轻松地批处理
    编辑(由于评论中的讨论):
    这里有一个实用的方法,用一个非常简单的例子-

    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
    ,但这要留给读者;-)

    请注意,您可以控制比我显示的更多的内容(如迭代次数等),因此您应该正确阅读的文档。

    另一件需要注意的事情是,有不同的批处理实践。我只是在每次迭代中取一个随机子集,但有些人更喜欢确保数据中的每个点都被看到了相同的次数(例如,洗牌数据,然后按顺序索引或其他方式进行批处理)。

    您没有给出足够的细节来真正理解问题或给出明确的答案,但我希望以下几个选项会有所帮助:

  • 可用内存量可能是可配置的
  • 同时对所有数据进行训练会在许多情况下引发OOM问题,这就是为什么通常的做法是通过成批训练使用SGD(随机梯度下降),即每次迭代只引入数据子集,并获得随机意义下的全局优化解。如果我猜对了,您使用的是,它有不同的“解算器”。也许
    saga
    解算器会更好地处理您的情况
  • 还有其他的实现,其中一些肯定以高度可配置的方式内置了批处理选项。如果出现最坏的情况,实现逻辑回归模型是相当简单的,然后您可以轻松地批处理
    编辑(由于评论中的讨论):
    这里有一个实用的方法,用一个非常简单的例子-

    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
    ,但这要留给读者;-)

    请注意,您可以控制比我显示的更多的内容(如迭代次数等),因此您应该正确阅读的文档。

    另一件需要注意的事情是,有不同的批处理实践。我只是在每次迭代中取一个随机子集,但有些人更喜欢确保数据中的每个点都被看到了相同的次数(例如,洗牌数据,然后按顺序索引或其他方式进行批处理)。

    欢迎使用!如果代码是独立的,那么任何愿意运行它并立即尝试调试它的人都会很有帮助。你能提供这样一个例子吗()?@Sophos数据集很遗憾不是公开的,但是拥有所有的代码会有帮助吗?到目前为止,我所做的唯一一件事就是打开文件并将其划分为test/train,因此它非常基本!如果代码是独立的,那么任何愿意运行它并立即尝试调试它的人都会很有帮助。你能提供这样一个例子吗()?@Sophos数据集很遗憾不是公开的,但是拥有所有的代码会有帮助吗?到目前为止,我所做的唯一一件事就是打开文件并将其划分为test/train,因此,由于缺乏详细信息,这是非常令人担忧的,您有什么特别想知道的吗?我对数据科学(和python)很陌生,但要实现SGD,是不是只需要编写“>clf=sgdclassizer(loss=“log”,pould=“l2”)>clf.fit(train\u set,train\u label)”?或者我还需要考虑其他事情吗?因为通过使用这些代码行,我只得到了相同的错误。在我看来,没有什么是“编写这些代码行的问题”。这是关于理解代码行的作用并正确使用它们。就您的具体情况而言,sklearn的SGDClassifer是一种选择,使用log loss确实可以训练逻辑回归分类模型。但是为了使用我描述的小批量,您需要使用
    warm\u start=True
    ,以及
    partial\u fit
    (当然还有必要的循环)。如果这有帮助,让我知道,我会把它整合到我的答案中。这是有意义的,所以你应该把它整合到你的答案中。可悲的是,我在编码方面太差了,无法正确地实现它,但是感谢您的帮助,并用一个简单的示例进行了更新。这一次,示例也有批:-)很抱歉,缺少详细信息,有吗