Python 使用逻辑回归时的内存错误
我有一个形状为57159x924的数组,我将使用它作为训练数据。这924列中有896列是要素和其余标签。我想在这个问题上使用逻辑回归,但是当我使用逻辑回归的拟合函数时,我得到了一个记忆错误。我想这是因为我的电脑内存处理的数据太多了。有没有办法解决这个问题 我想使用的代码是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
lr = LogisticRegression(random_state=1)
lr.fit(train_set, train_label)
lr.predict_proba(x_test)
下面是错误
第21行,总机
lr.配合(列车组、列车标签)
返回数组(a,数据类型,copy=False,order=order)
记忆者
您没有提供足够的详细信息来真正理解问题或给出明确的答案,但以下是一些我希望能有所帮助的选项:
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
,但这要留给读者;-)
请注意,您可以控制比我显示的更多的内容(如迭代次数等),因此您应该正确阅读的文档。另一件需要注意的事情是,有不同的批处理实践。我只是在每次迭代中取一个随机子集,但有些人更喜欢确保数据中的每个点都被看到了相同的次数(例如,洗牌数据,然后按顺序索引或其他方式进行批处理)。您没有给出足够的细节来真正理解问题或给出明确的答案,但我希望以下几个选项会有所帮助:
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
(当然还有必要的循环)。如果这有帮助,让我知道,我会把它整合到我的答案中。这是有意义的,所以你应该把它整合到你的答案中。可悲的是,我在编码方面太差了,无法正确地实现它,但是感谢您的帮助,并用一个简单的示例进行了更新。这一次,示例也有批:-)很抱歉,缺少详细信息,有吗