发生异常:取消对象时出现 ModuleNotFoundError(使用 dill 或 pickle 或 joblib)

Exception has occurred: ModuleNotFoundError when unpickling objects (using dill or pickle or joblib)

我已经安装了 sklearn 管道,现在我需要部署它,我已经腌制了我的管道(也尝试了 joblib 和 dill)。当我在具有相同版本的 dill、pickle 和 python 的其他环境中解开它时,出现此错误:

exception has occurred: ModuleNotFoundError
No module named '_regex'
  File "\opt\miniconda\lib\python3.6\site-packages\dill\_dill.py", line 832, in _import_module
  File "\opt\miniconda\lib\python3.6\site-packages\dill\_dill.py", line 305, in load
  File "C:\<edited>\score.py", line 40, in init
  File "C:\<edited>\score.py", line 90, in <module>
  File "\opt\miniconda\lib\python3.6\runpy.py", line 85, in _run_code
  File "\opt\miniconda\lib\python3.6\runpy.py", line 96, in _run_module_code
  File "\opt\miniconda\lib\python3.6\runpy.py", line 263, in run_path
  File "\opt\miniconda\lib\python3.6\runpy.py", line 85, in _run_code
  File "\opt\miniconda\lib\python3.6\runpy.py", line 193, in _run_module_as_main

我不清楚是什么原因造成的。我可以在我的本地环境中解开文件,但不知何故不能在目标环境中解开文件。

import dill as pickle
pickle._dill._reverse_typemap['ClassType'] = type

with open(prep_transformer_path, 'rb') as file:
    prep_transformer = pickle.loads(file)

这基本上是导致生活中 unpickling 方面错误的代码。任何线索我可能会忽略什么?由于我在此之前解决的另一个问题,我确实添加了类型映射。

它正在腌制一打自产的变形金刚 类。

酸洗代码如下:

import dill as pickle

# Dump the prep pkl file
with open(os.path.join(output_models_directory, 'prep.pkl'), 'wb') as file:
    pickle.dump(trainingPrepPipe, file, protocol=pickle.HIGHEST_PROTOCOL)

提前感谢您的帮助!

我在保存管道时遇到了类似的问题(使用 sklearn.joblib)。事实证明,joblib 不存储您的管道使用的任何代码。在我的例子中,通过确保在生产中,管道 and/or 分类器中使用的所有 python 模块都可用并且相对于管道创建模块位于相同位置,问题得到了解决。

对我来说,这意味着复制和保存 my_transformers.py 以及管道和分类器作业库。然后当 using/installing 将它们投入生产时,将 my_transformers.py 放置在相对于创建我的管道的模块的相同位置。