【機器學習-模型部署】將已被存儲爲.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文件的內容如下:

 

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

jpmml-xgboost-executable-1.3-SNAPSHOT.jar

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章