scikit-learn如何保存,导出或部署估计器以进⾏⽣产-模型持久
化
训练了scikit-learn模型后,希望有⼀种⽅法可以持久保存模型以备将来使⽤,⽽不必重新训练。以下部分为您提供了⼀个⽰例,说明如何使⽤pickle持久化模型。在处理pickle序列化时,我们还将回顾⼀些安全性和可维护性问题。
pickling的替代⽅法是使⽤"相关项⽬"下列出的模型导出⼯具将模型导出为另⼀种格式。与pickling不同,导出后,您⽆法恢复完整的Scikit-learn估计器对象,但通常可以通过使⽤⽀持开放模型交换格式的⼯具(例如ONNX或 PMML )来部署模型以进⾏预测。
Persistence example --持久性案例
通过使⽤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]
在scikit-learn的特定情况下,最好使⽤joblib代替pickle(dump&load),这在内部装有⼤型numpy数组的对象上效率更⾼,这与拟合的scikit-learn估计量通常很有效,但只能pickle到磁盘⽽不是字符串:
>>> from joblib import dump, load
>>> dump(clf, 'filename.joblib')
稍后,可以使⽤以下⽅法加载pickle的模型(可能在另⼀个Python进程中):
>>> clf = load('filename.joblib')
Security & maintainability limitations --安全和可维护性限制
pickle(以及扩展的joblib)在可维护性和安全性⽅⾯存在⼀些问题:
--不要unpickle不信任的数据,因为它可能导致加载后执⾏恶意代码。
--使⽤同⼀个版本的scikit-learn保存的模型不要在其他版本中加载,因为这是不受⽀持的,也不可取,原因是对此类数据执⾏的操作可能会产⽣不同的意外结果。
为了⽤将来的scikit-learn版本重建相似的模型,应该在pickle的模型中保存其他元数据,⽐如:
--训练数据,例如对不变快照的引⽤
--⽤于⽣成模型的python源代码
--scikit-learn的版本及其依赖项
--在训练数据上获得的交叉验证分数import pickle
这样应该可以检查交叉验证得分是否与以前相同。
由于模型内部表⽰在两个不同的体系结构上可能不同,因此不⽀持将模型转储到⼀个体系结构上并将其加载到另⼀个体系结构上。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论