导入错误:无法从“sklearn.externals”导入名称“joblib”

新手上路,请多包涵

我正在尝试使用 joblibs3 加载我保存的模型—

 import pandas as pd
import numpy as np
import json
import subprocess
import sqlalchemy
from sklearn.externals import joblib

ENV = 'dev'
model_d2v = load_d2v('model_d2v_version_002', ENV)

def load_d2v(fname, env):
    model_name = fname
    if env == 'dev':
        try:
            model=joblib.load(model_name)
        except:
            s3_base_path='s3://sd-flikku/datalake/doc2vec_model'
            path = s3_base_path+'/'+model_name
            command = "aws s3 cp {} {}".format(path,model_name).split()
            print('loading...'+model_name)
            subprocess.call(command)
            model=joblib.load(model_name)
    else:
        s3_base_path='s3://sd-flikku/datalake/doc2vec_model'
        path = s3_base_path+'/'+model_name
        command = "aws s3 cp {} {}".format(path,model_name).split()
        print('loading...'+model_name)
        subprocess.call(command)
        model=joblib.load(model_name)
    return model

但我收到此错误:

     from sklearn.externals import joblib
ImportError: cannot import name 'joblib' from 'sklearn.externals' (C:\Users\prane\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\externals__init__.py)

然后我尝试直接安装 joblib

 import joblib

但它给了我这个错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in load_d2v_from_s3
  File "/home/ec2-user/.local/lib/python3.7/site-packages/joblib/numpy_pickle.py", line 585, in load
    obj = _unpickle(fobj, filename, mmap_mode)
  File "/home/ec2-user/.local/lib/python3.7/site-packages/joblib/numpy_pickle.py", line 504, in _unpickle
    obj = unpickler.load()
  File "/usr/lib64/python3.7/pickle.py", line 1088, in load
    dispatch[key[0]](self)
  File "/usr/lib64/python3.7/pickle.py", line 1376, in load_global
    klass = self.find_class(module, name)
  File "/usr/lib64/python3.7/pickle.py", line 1426, in find_class
    __import__(module, level=0)
ModuleNotFoundError: No module named 'sklearn.externals.joblib'

你能告诉我如何解决这个问题吗?

原文由 Praneeth Sai 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

看起来您现有的 pickle 保存文件 ( model_d2v_version_002 ) 在非标准位置编码了一个参考模块 – joblib 位于 sklearn.externals.joblib -ec5 而不是 783-ec5等级。

当前的 scikit-learn 文档仅讨论顶级 joblib – 例如在 3.4.1 持久性示例 中 – 但我确实 在其他人的旧问题中看到了对 DeprecationWarning 的引用 scikit-learn 版本 0.21 关于旧版本 scikit.external.joblib 变体消失:

Python37\lib\site-packages\sklearn\externals\joblibinit.py:15: DeprecationWarning: sklearn.externals.joblib 已在 0.21 中弃用,并将在 0.23 中删除。请直接从 joblib 导入此功能,可以通过以下方式安装:pip install joblib。如果在加载 pickled 模型时出现此警告,您可能需要使用 scikit-learn 0.21+ 重新序列化这些模型。

“弃用”意味着将某些东西标记为不可依赖,因为它可能会在未来的版本中停止使用(通常但不总是,推荐使用更新的方法来做同样的事情)。

I suspect your model_d2v_version_002 file was saved from an older version of scikit-learn , and you’re now using scikit-learn (aka sklearn ) version 0.23+ 完全删除了 sklearn.external.joblib 变体。因此,您的文件无法直接或轻松地加载到您当前的环境中。

但是,根据 DeprecationWarning ,您可以暂时使用较旧的 scikit-learn 版本以旧方式加载文件一次,然后使用现在首选的方式重新保存它。鉴于警告信息,这可能需要 scikit-learn 版本 0.21.x 或 0.22.x,但如果你确切知道你的 model_d2v_version_002 文件是从哪个版本保存的,我会尝试用那个。步骤大概是:

  • 使用较旧的 sklearn 创建一个临时工作环境(或回滚当前的工作环境)

  • 导入类似的东西:

 import sklearn.external.joblib as extjoblib
import joblib

  • extjoblib.load() 你计划的旧文件,但随后立即重新 joblib.dump() 使用顶层的文件 joblib (您可能希望使用不同的名称,以保留旧文件,以防万一。)

  • 移动/更新到您真实的现代环境,并且仅 import joblib (顶级)使用 joblib.load() - 在您的代码中不再有任何对“sklearn.external.joblib”的引用,或您存储的 pickle 文件。

原文由 gojomo 发布,翻译遵循 CC BY-SA 4.0 许可协议

你应该直接使用

import joblib

代替

from sklearn.externals import joblib

原文由 Smruthi Vuppuluri 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进