jcd*_*dmb 42 python scikit-learn
我正在使用基于scikit-learn的nolearn的DBN(深度信念网络).
我已经构建了一个可以很好地对我的数据进行分类的网络,现在我有兴趣导出模型进行部署,但我不知道(我每次想要预测某些东西时都在训练DBN).在matlab
我只是导出权重矩阵并将其导入另一台机器.
有人知道如何导出要导入的模型/权重矩阵而无需再次训练整个模型吗?
ogr*_*sel 62
您可以使用:
>>> import joblib
>>> joblib.dump(clf, 'my_model.pkl', compress=9)
Run Code Online (Sandbox Code Playgroud)
然后,在预测服务器上:
>>> import joblib
>>> model_clone = joblib.load('my_model.pkl')
Run Code Online (Sandbox Code Playgroud)
这基本上是一个Python pickle,具有针对大型numpy数组的优化处理.它与常规pickle wrt代码更改具有相同的限制:如果pickle对象的类结构发生更改,则可能无法再使用nolearn或scikit-learn的新版本来解除对象的攻击.
如果您想要长期稳健地存储模型参数,则可能需要编写自己的IO层(例如,使用二进制格式序列化工具,如协议缓冲区或avro或低效但可移植的文本/ json/xml表示,如PMML) .
ben*_*941 10
pickling/unpickling的缺点是它只适用于匹配的python版本(主要版本,也可能是次要版本)和sklearn,joblib库版本.
机器学习模型还有其他描述性输出格式,例如由数据挖掘组开发的,例如预测模型标记语言(PMML)和可移植分析格式(PFA).在这两者中,PMML得到了更好的支持.
所以,你必须保存从模型的选择scikit学习到PMML(例如使用sklearn2pmml),然后部署,并在Java中,火花,或蜂房使用运行jpmml(当然你有更多的选择).
第3.4节。scikit-learn 文档中的模型持久性几乎涵盖了所有内容。
除了sklearn.externals.joblib
ogrisel 所指的之外,它还展示了如何使用常规的 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, degree=3, gamma=0.0,
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])
array([0])
>>> y[0]
0
Run Code Online (Sandbox Code Playgroud)
并给出一些警告,例如保存在一个版本的 scikit-learn 中的模型可能无法加载到另一个版本中。