如何保存大型 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_splitmin_samples_leaf - 允许树中的节点分裂/继续分裂的样本数

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

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

【讨论】:

以上是关于如何保存大型 sklearn RandomForestRegressor 模型进行推理的主要内容,如果未能解决你的问题,请参考以下文章

将大型 csv 转换为稀疏矩阵以在 sklearn 中使用

sklearn如何使用保存的模型来预测新数据

如何将具有文件外依赖项的 sklearn 模型保存到磁盘?

mlflow 如何使用自定义转换器保存 sklearn 管道?

如何保存 sklearn 管道/特征转换器

使用 sklearn 对大型稀疏矩阵执行 PCA