我构建了一个 sklearn pipeline它结合了标准支持向量回归组件和一些创建特征的自定义转换器。然后将此管道放入一个经过训练然后 pickle 的对象中(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'
这感觉像是某种 pickle 错误,可能是由于 pickle 与 pyinstaller 的相互作用。我如何重构我的代码,以便我的自定义管道在 unpickling 后像标准的 sklearn 回归器一样轻松和稳健地运行?
最佳答案
好吧,经过一番谷歌搜索后,根本原因似乎不是 pickling,这只是一个 pyinstaller“隐藏的导入”问题,但出于某种原因,它只在 pickling 时出现(别问我为什么)。
以下解决了我的直接问题:编辑 .spec
文件以使用 Scipy
添加以下隐藏导入:
hiddenimports=['scipy._lib.messagestream']
我还需要一些与其他库相关的其他隐藏导入
hiddenimports=['sklearn.neighbors.typedefs',
'scipy._lib.messagestream',
'pandas._libs.tslibs.timedeltas' ]
关于python - 保留(pickle)自定义 sklearn 管道的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47040099/