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 exceeded
和joblib.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.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 版本中的模型可能无法在另一个版本中加载。
【讨论】:
【参考方案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:导出经过训练的分类器的主要内容,如果未能解决你的问题,请参考以下文章