我構建了一個scikit-learn模型,我想在日常的python cron作業中重用(NB:沒有涉及其他平臺 - 沒有R,沒有Java & c)。scikit-learn模型持久性:pickle vs pmml vs ...?
我pickled它(實際上,我醃我自己的對象,其中一個字段是GradientBoostingClassifier
),我在cron作業中取消了它。迄今爲止這麼好(並已在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)
現在我該怎麼辦?
我可以downgrage到0.18.1,並堅持下去,直到我準備重建模型。由於各種原因,我覺得這是不可接受的。
我可以取消醃製該文件並重新醃一遍。這與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
進行評分。需要與外部進程進行交互。育。
對此有何建議?
這比鹹菜更可靠嗎? pickle的問題是,如果'sklearn'改變Class定義(例如,刪除或重命名一個槽),我將不得不重寫'serialize_ *'和'deserialize_ *'函數,更重要的是,編寫解串器來轉換將_old_版本序列化爲_new_版本。我同意這可能比鹹菜噩夢更好,但幾乎沒有。 – sds
這不能保證你將與20或200版本的sklearn兼容。但它至少可以讓你更好地控制局勢。例如。如果sklearn完全重寫它的'''ClassificationLossFunction''',你將不會受到影響。 –