保留(pickle)自定义sklearn管道的推荐方法是什么?

时间:2017-10-31 16:24:18

标签: python scikit-learn pickle pyinstaller

我构建了一个sklearn pipeline,它将标准的支持向量回归组件与一些创建功能的自定义变换器相结合。然后将该管道放入一个经过训练然后进行酸洗的对象(this seems to be the recommended way)。 unpickled对象用于进行预测。

要进行分发,会将其转换为pyinstaller的可执行文件。

当我从单元测试中调用unpickled回归对象时,它工作正常。

但是,当我尝试使用PyInstaller二进制文件进行预测时,我会得到一个以{}结尾的长stack trace

module = loader.load_module(fullname)   File "messagestream.pxd", line 5, in init scipy.optimize._trlib._trlib ImportError: No module named 'scipy._lib.messagestream'

这感觉就像某种酸洗错误,可能是由于酸洗与pyinstaller的相互作用。我如何重构我的代码,以便我的自定义管道在打开后像标准sklearn回归程序一样容易和强大地运行?

2 个答案:

答案 0 :(得分:8)

好吧,经过一些谷歌搜索似乎是根本原因不是酸洗的情况,它只是一个pyinstaller“隐藏的进口”问题,但由于某种原因它只在酸洗时出现(不要问我为什么)。

以下内容为我解决了当前问题:编辑.spec文件以使用Scipy添加以下隐藏导入:

 hiddenimports=['scipy._lib.messagestream']

我还需要一些与其他库相关的其他隐藏导入

 hiddenimports=['sklearn.neighbors.typedefs',
                'scipy._lib.messagestream',
                'pandas._libs.tslibs.timedeltas'   ]

答案 1 :(得分:0)

如果有人只想通过CLI参数而不是通过Roko的答案中的.spec文件来执行此操作,则语法如下:

pyinstaller --hidden-import scipy._lib.messagestream --onefile your_python_file_here.py