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

Posted

技术标签:

【中文标题】ImportError:无法从“sklearn.externals”导入名称“joblib”【英文标题】:ImportError: cannot import name 'joblib' from 'sklearn.externals' 【发布时间】:2020-09-05 16:12:55 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

你应该直接使用

import joblib

而不是

from sklearn.externals import joblib

【讨论】:

ModuleNotFoundError: No module named 'sklearn.externals.joblib'【参考方案2】:

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

当前的scikit-learn 文档只讨论***joblib - 例如在3.4.1 Persistence example - 但我确实看到reference in someone else's old issue to a DeprecationWarning 在scikit-learn 版本0.21 中关于旧的scikit.external.joblib 变体消失:

Python37\lib\site-packages\sklearn\externals\joblib_init_.py:15: 弃用警告: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-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() 文件。 (您可能希望使用不同的名称来保留旧文件,以防万一。)

移动/更新到您真实的现代环境,并且只有import joblib(***)才能使用joblib.load() - 在您的代码中不再有任何对“sklearn.external.joblib”的引用,或者您存储的泡菜文件。

【讨论】:

【参考方案3】:

您可以直接导入joblib,方法是将其安装为依赖项并使用import joblib

Documentation.

【讨论】:

我尝试直接安装 joblib,但它给了我 ModuleNotFoundError: No module named 'sklearn.externals.joblib' 你事先用pip安装了吗? joblib 是 Anaconda 的一部分,这对我有用。【参考方案4】:

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

在旧版本的 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

【讨论】:

【参考方案5】:

出现错误时:

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

对于新版本,请关注:

    conda install -c anaconda scikit-learn(使用“Anaconda Promt”安装) 导入作业库(Jupyter Notebook)

【讨论】:

【参考方案6】:

如果对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 版本。

【讨论】:

【参考方案7】:

对于这个错误,我不得不直接使用以下内容,它就像一个魅力:

import joblib

简单

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于ImportError:无法从“sklearn.externals”导入名称“joblib”的主要内容,如果未能解决你的问题,请参考以下文章

python aiorpc:“ImportError:无法从'aiorpc.server'导入名称'RPCServer'”

ImportError:无法从“变压器”导入名称“AutoModelWithLMHead”

ImportError:无法从“matplotlib.mlab”导入名称“PCA”

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

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

ImportError:无法从“google.cloud”(未知位置)导入名称“bigquery”