0

我在 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.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 或其他格式?

4

2 回答 2

1

尝试使用joblib.dump()

在这种方法中,您可以使用参数“compress”。此参数接受 0 到 9 之间的整数值,值越高,文件压缩得越多。理想情况下,压缩值 3 就足够了。

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

于 2021-01-21T19:56:48.073 回答
0

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

  • n_estimators- 树的数量
  • max_depth- 每棵树能有多“高”
  • min_samples_splitmin_samples_leaf- 允许树中的节点分裂/继续分裂的样本数

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

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

于 2021-02-26T23:02:51.287 回答