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

标签 python scikit-learn pickle pyinstaller

我构建了一个 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/

相关文章:

python - root.query_pointer()._data 导致 CPU 使用率高

python - 如何同步Python子进程的输出

python - 索引错误 : too many indices for array while plotting ROC curve with scikit-learn?

python - Python 中的多元线性回归 - MATLAB 中 mvregress 的模拟?

python - pickle 错误: Can't pickle <class 'module' >: attribute lookup module on builtins failed

python - AWS Sagemaker Studio,无法加载pickle文件

python - 删除停用词并标记化搭配bigramfinder NLTK

python - pickle/joblib AttributeError : module '__main__' has no attribute 'thing' in pytest

python - sklearn.preprocessing.normalize 中的范数参数

Python pickle 协议(protocol)选择?