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

时间:2019-03-28 13:32:55

标签: python scikit-learn pickle

我想将一条sklearn管道保存到磁盘,其中包括一个自定义的预处理和一个RandomForestClassifier,其中所有依赖项都保存在文件中。如果没有此功能,我必须将所有依赖项(自定义模块)复制到同一文件夹中的所有地方要调用此模型(在我的情况下是在远程服务器上)。

预处理程序在一个类中定义,该类位于项目的同一文件夹中的另一个文件( preprocessing.py )中。因此,我可以通过导入对其进行访问。

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(及其一些变体),莳萝和joblib,但这没有用。当我将.pkl导入其他地方时(例如在我的远程服务器上)。我的架构中必须有一个完全相同的 preprocessing.py ...这很痛苦。

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

import pickle

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

print(model.predict(some_matrix))

但是此代码当前给我一个错误,因为它找不到Preprocessor类...

2 个答案:

答案 0 :(得分:0)

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

我目前正在处理此过程,如果您对此感兴趣,我可以在取得进展时给出详细说明以采取其他措施。

答案 1 :(得分:0)

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

遵循此 post 应该会有所帮助