在使用 joblib 加载模型之前检查 sklearn 版本

Posted

技术标签:

【中文标题】在使用 joblib 加载模型之前检查 sklearn 版本【英文标题】:Check sklearn version before loading model using joblib 【发布时间】:2017-04-30 00:41:19 【问题描述】:

我已关注 this guide 以保存机器学习模型以供日后使用。模型被转储到一台机器上:

from sklearn.externals import joblib
joblib.dump(clf, 'model.pkl')

当我将 joblib.load('model.pkl') 加载到另一台机器上时,我收到了以下警告:

UserWarning:试图从 使用 0.18.1 版时的 0.18 版之前的版本。这可能导致 破坏代码或无效结果。使用风险自负。

那么有没有什么办法可以知道保存模型的sklearn版本和当前版本比较呢?

【问题讨论】:

【参考方案1】:

腌制估计器的版本控制was added in scikit-learn 0.18。从 v0.18 开始,您可以获得用于创建估算器的 scikit-learn 版本,

estimator.__getstate__()['_sklearn_version']

您收到的警告是由估计器的__setstate__ method 产生的,该估计器会在取消腌制时自动调用。看起来没有一种直接的方法可以在不从磁盘加载估算器的情况下获取此版本。您可以使用,过滤掉警告,

import warnings

with warnings.catch_warnings():
      warnings.simplefilter("ignore", category=UserWarning)
      estimator = joblib.load('model.pkl')

对于 0.18 之前的版本,没有这样的机制,但我想你可以使用 not hasattr(estimator, '__getstate') 作为测试,至少检测到 pre-0.18 版本。

【讨论】:

感谢您的回复。顺便说一句,我怎样才能过滤掉警告?实际上,我想在加载估算器之前获取版本的原因是为了摆脱这个警告。 这不起作用,因为加载模型后,estimator.__getstate__() 会将_sklearn_version 设置为当前加载的 sklearn 库的版本。见the source。【参考方案2】:

我有同样的问题,只是重新训练数据集并使用 joblib.dump 再次保存“model.pkl”文件。这将得到解决。祝你好运!

【讨论】:

以上是关于在使用 joblib 加载模型之前检查 sklearn 版本的主要内容,如果未能解决你的问题,请参考以下文章

使用 joblib 加载腌制 scikit-learn 模型时出现 KeyError

无法从 GridFS 加载 joblib 序列化模型

sklearn训练模型的保存与加载

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

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

加载训练有素的 scikit-learn/imblearn 管道模型时出现问题