Scikit-Learn Logistic回归内存错误

Ale*_*ure 7 scikit-learn

我正在尝试使用sklearn 0.11的LogisticRegression对象来拟合200,000个观测值的模型,其中包含大约80,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)
Run Code Online (Sandbox Code Playgroud)

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

我使用的是Python 2.7,sklearn 0.11,Windows XP和4 GB的RAM.

ogr*_*sel 22

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

在您的情况下,我建议您将数据加载为a 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')
Run Code Online (Sandbox Code Playgroud)

然后退出这个python进程(强制完成内存释放)并在一个新进程中:

x_csr = joblib.load('dataset.joblib')
Run Code Online (Sandbox Code Playgroud)

在linux/OSX下,您可以使用以下内容更有效地进行内存映射:

x_csr = joblib.load('dataset.joblib', mmap_mode='c')
Run Code Online (Sandbox Code Playgroud)

  • 优秀的答案,你提供更好的支持这个免费软件比其他人提供非常昂贵的软件,世界欠你许多谢谢.尽管如此,SGDClassifier的predict_proba方法似乎只针对2类别分类任务实施. (3认同)