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

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

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

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

【问题讨论】:

  • 你试过用pickle模块简单地序列化模型吗?
  • @ffriend - 不,但我会尝试。谢谢!

标签: python scikit-learn


【解决方案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吗?
    猜你喜欢
    • 2013-05-25
    • 2016-01-04
    • 2022-01-05
    • 2023-04-09
    • 2021-04-19
    • 2017-06-21
    • 1970-01-01
    • 2015-06-08
    • 2018-04-06
    相关资源
    最近更新 更多