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

Rok*_*jic 7 python pickle pyinstaller scikit-learn

我已经构建了一个sklearn管道,它将标准支持向量回归组件与一些创建功能的自定义变换器相结合.然后将该管道放入一个经过训练然后腌制的物体中(这似乎是推荐的方式).unpickled对象用于进行预测.

对于分发,这将变为带有pyinstaller的可执行文件.

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

但是,当我尝试使用PyInstaller二进制文件进行预测时,我得到一个以下结尾的长堆栈跟踪:

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

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

Rok*_*jic 9

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

以下解决了我的直接问题:编辑.spec文件以添加以下隐藏导入Scipy:

 hiddenimports=['scipy._lib.messagestream']
Run Code Online (Sandbox Code Playgroud)

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

 hiddenimports=['sklearn.neighbors.typedefs',
                'scipy._lib.messagestream',
                'pandas._libs.tslibs.timedeltas'   ]
Run Code Online (Sandbox Code Playgroud)