Python XGBoost保存模型PMML

  • Post author:
  • Post category:python




PMML简介

PMML全称预言模型标记语言(Predictive Model Markup Language),利用XML描述和存储数据挖掘模型。PMML是一种跨平台调用模型,加入使用Python训练好一个机器学习模型后,保存为pkl模型,那么在java上不是能进行使用的,这时就需要将模型转为PMML,这也是其有效之处。



优点

1、PMML模型可以跨平台调用,既可以在java环境运行,也可Python环境运行(Python调用的话为什么不用pkl更直接呢)

2、支持更多开源语言



缺点

1、Python调用PMML模型比调用pkl模型所用时间多一些;

2、PMML比pkl模型大,至于大多少看数据量,加载模型耗费时间。



XGBoost训练PMML

本数据采用鸢尾花数据进行操作,直接将模型转为pmml文件(记得安装包哦)

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

from sklearn.datasets import load_iris
from sklearn.externals import joblib
from sklearn.model_selection import train_test_split
from sklearn import metrics
from xgboost.sklearn import XGBClassifier
from sklearn2pmml import PMMLPipeline,sklearn2pmml
from pypmml import Model
from sklearn.preprocessing import StandardScaler
import numpy as np
from nyoka import xgboost_to_pmml
import pandas as pd

# 导入鸢尾花的数据
# iris = load_iris()
# 提取特征名称(数据的名称)
# feature = iris['feature_names']
feature = ['x1','x2','x3','x4','x5','x6','x7']
# 目标名称
target = 'class'
# 获取数据
# data = iris['data'][50:150]
# 获取标签
# label = iris['target'][50:150]

# 获取训练集和测试集
# train_x, test_y, lable_x, label_y = train_test_split(data, label, train_size=0.8)


# 获取训练集
def train_data():
    train_x, train_y = [], []
    with open('train.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        for line in lines:
            content = line.strip().split(',')
            train_x.append([float(each) for each in content[:-1]])
            train_y.append(int(content[-1]))
    return np.array(train_x), np.array(train_y)


# 获取测试集
def test_data():
    test_x, test_y = [], []
    with open('train.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        for line in lines:
            content = line.strip().split(',')
            test_x.append([float(each) for each in content[:-1]])
            test_y.append(int(content[-1]))
    return np.array(test_x), np.array(test_y)
train_x,lable_x = train_data()
test_y,label_y = test_data()

# 参数设置
params = {'booster': 'gbtree',
          'objective': 'binary:logistic',
          'eval_metric': 'auc',
          'max_depth': 4,
          'lambda': 10,
          'subsample': 0.75,
          'colsample_bytree': 0.75,
          'min_child_weight': 2,
          'eta': 0.025,
          'seed': 0,
          'nthread': 8,
          'silent': 1,
          # 'scale_pos_weight':1,
          }
# 加载XGBoost
clt = XGBClassifier(params=params)
clt = PMMLPipeline([("class", clt)])
clt.fit(train_x,lable_x)

# 转为PMML文件
xgboost_to_pmml(clt, feature, target, "xgboost.pmml")
# 加载模型
model = Model.fromFile('xgboost.pmml')
# 加载测试集
ypred = model.predict(test_y)
# 输出测试集结果
pred = np.array([int(each[-1]) for each in ypred])
# 输出测试集准确率
print("Accuracy Score:%.2f" % metrics.accuracy_score(label_y, pred))
print(("Recall Score:%.2f" % metrics.recall_score(label_y, pred)))
# 预测新的数据
print(model.predict([0,0,0,6,6,1,0]))

如何在java环境下调用pmml模型,

我的下一篇文章会讲到



(1)、如果您在阅读博客时遇到问题或者不理解的地方,可以联系我,互相交流、互相进步;

(2)、本人业余时间可以承接毕业设计和各种小项目,如系统构建、成立网站、数据挖掘、机器学习、深度学习等。有需要的加QQ:1143948594,备注“csdn项目”。



版权声明:本文为qq_32113189原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。