【机器学习-模型部署】将已被存储为.ml的模型文件,转化为pmml文件

需求:将已被存储为.ml的模型文件,转化为pmml文件

#!/usr/bin/env python
#! -*- coding: utf-8 -*-

'''
@File: create_pmml_file.py
@Author: RyanZheng
@Email: [email protected]
@Created Time on: 2019-11-11
'''

######刚训练完后,将模型保存为pmml######

from sklearn.datasets import load_digits
import xgboost as xgb
from sklearn2pmml import PMMLPipeline
from sklearn2pmml import sklearn2pmml

import pandas as pd

digits = load_digits(2)
yyy = digits['target']
X = digits['data']

print(type(X))

columns = ['f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f20', 'f21', 'f22', 'f23', 'f24', 'f25', 'f26', 'f27', 'f28', 'f29', 'f30', 'f31', 'f32', 'f33', 'f34', 'f35', 'f36', 'f37', 'f38', 'f39', 'f40', 'f41', 'f42', 'f43', 'f44', 'f45', 'f46', 'f47', 'f48', 'f49', 'f50', 'f51', 'f52', 'f53', 'f54', 'f55', 'f56', 'f57', 'f58', 'f59', 'f60', 'f61', 'f62', 'f63']

df = pd.DataFrame(X,columns=columns)

print('y is : ',yyy)

sklearn_xgb = xgb.XGBClassifier(objective="binary:logistic")


xgb_pipeline = PMMLPipeline([('classifier', sklearn_xgb)])
xgb_pipeline.fit(df[['f28','f36']], yyy)
sklearn2pmml(xgb_pipeline, 'sklearn_xgb.pmml')

from sklearn.externals import joblib

#保存模型
sk_xgb = xgb.XGBClassifier(objective="binary:logistic")
sk_xgb.fit(df[['f28','f36']], yyy)
print('sk_xgb.get_booster().feature_names is : ', sk_xgb.get_booster().feature_names)
print('sk_xgb predict result is : ', sk_xgb.predict_proba(df[['f28','f36']])[:,1])
joblib.dump(sk_xgb._Booster, 'sk_xgb.ml')





######将已经是.ml模型文件,保存为pmml######

sk_xgb_load = joblib.load('sk_xgb.ml')


sk_xgb_load.save_model('sk_xgb_save_model.model')

sk_xgb_load.dump_model('sk_xgb_save_model.txt')




#fmap可通过以下方式产生
'''
fmap(feature map file):实现feature id和feature name的对应
格式为 featmap.txt: <featureid> <featurename> <q or i or int>\n

Feature id从0开始直到特征的个数为止,从小到大排列。
i表示是二分类特征
q表示数值变量,如年龄,时间等。q可以缺省
int表示特征为整数(when int is hinted, the decision boundary will be integer)
可根据以下语句通过读取pkl文件的feature_name生成,或者根据feature顺序通过别的方式生成
'''
features = sk_xgb_load.feature_names
print('features is : ',features)
print('xgb feature is :', sk_xgb_load.get_score())
file_name = 'featmap.fmap'
def create_feature_map(file_name,features):
    outfile = open(file_name, 'w')
    for i, feat in enumerate(features):
        outfile.write('{0}\t{1}\tq\n'.format(i, feat))

create_feature_map(file_name, features)


#保证已经下载了jpmml-xgboost-executable-1.3-SNAPSHOT.jar文件。然后运行如下语句。其中sk_xgb_save_model.model和featmap.fmap根据不同文件名称进行相应的修改。
'''
java -jar jpmml-xgboost-executable-1.3-SNAPSHOT.jar --model-input sk_xgb_save_model.model --fmap-input featmap.fmap --pmml-output xgboost.pmml
'''

经对比,在模型训练完且确定完模型参数后,在存储为模型文件的同时也存一份pmml文件。与将已经是.ml模型文件转化为pmml文件。两份pmml文件一模一样。唯一的区别在于如下:

在模型训练完且确定完模型参数后,在存储为模型文件的同时也存一份pmml文件内容如下:

将已经是.ml模型文件转化为pmml文件,pmml文件的内容如下:

扫描二维码关注公众号,回复: 11953890 查看本文章

参考:https://blog.csdn.net/yueguanghaidao/article/details/91892549

jpmml-xgboost-executable-1.3-SNAPSHOT.jar

猜你喜欢

转载自blog.csdn.net/xiezhen_zheng/article/details/103126967