我建立了一个scikit-learn模型,并想在每日的Python计划任务中重用它(NB:没有涉及其他平台-没有R,Java等)。
我对其进行了序列化(实际上,我序列化了自己的对象,其中一个字段是GradientBoostingClassifier
),并在计划任务中解除序列化。 到目前为止还算顺利(已在Save classifier to disk in scikit-learn和Model persistence in Scikit-Learn?中讨论过)。
但是,我升级了sklearn
,现在我得到了这些警告:
.../.local/lib/python2.7/site-packages/sklearn/base.py:315:
UserWarning: Trying to unpickle estimator DecisionTreeRegressor from version 0.18.1 when using version 0.18.2. This might lead to breaking code or invalid results. Use at your own risk.
UserWarning)
.../.local/lib/python2.7/site-packages/sklearn/base.py:315:
UserWarning: Trying to unpickle estimator PriorProbabilityEstimator from version 0.18.1 when using version 0.18.2. This might lead to breaking code or invalid results. Use at your own risk.
UserWarning)
.../.local/lib/python2.7/site-packages/sklearn/base.py:315:
UserWarning: Trying to unpickle estimator GradientBoostingClassifier from version 0.18.1 when using version 0.18.2. This might lead to breaking code or invalid results. Use at your own risk.
UserWarning)
现在该怎么办?
我可以降级到0.18.1并一直使用它,直到我准备重建模型。出于各种原因,我认为这是不可接受的。
我可以取消pickle文件的封存并重新pickle它。这适用于0.18.2,但在0.19中会出现问题。NFG。joblib
看起来也不错。
我希望能将数据保存在版本无关的ASCII格式(例如JSON或XML)中。显然,这是最优的解决方案,但似乎没有方法可以做到这一点(请参见Sklearn - model persistence without pkl file)。
我可以将模型保存到PMML,但它的支持至多只是温和的:
我可以使用sklearn2pmml
(虽然不容易)保存模型,并使用augustus
/lightpmmlpredictor
来应用(但不能加载)模型。但是,这些项目都不直接可用于pip
,这使得部署成为一场噩梦。此外,augustus
&lightpmmlpredictor
项目似乎已死亡。Importing PMML models into Python (Scikit-learn) - 不行。
以上的变体:使用sklearn2pmml
保存PMML,并使用openscoring
进行评分。需要与外部进程交互。糟糕。
有什么建议吗?
sklearn
更改了类定义(例如删除或重命名插槽),我将不得不重写serialize_*
和deserialize_*
函数,并且更重要的是编写反序列化器,将旧版本的序列化转换为新版本。我同意这可能比pickle噩梦好,但并不是很多。 - sdsClassificationLossFunction
,你也不会受到影响。 - David Dale