在训练了 scikit-learn 模型之后,希望有一种方法可以持久化该模型以备将来使用,而无需
重新训练。
本节提供了一个如何使用pickle持久化模型的示例。
我们还将回顾使用pickle序列化时的一些安全性和可维护性问题。
pickling 的另一种方法是使用
相关项目
下列出的相关模型导出工具可以将模型导出为其他格式。与 pickling 不同,一旦导出,就无法恢复完整的 Scikit-learn 估计器对象,但是可以部署模型以进行预测,通常使用支持开放模型交换格式(如
ONNX
或
PMML
)的工具。
1. 持久化示例
可以使用Python的内置持久化模型 pickle ,将模型保存在 scikit-learn 中:>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> X, y= datasets.load_iris(return_X_y=True)
>>> clf.fit(X, y)
SVC()
>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)
>>> clf2.predict(X[0:1])
array([0])
>>> y[0]
0
在 scikit-learn 的特定情况下,最好使用 joblib 来替换 pickle(
dump
&
load
),这在内部携带大型 numpy 数组的对象上更为有效,与训练好的 scikit-learn 估计器的情况一样,但只能pickle到磁盘而不是字符串:
>>> from joblib import dump, load
>>> dump(clf, 'filename.joblib')
稍后,您可以使用以下命令重新加载(load back)pickled模型(可能在另一个Python进程中):
>>> clf = load('filename.joblib')
注意:
dump
和
load
函数也接受类似文件的对象,而不是文件名。关于更多使用 Joblib 数据持久化的信息可以在
这里
获取。
2. 安全性和可维护性限制
pickle(和 joblib 的扩展)在可维护性和安全性方面存在一些问题。因为,- 切勿 unpickle 不受信任数据,因为它可能导致加载时执行恶意代码。
- 虽然使用 scikit-learn 的某个版本保存的模型可能可以在其他版本中加载,但这是完全不受支持和不可取的。还应记住,对此类数据执行的操作可能会产生不同和意外的结果。
- 训练数据,例如引用不可变快照(immutable snapshot)
- 用于生成模型的python源代码
- scikit-learn 的版本及其依赖关系
- 从训练数据中获得的交叉验证分数
文壹由“伴编辑器”提供技术支持
☆☆☆为方便大家查阅,小编已将scikit-learn学习路线专栏 文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“系列文章”,如图:
欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础。(添加微信:mthler,备注:sklearn学习,一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。)