機器學習在用於產品的時候,經常會遇到跨平臺的問題。
比如用Python基於一系列的機器學習庫訓練了一個模型,但是有時候其他的產品和項目想把這個模型集成進去,但是這些產品很多隻支持某些特定的生產環境比如Java,爲了上一個機器學習模型去大動干戈修改環境配置很不划算,此時我們就可以考慮用預測模型標記語言(Predictive Model Markup Language,以下簡稱PMML)來實現跨平臺的機器學習模型部署。
一. PMML概述
PMML是數據挖掘的一種通用的規範,它用統一的XML格式來描述我們生成的機器學習模型。這樣無論你的模型是sklearn,R還是Spark MLlib生成的,我們都可以將其轉化爲標準的XML格式來存儲。當我們需要將這個PMML的模型用於部署的時候,可以使用目標環境的解析PMML模型的庫來加載模型,並做預測。
可以看出,要使用PMML,需要兩步的工作,都需要相關的庫支持。
- 將離線訓練得到的模型轉化爲PMML模型文件,
- 將PMML模型文件載入在線預測環境,進行預測。
二. PMML模型的生成和加載相關類庫
大部分模型都可以用PMML的方式實現
- jpmml的說明文檔:GitHub - jpmml/jpmml-evaluator: Java Evaluator API for PMML
- Jpmml支持的轉換語言,主流的機器學習語言都支持了;
- 從下圖可以看到,它支持R、python和spark、xgboost、lightgbm等模型的轉換,用起來非常方便;
三、工具的工程實踐:
1. Python模型上線,使用了模型轉換成PMML上線方法
如果我們使用的是sklearn,那麼可以使用sklearn2pmml這個python庫來做模型文件的生成,這個庫安裝很簡單,使用"pip install sklearn2pmml"即可。python-sklearn裏面的模型都支持,也支持xgboost,並且PCA,歸一化可以封裝成preprocess轉換成PMML,所以調用起來很方便。特別需要注意的是:缺失值的處理會影響到預測結果,大家可以可以看一下, 用PMML方式預測,模型預測一條記錄速度是1ms,可以用這個預測來預估一下根據你的數據量,整體的速度有多少
2. 如果使用的是Spark MLlib, 這個庫有一些模型已經自帶了保存PMML模型的方法,可惜並不全。如果是R,則需要安裝包"XML"和“PMML”。此外,JAVA庫JPMML可以用來生成R,SparkMLlib,xgBoost,Sklearn的模型對應的PMML文件。github地址是:https://github.com/jpmml/jpmml。加載PMML模型需要目標環境支持PMML加載的庫,如果是JAVA,則可以用JPMML來加載PMML模型文件。
https://zhuanlan.zhihu.com/p/39021238