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

问题描述 投票:0回答:2

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

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

python-3.x amazon-web-services joblib doc2vec
2个回答
0
投票

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

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


0
投票

似乎您现有的泡菜保存文件(model_d2v_version_002)在非标准位置编码了一个参考模块-joblibsklearn.externals.joblib中,而不是在顶层。

[当前的scikit-learn文档仅讨论顶级joblib,例如在[3.4.1持久性示例] [1]中,但是我确实看到了[在别人的旧问题中引用了DeprecationWarning] [2 ]在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.dump()重新重新joblib该文件。 (您可能想使用一个不同的名称,以保留较旧的文件,以防万一。)

  • 移动/更新到您实际的现代环境,并且只有import joblib(顶级)才能使用joblib.load()-在您的代码或存储中不再有对`sklearn.external.joblib'的引用泡菜文件。

© www.soinside.com 2019 - 2024. All rights reserved.