缘起
最近有个需求, 在Java环境环境运行xgboost模型, 查询资料后发现PMML可以解决这个问题.
PMML是数据挖掘的一种通用的规范,它用统一的XML格式来描述我们生成的机器学习模型。这样无论你的模型是sklearn,R还是Spark MLlib生成的,我们都可以将其转化为标准的XML格式来存储。当我们需要将这个PMML的模型用于部署的时候,可以使用目标环境的解析PMML模型的库来加载模型,并做预测。
可以看出,要使用PMML,需要两步的工作:
- 第一块是将离线训练得到的模型转化为PMML模型文件
- 第二块是将PMML模型文件载入在线预测环境,进行预测
模型转PMML
sklearn2pmml
常见的方法是用sklearn2pmml
, 主要思路是将Booster模式转为Scikit-Learn Wrapper interface
的XGBModel
, 然后再使用PMMLPipeline
保存为PMML模型文件
1 | import xgboost as xgb |
使用这种方法, 可能会出现因为模型包含中文信息导致转换失败1
2
3
4
5
6
7Standard output is empty
Traceback (most recent call last):
File "<stdin>", line 7, in <module>
File "/Users/ruan/.pyenv/versions/2.7.16/lib/python2.7/site-packages/sklearn2pmml/__init__.py", line 262, in sklearn2pmml
print("Standard error:\n{0}".format(_decode(error, java_encoding)))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u6708' in position 1: ordinal not in range(128)
'ascii' codec can't encode character u'\u6708' in position 1: ordinal not in range(128)
jpmml-xgboost
也可以jpmml-xgboost工具, 将xgboost模型直接转换为PMML
注意这里的模型文件, 需要是通过xgboost.Booster.save_model
方法保存的.
下载
1 | wget https://github.com/jpmml/jpmml-xgboost/releases/download/1.3.15/jpmml-xgboost-executable-1.3.15.jar |
生成fmap特征映射文件
fmap文件的每行的格式是: 特征索引\t特征名称\tq
特征名称可以随意命名, 在调用PMML预测时会用到
例如: fmap.txt1
2
3
4
5
60 fea0 q
1 fea1 q
2 fea2 q
3 fea3 q
4 fea4 q
...
执行
1 | java -jar jpmml-xgboost-executable-1.3.15.jar \ |
模型预测
python环境比较模型结果
python可以使用pypmml
库, 测试我们转换好的PMML, 并和原始模型进行分数比较
1 | from pypmml import Model |
Java环境执行
java环境执行, 需要用到pmml-evaluator
和pmml-evaluator-extension
库
具体代码参考 https://www.cnblogs.com/pinard/p/9220199.html