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
) 似乎在非标准位置对参考模块进行了编码——joblib
在sklearn.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”