ImportError: cannot import name 'joblib' from 'sklearn.externals'

ImportError: cannot import name 'joblib' from 'sklearn.externals'

我正在尝试使用 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

但是我得到这个错误:

    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'

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

您可以通过将 joblib 作为依赖项安装并使用 import joblib

直接导入 joblib

Documentation.

您现有的 pickle 保存文件 (model_d2v_version_002) 似乎在非标准位置对参考模块进行了编码 – joblib 位于 sklearn.externals.joblib 而不是顶层.

当前的 scikit-learn 文档只讨论了顶级 joblib – 例如在 scikit-learn 版本 0.21 的 3.4.1 Persistence example – but I do see a reference in someone else's old issue to a DeprecationWarning 中关于旧的 scikit.external.joblib 变体离开:

Python37\lib\site-packages\sklearn\externals\joblib_init_.py:15: DeprecationWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+.

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

我怀疑你的 model_d2v_version_002 文件是从旧版本的 scikit-learn 保存的,而你现在使用的是 scikit-learn(又名 sklearn)版本 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 重新 joblib.dump() 文件。 (您可能想使用不同的名称,以保留旧文件,以防万一。)

  • move/update 到真实的现代环境,只有 import joblib(顶级)才能使用 joblib.load() - 不再有任何对 `[= 的引用69=]' 在您的代码或存储的 pickle 文件中。

你应该直接使用

import joblib

而不是

from sklearn.externals import joblib

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

在旧版本的 sklearn 中:

from sklearn.externals import joblib
mnist = fetch_mldata('MNIST original')

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')

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

如果对 joblib 的执行/调用是在另一个 .py 程序而不是你自己的程序中(在这种情况下,即使你已经安装了 joblib,它仍然会在调用 python 程序中导致错误,除非你更改代码,我认为会很乱),我试图创建一个硬链接:

(windows版本)

Python> 导入作业库

然后在你的 sklearn 路径中 >......\Lib\site-packages\sklearn\externals

mklink /J ./joblib .....\Lib\site-packages\joblib

(您可以在 Python juptyter notebook 中使用 ! 或 %、!mklink ......或 %mklink ......来计算上述内容,或使用 python OS 命令...)

这有效地在“externals”文件夹中创建了一个 joblib 的虚拟文件夹

备注: 当然,为了更具版本弹性,您的代码必须事先再次检查 sklearn 的版本 >= 0.23。

这可以替代更改 sklearn 版本。

出现错误时:

from sklearn.externals import joblib 它弃用了旧版本。

对于新版本,请遵循:

  1. conda install -c anaconda scikit-learn(使用“Anaconda Promt”安装)
  2. 导入作业库(Jupyter 笔记本)

经过长时间的调查,根据我的计算机设置,我发现这是因为下载数据集需要 SSL 证书。

对于这个错误,我不得不直接使用以下命令,它的效果非常好:

import joblib

简单

none 下面的答案对我有用,稍微改动一下这个修改对我来说没问题

import sklearn.externals as extjoblib
import joblib