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

本文介绍如何将LightGBM模型转换为PMML格式,并在Java环境中进行预测。涉及模型训练、转换及Java调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lightgbm模型是微软开源的一个模型,比xgboost快个10倍左右,原始训练使用的是c++,也提供了python接口,晚上摸索了下lightgbm在python中训练,转化为pmml语言,在java中调用,过程碰到不少坑,记录下,



首先是  git clone  https://github.com/jpmml/jpmml-lightgbm/tree/master/src/main/java/org/jpmml/lightgbm


进行mvn  clean  install打包,在target目录下会生成一个converter-executable-1.2-SNAPSHOT.jar   jar包,实际这个项目就是一老外加载lightgbm模型写的一个项目,也不用直接转化为pmml调用,直接加载模型做预测就可以,既然这里讲了还是要说下转化为pmml的形式,首先确保llightgbm的版本是目前最新版本,看下我的:


In [3]: lgb.__version__
Out[3]: '2.1.0'

在python中训练代码,数据还是用的鸾尾花数据:

import pandas as pd
from lightgbm import LGBMClassifier
iris_df = pd.read_csv("xml/iris.csv")
d_x = iris_df.iloc[:, 0:4].values
d_y = iris_df.iloc[:, 4].values
model = LGBMClassifier(
    boosting_type='gbdt', objective="multiclass", nthread=8, seed=42)
model.n_classes =3
model.fit(d_x,d_y,feature_name=iris_df.columns.tolist()[0:-1])
model.booster_.save_model("xml/lightgbm.txt")

在这里生成了一个lightgbm.txt  文件,实际这个文件是lightgbm模型的各个树的参数,比较简单,下面通过这棵树,调用 converter-executable-1.2-SNAPSHOT.jar来生成pmml文件,如下:
cd  target
java -jar converter-executable-1.2-SNAPSHOT.jar  --lgbm-input /Users/shuubiasahi/Documents/python/credit-tfgan/xml/lightgbm.txt --pmml-output /Users/shuubiasahi/Documents/python/credit-tfgan/xml/lightgbm.pmml

其中output就是pmml文件,在java中调用,和上一篇提到的一模一样:
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/lightgbm.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: _target value: ProbabilityDistribution{result=0, probability_entries=[0=0.9999390264428791, 1=4.2310667715858895E-5, 2=1.866288940503745E-5]}



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值