Python scikit-learn:导出经过训练的分类器

Posted

技术标签:

【中文标题】Python scikit-learn:导出经过训练的分类器【英文标题】:Python scikit-learn: exporting trained classifier 【发布时间】:2013-07-04 22:04:05 【问题描述】:

我正在使用来自nolearn 的基于 scikit-learn 的 DBN(深度信念网络)。

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

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

【问题讨论】:

你试过用pickle模块简单地序列化模型吗? @ffriend - 不,但我会尝试。谢谢! 【参考方案1】:

首先,安装joblib。

你可以使用:

>>> import joblib
>>> joblib.dump(clf, 'my_model.pkl', compress=9)

然后,在预测服务器上:

>>> import joblib
>>> model_clone = joblib.load('my_model.pkl')

这基本上是一个 Python 泡菜,对大型 numpy 数组进行了优化处理。它与普通泡菜 w.r.t 具有相同的限制。代码更改:如果 pickle 对象的类结构发生更改,您可能无法再使用新版本的 nolearn 或 scikit-learn 解开对象。

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

【讨论】:

我得到RuntimeError: maximum recursion depth exceededjoblib.dump(clf, 'my_model.pkl', compress=9) 注意:sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23。现在你可以用pip install joblib安装它并直接导入。【参考方案2】:

scikit-learn 文档中的 3.4. Model persistence 部分几乎涵盖了所有内容。

除了sklearn.externals.joblibogrisel 所指外,还展示了如何使用常规的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 版本中的模型可能无法在另一个版本中加载。

【讨论】:

【参考方案3】:

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

还有其他机器学习模型的描述性输出格式,例如由 Data Mining Group 开发的,例如预测模型标记语言 (PMML) 和可移植分析格式 (PFA)。在这两者中,PMML 是much better supported。

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

【讨论】:

看起来不错,但是如果部署也是基于 Python 的呢?有pmml2sklearn吗?

以上是关于Python scikit-learn:导出经过训练的分类器的主要内容,如果未能解决你的问题,请参考以下文章

python机器学习scikit-learn的安装

将 python scikit 学习模型导出到 pmml

今天带大家用Python代码,遗传算法训一波龙~

今天带大家用Python代码,遗传算法训一波龙~

深圳黑马Python37期Django项目实训竞赛圆满结束

是否可以在 scikit-learn 中打印决策树?