Python scikit学习:导出经过训练的分类器

Python scikit学习:导出经过训练的分类器,python,scikit-learn,Python,Scikit Learn,我正在使用一个基于scikit学习的DBN(深度信念网络) 我已经建立了一个可以很好地对数据进行分类的网络,现在我对导出模型以进行部署很感兴趣,但我不知道如何进行(每次我想预测一些事情时,我都在训练DBN)。在matlab中,我只需导出权重矩阵并将其导入另一台机器 是否有人知道如何导出要导入的模型/权重矩阵,而无需再次训练整个模型 首先,安装 您可以使用: >>> import joblib >>> joblib.dump(clf, 'my_model.pkl

我正在使用一个基于scikit学习的DBN(深度信念网络)

我已经建立了一个可以很好地对数据进行分类的网络,现在我对导出模型以进行部署很感兴趣,但我不知道如何进行(每次我想预测一些事情时,我都在训练DBN)。在
matlab
中,我只需导出权重矩阵并将其导入另一台机器

是否有人知道如何导出要导入的模型/权重矩阵,而无需再次训练整个模型

首先,安装

您可以使用:

>>> 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解除对该对象的绑定

如果您想要长期可靠地存储模型参数,您可能需要编写自己的IO层(例如,使用二进制格式的序列化工具,如协议缓冲区或avro,或低效但可移植的文本/json/xml表示,如)

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中的模型可能无法加载到另一个版本。

Pickling/unpickling的缺点是,它只适用于匹配的python版本(主要版本,可能也包括次要版本)和sklearn、joblib库版本

机器学习模型有其他描述性输出格式,如由开发的,如预测模型标记语言(PMML)和可移植分析格式(PFA)。在这两种方法中,PMML是最重要的


因此,您可以选择将模型从scikit学习保存到PMML(例如使用),然后使用在java、spark或hive中部署和运行它(当然,您有更多的选择)

你们试过简单地用模块序列化模型吗?@ffriend-没有,但我会试试。谢谢!我得到
RuntimeError:joblib.dump(clf,'my_model.pkl',compress=9)
超过了最大递归深度。。注意:
sklearn.externals.joblib在0.21中不推荐使用,将在0.23中删除。现在您可以使用
pip install joblib
安装它并直接导入。这看起来不错,但是如果部署也是基于Python的呢?是否有
pmml2sklearn