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

Posted

技术标签:

【中文标题】如何将具有文件外依赖项的 sklearn 模型保存到磁盘?【英文标题】:How to save to disk an sklearn model with its out-of-file dependencies? 【发布时间】:2019-08-19 07:15:20 【问题描述】:

我想将包含自定义预处理和 RandomForestClassifier 的 sklearn 管道保存到磁盘,其中所有依赖项都包含在保存的文件中。如果没有此功能,我必须将所有依赖项(自定义模块)复制到同一文件夹中的任何地方想要调用这个模型(在我的情况下是在远程服务器上)。 预处理器在一个类中定义,该类位于我项目同一文件夹中的另一个文件 (preprocessing.py) 中。所以我可以通过 import 访问它。

training.py

from preprocessing import Preprocessor

from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
import pickle

clf = Pipeline([
("preprocessing", Preprocessor()),
("model", RandomForestClassifier())
])

# some fitting of the classifier
# ...

# Export
with open(savepath, "wb") as handle:
    pickle.dump(clf, handle, protocol=pickle.HIGHEST_PROTOCOL)

我尝试了 pickle(以及它的一些变体)、dill 和 joblib,但没有奏效。当我将 .pkl 导入其他地方时(比如在我的远程服务器上)。我必须在架构中有一个相同的 preprocessing.py ......这很痛苦。

我希望在其他地方有另一个文件:remote.py

import pickle

with open(savepath, "rb") as handle:
     model = pickle.load(handle)

print(model.predict(some_matrix))

但是这段代码目前给了我一个错误,因为它没有找到预处理器类...

【问题讨论】:

【参考方案1】:

我不确定您使用的是什么工具,但是 mlflow 有一个功能可以解决这个问题issue,它几乎可以将所有依赖文件保存为一个包,并且在部署模型时它会随之完成及其所有依赖项

遵循post 应该会有所帮助

【讨论】:

【参考方案2】:

我现在面临同样的问题。 为了解决同样的问题,我将使用设置工具将我的管道/模型及其所有依赖项(预处理类)转换为 Python 模块,以便它是独立的并且可以在任何地方运行(远程服务器/docker 容器/VM。

我目前正在执行此过程,如果您对此感兴趣,我可以在我取得进展时提供详细说明的其他步骤。

【讨论】:

以上是关于如何将具有文件外依赖项的 sklearn 模型保存到磁盘?的主要内容,如果未能解决你的问题,请参考以下文章

如何存储 sklearn RF 模型以使其具有最快的加载时间?

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

如何创建具有基本依赖项的 deb 包?

MySQL:在具有多个外键依赖项的表上进行更新

使用 jBPM 单 zip 分发,如何将具有依赖项的大 jar 上传到 Artifacts?

在 Gradle 中,如何生成具有解析为实际使用版本的动态依赖项的 POM 文件?