如何保存大型 sklearn RandomForestRegressor 模型进行推理
Posted
技术标签:
【中文标题】如何保存大型 sklearn RandomForestRegressor 模型进行推理【英文标题】:How to save large sklearn RandomForestRegressor model for inference 【发布时间】:2021-04-26 07:14:36 【问题描述】:我在 19GB 的训练数据上训练了一个 Sklearn RandomForestRegressor 模型。我想将它保存到磁盘以便以后使用它进行推理。正如在另一个 *** 问题中所推荐的那样,我尝试了以下方法:
泡菜pickle.dump(model, open(filename, 'wb'))
模型已成功保存。它在磁盘上的大小是 1.9 GB。
loaded_model = pickle.load(open(filename, 'rb'))
加载模型导致 MemorError(尽管有 16 GB RAM)
cPickle - 结果与 Pickle 相同 作业库joblib.dump(est, 'random_forest.joblib' compress=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 或其他格式?
【问题讨论】:
【参考方案1】:尝试使用joblib.dump()
在此方法中,您可以使用参数“compress”。此参数接受 0 到 9 之间的整数值,值越高,文件压缩得越多。理想情况下,压缩值 3 就足够了。
唯一的缺点是压缩值越高写入/读取速度越慢!
【讨论】:
嗨。谢谢您的答复。我已经尝试使用 compress=3 的 joblib.dump()。不幸的是,与pickle类似,RAM中的对象大小比其磁盘大小大一个数量级,因此我在使用joblib加载时遇到了MemoryError。【参考方案2】:随机森林模型的大小并不严格取决于您训练它的数据集的大小。相反,您可以在Random Forest classifier documentation 上看到其他参数,这些参数控制模型可以增长到多大。参数如:
n_estimators
- 树的数量
max_depth
- 每棵树有多“高”
min_samples_split
和 min_samples_leaf
- 允许树中的节点分裂/继续分裂的样本数
如果您使用大量估计器、较大的最大深度和非常低的叶/分割样本来训练您的模型,那么您得到的模型可能会很大 - 这就是您遇到内存问题的地方。
在这些情况下,我经常发现训练较小的模型(通过控制这些参数)——只要它不破坏性能指标——就可以解决这个问题,然后你可以求助于 joblib或您提到的保存/加载模型的其他解决方案。
【讨论】:
以上是关于如何保存大型 sklearn RandomForestRegressor 模型进行推理的主要内容,如果未能解决你的问题,请参考以下文章