如何将具有文件外依赖项的 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 模型以使其具有最快的加载时间?