gpt4 book ai didi

Scikit-Learn 逻辑回归内存错误

转载 作者:行者123 更新时间:2023-12-04 09:26:41 26 4
gpt4 key购买 nike

我正在尝试使用 sklearn 0.11 的 LogisticRegression 对象来拟合具有大约 80,000 个特征的 200,000 个观察值的模型。目标是将短文本描述分为 800 个类别中的 1 个。

当我尝试拟合分类器时,pythonw.exe 给了我:

应用程序错误“指令在...引用内存在 0x00000000”。无法写入内存”。

这些特征非常稀疏,每次观察大约 10 个,并且是二进制的(1 或 0),所以根据我的信封计算,我的 4 GB RAM 应该能够处理内存需求,但这似乎并没有是这样。只有当我使用较少的观察和/或较少的特征时,模型才适合。

如果有的话,我想使用更多的观察和功能。我天真的理解是,在幕后运行的 liblinear 库能够支持这一点。有什么想法可以让我多加一些观察结果吗?

我的代码如下所示:

y_vectorizer = LabelVectorizer(y) # my custom vectorizer for labels
y = y_vectorizer.fit_transform(y)

x_vectorizer = CountVectorizer(binary = True, analyzer = features)
x = x_vectorizer.fit_transform(x)

clf = LogisticRegression()
clf.fit(x, y)

我传递给分析器的 features() 函数只返回一个字符串列表,指示在每个观察中检测到的特征。

我使用的是 Python 2.7、sklearn 0.11、带有 4 GB RAM 的 Windows XP。

最佳答案

liblinear( sklearn.linear_model.LogisticRegression 的支持实现)将托管自己的数据副本,因为它是一个 C++ 库,其内部内存布局不能直接映射到 scipy 中预先分配的稀疏矩阵,例如 scipy.sparse.csr_matrixscipy.sparse.csc_matrix .

在您的情况下,我建议将您的数据加载为 scipy.sparse.csr_matrix并将其提供给 sklearn.linear_model.SGDClassifier (如果您想要逻辑回归模型和调用 loss='log' 方法的能力,则使用 predict_proba)。 SGDClassifier如果已经在使用 scipy.sparse.csr_matrix,则不会复制输入数据内存布局。

期望它在内存中分配 800 * (80000 + 1) * 8/(1024 ** 2) = 488MB 的密集模型(除了输入数据集的大小)。

编辑:如何优化数据集的内存访问

要在数据集提取后释放内存,您可以:

x_vectorizer = CountVectorizer(binary = True, analyzer = features)
x = x_vectorizer.fit_transform(x)
from sklearn.externals import joblib
joblib.dump(x.tocsr(), 'dataset.joblib')

然后退出这个python进程(强制完成内存释放)并在一个新进程中:
x_csr = joblib.load('dataset.joblib')

在 linux/OSX 下,您可以通过以下方式更有效地进行内存映射:
x_csr = joblib.load('dataset.joblib', mmap_mode='c')

关于Scikit-Learn 逻辑回归内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11195395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com