我正在try 使用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)

然后我try 直接安装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'

你能告诉我怎么解决这个问题吗?提前谢谢

推荐答案

看起来您现有的pickle save文件(model_d2v_version_002)在一个非标准位置对一个参考模块进行编码——joblib位于sklearn.externals.joblib而不是顶层.

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

Python37\lib\site packages\sklearn\externals\joblib\u init.py:15:

"弃用"指的是将某些东西标记为不值得依赖,因为它可能会在future 的版本中被终止(通常,但并不总是,使用推荐的更新方法来做同样的事情).

我怀疑您的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文件是从哪个版本保存的,我会try 使用它.这些步骤大致如下:

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

  • 你会这样做:

import sklearn.external.joblib as extjoblib
import joblib
  • extjoblib.load()按计划删除旧文件,然后立即使用顶级joblib重新生成joblib.dump()文件.(为了以防万一,您可能需要使用一个不同的名称来保留旧文件.)

  • 移动/更新到真实、现代的环境中,只需import joblib(顶级)即可使用joblib.load()-不再有任何"sklearn"的参考.外部的在代码或存储的pickle文件中.

Python-3.x相关问答推荐

使用Python抓取sofascore以获取有关球队阵容和投票的信息

链接列未延伸到数据框的末尾

如何将多输入数据加载器传递给单输入模型

try 使用 GEKKO 求解非线性方程组.系统有多种解决方案,但 GEKKO 给出了错误的解决方案.我该如何解决?

如何确保 GCP Document AI 模型输出与输入文件同名的 JSON?

如何对具有多个列值的 pandas 数据框进行数据透视/数据透视表

如何在 Telethon 中向机器人发送发送表情符号

Python多进程:运行一个类的多个实例,将所有子进程保留在内存中

非拉丁字符的Python正则表达式不起作用

Python从base64转换为二进制

内部如何使用 Python 语法?

smtplib 在 Python 3.1 中发送带有 unicode 字符的邮件的问题

numpy.ndarray 与 pandas.DataFrame

Python3四舍五入到最接近的偶数

如何将 SimpleGUI 与 Python 2.7 和 3.0 shell 集成

IronPython 3 支持?

在python中,如果一个函数没有return语句,它会返回什么?

为什么在 Python 3 中实例的 __dict__ 的大小要小得多?

Windows 下 Python 3.x 的 OpenCV

Python 2 与 Python 3 - urllib 格式