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

时间:2020-05-19 14:36:23

标签: python-3.x amazon-web-services 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

但是我遇到了这个错误:

    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'

您能告诉我如何解决吗?预先感谢

13 个答案:

答案 0 :(得分:33)

您可以直接使用

const selectContainer = document.querySelector('select'); const selectChildren = selectContainer.querySelectorAll('option'); const pattern = /.*\((\d+)\skm\).*/; const sorted = [...selectChildren].sort((a, b) => { const _a = parseInt(a.innerText.match(pattern)[1]); const _b = parseInt(b.innerText.match(pattern)[1]); return _a < _b ? -1 : 1; }); sorted.forEach(child => selectContainer.append(child));

代替

import joblib

我尝试了一下,对我来说很好

答案 1 :(得分:29)

您现有的泡菜保存文件(model_d2v_version_002)似乎在非标准位置(位于joblib而非顶层的sklearn.externals.joblib编码参考模块)。

当前的scikit-learn文档仅讨论顶级joblib(例如,在3.4.1 Persistence example中),但是我确实在scikit-learn 0.21版中看到了reference in someone else's old issue to a DeprecationWarning即将淘汰的旧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

  • 创建一个临时工作环境(或回滚您当前的工作环境)
  • do导入类似的内容:

import sklearn.external.joblib as extjoblib
import joblib
  • extjoblib.load()按照您的计划,但是要立即使用顶级joblib.dump()重新{joblib。 (您可能希望使用一个不同的名称,以保留较旧的文件,以防万一。)

  • 移动/更新到您真实的现代环境,只有import joblib(顶级)才能使用joblib.load()-在任何一个中都不再引用任何sklearn.external.joblib您的代码或存储的泡菜文件。

答案 2 :(得分:5)

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

https://joblib.readthedocs.io/en/latest/

答案 3 :(得分:3)

也许您的代码已过时。对于打算在数字手写项目中使用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

答案 4 :(得分:3)

直接导入就可以了。

import joblib

答案 5 :(得分:2)

我试图直接导入joblib及其对我的工作,如下所示。

导入joblib

答案 6 :(得分:1)

您可以直接导入joblib,而不是从sklearn.externals导入joblib ... 它的作品

答案 7 :(得分:1)

如果对joblib的执行/调用位于另一个.py程序而不是您自己的程序中(在这种情况下,即使您已经安装了joblib,除非您更改代码,否则它仍会在调用python程序内引起错误。太乱了),我试图创建一个硬链接:

(Windows版本)

Python>导入joblib

然后在您的sklearn路径内> ...... \ Lib \ site-packages \ sklearn \ externals

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

(您可以在Python juptyter笔记本中使用!或%、! mklink .......或%mklink ......来完成上述工作,或者使用python OS命令...)< / p>

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

备注: 当然,要使版本更具弹性,您的代码必须在手之前再次检查sklearn的版本是否> = 0.23。

这是改变sklearn vesrion的替代方法。

Hardlink for a virtual folder of joblib

答案 8 :(得分:1)

出现错误时:

从sklearn.externals导入joblib ,它已淘汰旧版本。

对于新版本,请遵循:

  1. conda install -c anaconda scikit-learn(使用“ Anaconda Promt”进行安装)
  2. 导入joblib(Jupyter Notebook)

答案 9 :(得分:1)

只需尝试检查已安装的软件包中的joblib ...然后将其导入。.

答案 10 :(得分:1)

只需使用: -> 导入作业库 为我工作。 希望对你也有帮助

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

import joblib

简单