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

Pra*_*Sai 66 amazon-web-services python-3.x joblib doc2vec

我正在尝试使用 joblib 从 s3 加载我保存的模型

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
Run Code Online (Sandbox Code Playgroud)

但我正面临这个错误:

    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)
Run Code Online (Sandbox Code Playgroud)

然后我尝试通过执行直接安装joblib

import joblib
Run Code Online (Sandbox Code Playgroud)

但它给了我这个错误

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'
Run Code Online (Sandbox Code Playgroud)

你能告诉我如何解决这个问题吗?提前致谢

小智 104

你可以直接使用

import joblib

代替

from sklearn.externals import joblib.

我试过了,对我来说效果很好

  • ModuleNotFoundError:没有名为“sklearn.externals.joblib”的模块 (4认同)

goj*_*omo 51

看起来您现有的 pickle 保存文件 ( model_d2v_version_002) 在非标准位置对参考模块进行编码 -joblib位于sklearn.externals.joblib而不是顶级位置。

当前scikit-learn文档只谈论一个顶层joblib-例如,在3.4.1持久性例子-但是我确实看到了在别人引用别人的老问题到DeprecationWarningscikit-learn0.21版本有关的旧scikit.external.joblib变种消失:

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

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

我怀疑你的model_d2v_version_002文件是从旧版本的保存scikit-learn,现在你正在使用scikit-learn(又名sklearn)0.23+版本,这完全清除的sklearn.external.joblib变化。因此,您的文件无法直接或轻松加载到当前环境中。

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

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

  • 做进口类似的事情:

import sklearn.external.joblib as extjoblib
import joblib
Run Code Online (Sandbox Code Playgroud)
  • extjoblib.load()按照您的计划,您的旧文件,但随后立即joblib.dump()使用顶级joblib. (您可能希望使用不同的名称,以保留旧文件,以防万一。)

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


Ole*_*oha 11

您可以joblib通过将其安装为依赖项并使用来直接导入import joblib

文档


小智 5

也许你的代码已经过时了。对于任何打算fetch_mldata在数字手写项目中使用的人,你应该fetch_openml改为。(链接

在旧版本的 sklearn 中:

from sklearn.externals import joblib
mnist = fetch_mldata('MNIST original')
Run Code Online (Sandbox Code Playgroud)

sklearn 0.23(稳定版)中:

import sklearn.externals
import joblib
    
dataset = datasets.fetch_openml("mnist_784")

features = np.array(dataset.data, 'int16')
labels = np.array(dataset.target, 'int')
Run Code Online (Sandbox Code Playgroud)

有关弃用的更多信息,fetch_mldata请参阅 scikit-learn文档


小智 5

下面的答案都不适合我,只需稍加修改,这个修改对我来说就可以了

import sklearn.externals as extjoblib
import joblib
Run Code Online (Sandbox Code Playgroud)