保存 scikit-learn 分类器会导致内存错误

Posted

技术标签:

【中文标题】保存 scikit-learn 分类器会导致内存错误【英文标题】:Saving scikit-learn classifier causes memory error 【发布时间】:2014-06-28 10:57:44 【问题描述】:

我的机器有 16G RAM,训练程序使用的内存高达 2.6G。 但是当我想将分类器(使用来自大型数据集的sklearn.svm.SVC 训练)保存为泡菜文件时,它会消耗太多我的机器无法提供的内存。渴望知道保存分类器的任何替代方法。

我试过了:

picklecPickle 转储为wwb 设置fast = True

它们都不起作用,总是引发 MemoryError。有时文件已保存,但加载它会导致ValueError: insecure string pickle

提前谢谢你!

更新

谢谢大家。没试过joblib,设置protocol=2后就可以了。

【问题讨论】:

这很奇怪。即使我编写了类似大小的转储文件,我也从未发生过。有趣的是,“偶尔”文件会被存储。既然你有 16G 的 RAM,你可以试试 cPickle.dumps() 看看你实际得到的字符串长度是多少?此外,当您尝试读取尚未关闭的文件时,您会收到“不安全的字符串 pickle”错误。 @hrs 这次我成功保存了文件,大约2G。不知道为什么程序使用超过 50% 的内存来保存它。可能有时内存被其他程序占用,所以没有足够的空间。我会再试一次看看会发生什么。并重新评估insecure string pickle 错误,我使用with 打开文件,实际上该程序在读取之前已关闭。 嗯,好的。 cPickle.dump 将对象复制到字符串中,然后写入文件。这可能是它占用太多内存的原因。 尝试用joblib.dump进行酸洗,它应该比标准的pickle更聪明地处理大型NumPy数组。 @larsmans 我在使用joblib.dump(model,file,compress=3) 时遇到了令人讨厌的 MemoryError。scikit-learn 模型是一个有数千棵树的随机森林。我会尝试compress=2 【参考方案1】:

我建议使用 sci-kit learn 中的核外分类器。这些是批量学习算法,将模型输出存储为压缩的稀疏矩阵,非常省时。

首先,以下链接对我很有帮助。

http://scikit-learn.org/stable/auto_examples/applications/plot_out_of_core_classification.html

【讨论】:

以上是关于保存 scikit-learn 分类器会导致内存错误的主要内容,如果未能解决你的问题,请参考以下文章

迭代器会导致内存泄漏吗?

在 scikit-learn 中将分类器保存到磁盘

Scikit-Learn 逻辑回归内存错误

无法让 NLTK-Trainer 识别/使用 scikit-learn 分类器

如何使用 scikit-learn 对大文本数据进行分类?

SciKit-Learn 标签编码器导致错误“参数必须是字符串或数字”