我使用的是来自nolearn的基于scikit-learn的DBN(深度信念网络)。
我已经建立了一个网络,可以很好地对我的数据进行分类,现在我有兴趣导出模型进行部署,但我不知道如何进行(每次我想预测一些事情时,我都在训练DBN)。在matlab
中,我只导出权重矩阵并将其导入另一台机器。
有人知道如何导出要导入的模型/权重矩阵而不需要再次训练整个模型吗?
首先,安装joblib。
您可以使用:
>>> import joblib
>>> joblib.dump(clf, 'my_model.pkl', compress=9)
然后,在预测服务器上:
>>> import joblib
>>> model_clone = joblib.load('my_model.pkl')
这基本上是一个Python pickle,对大型numpy数组进行了优化处理。它与常规pickle w.r.t.代码更改具有相同的限制:如果pickle对象的类结构发生更改,您可能无法再使用新版本的nolearn或scikit-learn来取消pickle该对象。
如果您希望以长期稳健的方式存储模型参数,您可能需要编写自己的IO层(例如,使用二进制格式的序列化工具,如协议缓冲区或avro,或者使用低效但可移植的text/json/xml表示,如PMML)。
Pickling/unpickling的缺点是它只适用于匹配的python版本(主要版本,可能还有次要版本)和sklearn、joblib库版本。
机器学习模型有其他描述性输出格式,如数据挖掘小组开发的,如预测模型标记语言(PMML)和可移植分析格式(PFA)。在这两者中,PMML得到了更好的支持。
因此,您可以选择将scikit-learn中的模型保存到PMML中(例如使用sklearn2pmml),然后使用jpmml在java、spark或hive中部署和运行它(当然您有更多选择)。
第3.4节。scikit学习文档中的模型持久性几乎涵盖了所有内容。
除了指出的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
并给出了一些警告,例如保存在scikit-learn的一个版本中的模型可能无法加载到另一个版本。