【Scikit-Learn 中文文档】模型持久化 - 模型选择和评估 - 用户指南 | ApacheCN

中文文档: http://sklearn.apachecn.org/cn/stable/modules/model_persistence.html

英文文档: http://sklearn.apachecn.org/en/stable/modules/model_persistence.html

官方文档: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(觉得不错麻烦给个 Star,我们一直在努力)

贡献者: https://github.com/apachecn/scikit-learn-doc-zh#贡献者

关于我们: http://www.apachecn.org/organization/209.html




3.4. 模型持久化

在训练完 scikit-learn 模型之后, 最好有一种方法来将模型持久化以备将来使用,而无需重新训练. 以下部分为您提供了有关如何使用 pickle 来持久化模型的示例. 在使用 pickle 序列化时,我们还将回顾一些安全性和可维护性方面的问题.

3.4.1. 持久化示例

可以通过使用 Python 的内置持久化模型将训练好的模型保存在 scikit 中, 它名为 pickle:

>>>
>>> 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 来持久化数据的更多信息可以参阅 这里.

3.4.2. 安全性和可维护性的局限性

pickle (和通过扩展的 joblib), 在安全性和可维护性方面存在一些问题. 由于以下原因,

  • 不要打开不受信任的数据, 因为它可能导致恶意代码在加载时执行.
  • 虽然使用一个版本的 scikit-learn 保存的模型可能会在其他版本中加载,但这完全不受支持并且也不合适. 还应该记住, 对这些数据执行的操作可能会产生不同和意想不到的结果.

为了用将来版本的 scikit-learn 来重构类似的模型, 额外的元数据应该随着 pickled model 一起被保存:

  • 训练数据, 例如. 引用不可变的快照
  • 用于生成模型更多 python 源代码
  • scikit-learn 以及它的 dependencies 的版本
  • 在训练数据的基础上获得的交叉验证得分

这样可以检查交叉验证得分是否与以前的范围相同.

由于模型内部表示可能在两种不同架构上不一样, 因此不支持在一个架构上转储模型并将其加载到另一个体系架构上.

如果您想要了解关于这些 issues 以及浏览其它可能的序列化方法的更多详情,请参阅这个 Alex Gaynor 的演讲.




中文文档: http://sklearn.apachecn.org/cn/stable/modules/model_persistence.html

英文文档: http://sklearn.apachecn.org/en/stable/modules/model_persistence.html

官方文档: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(觉得不错麻烦给个 Star,我们一直在努力)

贡献者: https://github.com/apachecn/scikit-learn-doc-zh#贡献者

关于我们: http://www.apachecn.org/organization/209.html

有兴趣的们也可以和我们一起来维护,持续更新中 。。。

机器学习交流群: 629470233

展开阅读全文

没有更多推荐了,返回首页