我正在尝试使用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'
你能告诉我如何解决吗?提前致谢
最佳答案
看起来您现有的泡菜保存文件(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
变体:
“弃用”表示将某些内容标记为不值得依赖,因为它可能会在将来的版本中停止使用(通常,但并非总是如此,建议使用更新的方式来执行相同的操作)。
我怀疑您的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()
-在您的代码或存储的pickle文件中不再有对“sklearn.external.joblib”的引用。 关于python-3.x - ImportError:无法从 'joblib'导入名称 'sklearn.externals',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61893719/