如何保存大型sklearn RandomForestRegressor模型进行推理



我在19GB训练数据上训练了一个Sklearn RandomForestRegressor模型。我想把它保存到磁盘上,以便以后使用它进行推理。根据另一个stackoverflow问题的建议,我尝试了以下方法:

  • 泡菜
pickle.dump(model, open(filename, 'wb'))

模型保存成功。磁盘大小为1.9 GB

loaded_model = pickle.load(open(filename, 'rb'))

加载模型导致MemorError(尽管有16 GB RAM)

  • cPickle -与Pickle
  • 结果相同
  • Joblib

joblib。转储(美国东部时间,"random_forest。joblib '压缩= 3)

它在加载文件时也以MemoryError结束。

  • 偷窃狂
d = klepto.archives.dir_archive('sklearn_models', cached=True, serialized=True)
d['sklearn_random_forest'] = est
d.dump()

创建了Arhcive,但是当我想使用以下代码加载它时,我得到KeyError: 'sklearn_random_forest'

d = klepto.archives.dir_archive('sklearn_models', cached=True, serialized=True)
d.load(model_params)
est = d[model_params]

我尝试使用相同的代码保存字典对象,它工作了,所以代码是正确的。显然,Klepto无法保存sklearn模型。我尝试了缓存和序列化的参数,但没有帮助。

任何提示如何处理这个将是非常感激的。是否有可能将模型保存为JSON, XML,也许是HDFS,或者其他格式?

尝试使用joblib.dump()

在此方法中,您可以使用参数";compress&;"。该参数接受0到9之间的整型值,值越大,文件被压缩的程度越高。理想情况下,压缩值为3就足够了。

唯一的缺点是压缩值越高,写/读速度越慢!

随机森林模型的大小并不严格依赖于你训练它的数据集的大小。相反,您可以在Random Forest分类器文档中看到其他参数,这些参数控制模型可以增长到多大。参数:

  • n_estimators-树木数量
  • max_depth- how "tall"每棵树都可以得到
  • min_samples_splitmin_samples_leaf—允许树中节点分裂/继续分裂的样本数

如果你用大量的估计器、较大的最大深度和非常低的叶子/分割样本来训练你的模型,那么你得到的模型可能是巨大的——这就是你遇到内存问题的地方。

在这些情况下,我经常发现训练较小的模型(通过控制这些参数)——只要它不破坏性能指标——将解决这个问题,然后您可以依靠joblib或您提到的其他解决方案来保存/加载您的模型。

最新更新