xgboost模型通过pmml存储,在java中调用

xgboost已经提供丰富的java接口,再通过pmml调用显得没多大的意义,java底层用的c++写的预测方法,超级快,不过还是记录下,直接看看python代码,数据还是鸾尾花数据:

import pandas as pd
from xgboost.sklearn import XGBClassifier
from sklearn2pmml import PMMLPipeline
from  sklearn_pandas import  DataFrameMapper
from sklearn2pmml import sklearn2pmml
iris_df = pd.read_csv("xml/iris.csv")
clf = XGBClassifier(
silent=0 ,#设置成1则没有运行信息输出,最好是设置为0.是否在运行升级时打印消息。
#nthread=4,# cpu 线程数 默认最大
learning_rate= 0.3, # 如同学习率
min_child_weight=1,
# 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言
#,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
#这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
max_depth=6, # 构建树的深度,越大越容易过拟合
gamma=0,  # 树的叶子节点上作进一步分区所需的最小损失减少,越大越保守,一般0.1、0.2这样子。
subsample=1, # 随机采样训练样本 训练实例的子采样比
max_delta_step=0,#最大增量步长,我们允许每个树的权重估计。
colsample_bytree=1, # 生成树时进行的列采样
reg_lambda=1,  # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
objective= 'multi:softmax', #多分类的问题 指定学习任务和相应的学习目标
n_estimators=100, #树的个数
seed=1000
)
mapper = DataFrameMapper([
    (['sepal_length'], None),
    (['sepal_width'], None),
    (['petal_length'], None),
    (['petal_width'], None)
])
pipeline = PMMLPipeline([('mapper', mapper), ("classifier", clf)])
pipeline.fit(iris_df[iris_df.columns.difference(["species"])],iris_df["species"])
sklearn2pmml(pipeline,"./xml/xgboost.pmml",with_repr = True)

java代码调用上一步生成的xgboost.xml,看下,跟上两篇并没有什么区别:

package com.meituan.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.dmg.pmml.FieldName;
import org.dmg.pmml.PMML;
import org.jpmml.evaluator.Evaluator;
import org.jpmml.evaluator.FieldValue;
import org.jpmml.evaluator.InputField;
import org.jpmml.evaluator.ModelEvaluator;
import org.jpmml.evaluator.ModelEvaluatorFactory;
import org.jpmml.evaluator.TargetField;

public class PMMLPrediction {
	
	public static void main(String[] args) throws Exception {
		String  pathxml="/Users/shuubiasahi/Documents/python/credit-tfgan/xml/xgboost.pmml";
		Map<String, Double>  map=new HashMap<String, Double>();
		map.put("sepal_length", 5.1);
		map.put("sepal_width", 3.5);
		map.put("petal_length", 1.4);
		map.put("petal_width", 0.2);	
		predictLrHeart(map, pathxml);
	}
	
	public static void predictLrHeart(Map<String, Double> irismap,String  pathxml)throws Exception {

		PMML pmml;
		// 模型导入
		File file = new File(pathxml);
		InputStream inputStream = new FileInputStream(file);
		try (InputStream is = inputStream) {
			pmml = org.jpmml.model.PMMLUtil.unmarshal(is);

			ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory
					.newInstance();
			ModelEvaluator<?> modelEvaluator = modelEvaluatorFactory
					.newModelEvaluator(pmml);
			Evaluator evaluator = (Evaluator) modelEvaluator;

			List<InputField> inputFields = evaluator.getInputFields();
			// 过模型的原始特征,从画像中获取数据,作为模型输入
			Map<FieldName, FieldValue> arguments = new LinkedHashMap<>();
			for (InputField inputField : inputFields) {
				FieldName inputFieldName = inputField.getName();
				Object rawValue = irismap
						.get(inputFieldName.getValue());
				FieldValue inputFieldValue = inputField.prepare(rawValue);
				arguments.put(inputFieldName, inputFieldValue);
			}

			Map<FieldName, ?> results = evaluator.evaluate(arguments);
			List<TargetField> targetFields = evaluator.getTargetFields();
			//对于分类问题等有多个输出。
			for (TargetField targetField : targetFields) {
				FieldName targetFieldName = targetField.getName();
				Object targetFieldValue = results.get(targetFieldName);
				System.err.println("target: " + targetFieldName.getValue()
						+ " value: " + targetFieldValue);
			}
		}
	}
}


结果:

target: species value: ProbabilityDistribution{result=0, probability_entries=[0=0.9966834381304797, 1=0.0024718368561191103, 2=8.447250134011304E-4]}



  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值