# 3.4. 模型持久化
校验者:
[@正版乔](https://github.com/apachecn/scikit-learn-doc-zh)
[@小瑶](https://github.com/apachecn/scikit-learn-doc-zh)
翻译者:
[@那伊抹微笑](https://github.com/apachecn/scikit-learn-doc-zh)
在训练完 scikit-learn 模型之后, 最好有一种方法来将模型持久化以备将来使用,而无需重新训练. 以下部分为您提供了有关如何使用 pickle 来持久化模型的示例. 在使用 pickle 序列化时,我们还将回顾一些安全性和可维护性方面的问题.
## 3.4.1. 持久化示例
可以通过使用 Python 的内置持久化模型将训练好的模型保存在 scikit 中, 它名为 [pickle](https://docs.python.org/2/library/pickle.html):
```
>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> iris = datasets.load_iris()
>>> X, y = iris.data, iris.target
>>> clf.fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)
>>> clf2.predict(X[0:1])
array([0])
>>> y[0]
0
```
在这个 scikit 的特殊示例中,使用 joblib 来替换 pickle (`joblib.dump` & `joblib.load`) 可能会更有意思, 这对于内部带有大量数组的对象来说更为高效, 通常情况下适合 scikit-learn estimators(预估器), but can only pickle to the disk and not to a string:
```
>>> from sklearn.externals import joblib
>>> joblib.dump(clf, 'filename.pkl')
```
之后你可以使用以下方式加载 pickled model(可能在另一个 Python 进程中):
```
>>> clf = joblib.load('filename.pkl')
```
Note
`joblib.dump` 和 `joblib.load` 函数也接收类似 file 的对象而不是文件名. 有关使用 Joblib 来持久化数据的更多信息可以参阅 [这里](https://pythonhosted.org/joblib/persistence.html).
## 3.4.2. 安全性和可维护性的局限性
pickle (和通过扩展的 joblib), 在安全性和可维护性方面存在一些问题. 由于以下原因,
- 不要打开不受信任的数据, 因为它可能导致恶意代码在加载时执行.
- 虽然使用一个版本的 scikit-learn 保存的模型可能会在其他版本中加载,但这完全不受支持并且也不合适. 还应该记住, 对这些数据执行的操作可能会产生不同和意想不到的结果.
为了用将来版本的 scikit-learn 来重构类似的模型, 额外的元数据应该随着 pickled model 一起被保存:
- 训练数据, 例如. 引用不可变的快照
- 用于生成模型更多 python 源代码
- scikit-learn 以及它的 dependencies 的版本
- 在训练数据的基础上获得的交叉验证得分
这样可以检查交叉验证得分是否与以前的范围相同.
由于模型内部表示可能在两种不同架构上不一样, 因此不支持在一个架构上转储模型并将其加载到另一个体系架构上.
如果您想要了解关于这些 issues 以及浏览其它可能的序列化方法的更多详情,请参阅这个 [Alex Gaynor 的演讲](http://pyvideo.org/video/2566/pickles-are-for-delis-not-software).
- scikit-learn 0.19 中文文档
- 用户指南
- 1. 监督学习
- 1.1. 广义线性模型
- 1.2. 线性和二次判别分析
- 1.3. 内核岭回归
- 1.4. 支持向量机
- 1.5. 随机梯度下降
- 1.6. 最近邻
- 1.7. 高斯过程
- 1.8. 交叉分解
- 1.9. 朴素贝叶斯
- 1.10. 决策树
- 1.11. 集成方法
- 1.12. 多类和多标签算法
- 1.13. 特征选择
- 1.14. 半监督学习
- 1.15. 等式回归
- 1.16. 概率校准
- 1.17. 神经网络模型(有监督)
- 2. 无监督学习
- 2.1. 高斯混合模型
- 2.2. 流形学习
- 2.3. 聚类
- 2.4. 双聚类
- 2.5. 分解成分中的信号(矩阵分解问题)
- 2.6. 协方差估计
- 2.7. 经验协方差
- 2.8. 收敛协方差
- 2.9. 稀疏逆协方差
- 2.10. Robust 协方差估计
- 2.11. 新奇和异常值检测
- 2.12. 密度估计
- 2.13. 神经网络模型(无监督)
- 3. 模型选择和评估
- 3.1. 交叉验证:评估估算器的表现
- 3.2. 调整估计器的超参数
- 3.3. 模型评估: 量化预测的质量
- 3.4. 模型持久化
- 3.5. 验证曲线: 绘制分数以评估模型
- 4. 数据集转换
- 4.1. Pipeline(管道)和 FeatureUnion(特征联合): 合并的评估器
- 4.2. 特征提取
- 4.3. 预处理数据
- 4.4. 无监督降维
- 4.5. 随机投影
- 4.6. 内核近似
- 4.7. 成对的矩阵, 类别和核函数
- 4.8. 预测目标 (y) 的转换
- 5. 数据集加载工具
- 6. 大规模计算的策略: 更大量的数据
- 7. 计算性能
- 教程
- 使用 scikit-learn 介绍机器学习
- 关于科学数据处理的统计学习教程
- 机器学习: scikit-learn 中的设置以及预估对象
- 监督学习:从高维观察预测输出变量
- 模型选择:选择估计量及其参数
- 无监督学习: 寻求数据表示
- 把它们放在一起
- 寻求帮助
- 处理文本数据
- 选择正确的评估器(estimator)
- 外部资源,视频和谈话