保存 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
训练)保存为泡菜文件时,它会消耗太多我的机器无法提供的内存。渴望知道保存分类器的任何替代方法。
我试过了:
pickle
和 cPickle
转储为w
或wb
设置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 分类器会导致内存错误的主要内容,如果未能解决你的问题,请参考以下文章