【问题标题】:Saving scikit-learn classifier causes memory error保存 scikit-learn 分类器会导致内存错误
【发布时间】: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

标签: python python-2.7 scikit-learn pickle


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 2018-02-15
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2012-06-27
    • 2016-06-28
    相关资源
    最近更新 更多