ImportError: cannot import name 'joblib' from 'sklearn.externals'
ImportError: cannot import name 'joblib' from 'sklearn.externals'
我正在尝试使用 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'
你能告诉我如何解决这个问题吗?
您可以通过将 joblib
作为依赖项安装并使用 import joblib
、
直接导入 joblib
您现有的 pickle 保存文件 (model_d2v_version_002
) 似乎在非标准位置对参考模块进行了编码 – joblib
位于 sklearn.externals.joblib
而不是顶层.
当前的 scikit-learn
文档只讨论了顶级 joblib
– 例如在 scikit-learn
版本 0.21 的 3.4.1 Persistence example – but I do see a reference in someone else's old issue to a DeprecationWarning 中关于旧的 scikit.external.joblib
变体离开:
Python37\lib\site-packages\sklearn\externals\joblib_init_.py:15:
DeprecationWarning: sklearn.externals.joblib is deprecated in 0.21 and
will be removed in 0.23. Please import this functionality directly
from joblib, which can be installed with: pip install joblib. If this
warning is raised when loading pickled models, you may need to
re-serialize those models with scikit-learn 0.21+.
'Deprecation' 表示将某些东西标记为不可依赖,因为它可能会在未来的版本中停止(通常但不总是,推荐使用更新的方法来做同样的事情)。
我怀疑你的 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()
文件。 (您可能想使用不同的名称,以保留旧文件,以防万一。)
move/update 到真实的现代环境,只有 import joblib
(顶级)才能使用 joblib.load()
- 不再有任何对 `[= 的引用69=]' 在您的代码或存储的 pickle 文件中。
你应该直接使用
import joblib
而不是
from sklearn.externals import joblib
也许您的代码已过时。对于打算在数字手写项目中使用 fetch_mldata
的任何人,您应该改为 fetch_openml
。 ()
在旧版本的 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
如果对 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 版本。
出现错误时:
from sklearn.externals import joblib 它弃用了旧版本。
对于新版本,请遵循:
- conda install -c anaconda scikit-learn(使用“Anaconda Promt”安装)
- 导入作业库(Jupyter 笔记本)
经过长时间的调查,根据我的计算机设置,我发现这是因为下载数据集需要 SSL 证书。
对于这个错误,我不得不直接使用以下命令,它的效果非常好:
import joblib
简单
none 下面的答案对我有用,稍微改动一下这个修改对我来说没问题
import sklearn.externals as extjoblib
import joblib
我正在尝试使用 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'
你能告诉我如何解决这个问题吗?
您可以通过将 joblib
作为依赖项安装并使用 import joblib
、
joblib
您现有的 pickle 保存文件 (model_d2v_version_002
) 似乎在非标准位置对参考模块进行了编码 – joblib
位于 sklearn.externals.joblib
而不是顶层.
当前的 scikit-learn
文档只讨论了顶级 joblib
– 例如在 scikit-learn
版本 0.21 的 3.4.1 Persistence example – but I do see a reference in someone else's old issue to a DeprecationWarning 中关于旧的 scikit.external.joblib
变体离开:
Python37\lib\site-packages\sklearn\externals\joblib_init_.py:15: DeprecationWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+.
'Deprecation' 表示将某些东西标记为不可依赖,因为它可能会在未来的版本中停止(通常但不总是,推荐使用更新的方法来做同样的事情)。
我怀疑你的 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()
文件。 (您可能想使用不同的名称,以保留旧文件,以防万一。)move/update 到真实的现代环境,只有
import joblib
(顶级)才能使用joblib.load()
- 不再有任何对 `[= 的引用69=]' 在您的代码或存储的 pickle 文件中。
你应该直接使用
import joblib
而不是
from sklearn.externals import joblib
也许您的代码已过时。对于打算在数字手写项目中使用 fetch_mldata
的任何人,您应该改为 fetch_openml
。 (
在旧版本的 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
如果对 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 版本。
出现错误时:
from sklearn.externals import joblib 它弃用了旧版本。
对于新版本,请遵循:
- conda install -c anaconda scikit-learn(使用“Anaconda Promt”安装)
- 导入作业库(Jupyter 笔记本)
经过长时间的调查,根据我的计算机设置,我发现这是因为下载数据集需要 SSL 证书。
对于这个错误,我不得不直接使用以下命令,它的效果非常好:
import joblib
简单
none 下面的答案对我有用,稍微改动一下这个修改对我来说没问题
import sklearn.externals as extjoblib
import joblib