解析lightgbm的txt模型文件

news/2024/11/8 14:09:47/文章来源:https://www.cnblogs.com/yu007/p/18534935

根据近期的github方案,实现对txt格式的pmml文件的加载

添加依赖

<dependency><groupId>org.jpmml</groupId><artifactId>pmml-lightgbm</artifactId><version>1.5.4</version>
</dependency>
<dependency><groupId>org.jpmml</groupId><artifactId>pmml-evaluator</artifactId><version>1.6.6</version>
</dependency>
<dependency><groupId>org.jpmml</groupId><artifactId>pmml-model</artifactId><version>1.6.6</version>
</dependency>

工具类

import lombok.extern.slf4j.Slf4j;
import org.dmg.pmml.PMML;
import org.jpmml.evaluator.FieldValue;
import org.jpmml.evaluator.InputField;
import org.jpmml.evaluator.ModelEvaluator;
import org.jpmml.evaluator.ModelEvaluatorBuilder;
import org.jpmml.evaluator.ModelEvaluatorFactory;
import org.jpmml.evaluator.ProbabilityDistribution;
import org.jpmml.evaluator.TargetField;
import org.jpmml.lightgbm.GBDT;
import org.jpmml.lightgbm.HasLightGBMOptions;
import org.jpmml.lightgbm.LightGBMUtil;
import org.jpmml.model.metro.MetroJAXBUtil;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** 加载、初始化 PMML模型文件 :* 依赖 pmml-lightgbm-1.5.0(AGPL-3.0 License)* <p>* 解析PMML文件 @link https://github.com/jpmml/jpmml-lightgbm* 生成evaluator @link https://github.com/jpmml/jpmml-evaluator*/
@Slf4j
public class LightgbmTxtInitializer {// description = "Custom objective function"private static String objectiveFunction = null;// description = "Transform LightGBM-style trees to PMML-style trees",private static boolean compact = true;// description = "Treat Not-a-Number (NaN) values as missing values",private static boolean nanAsMissing = true;// description = "Limit the number of trees. Defaults to all trees"private static Integer numIteration = null;// description = "Target name. Defaults to \"_target\""private static String targetName = null;// description = "Target categories. Defaults to 0-based index [0, 1, .., num_class - 1]"private static List<String> targetCategories = null;public static void main(String[] output) throws Exception {Resource resource = new ClassPathResource("lightgbm_model.txt");InputStream pmmlFileInputStream = resource.getInputStream();// 生成模型执行器ModelEvaluator evaluator = initEvaluator(pmmlFileInputStream);// 打印特征参数List<InputField> inputFields = evaluator.getInputFields();log.info("ModelEvaluator featureNames:" + inputFields);// 调试执行预测Map<String, Number> waitPreSample = new HashMap<>(8);waitPreSample.put("0", 0.1);waitPreSample.put("1", 0.2);waitPreSample.put("2", 0.3);String predictedValue = getPredictedValue(waitPreSample, evaluator);pmmlFileInputStream.close();}public static ModelEvaluator initEvaluator(InputStream pmmlFileInputStream) throws Exception {GBDT gbdt;long begin = System.currentTimeMillis();gbdt = LightGBMUtil.loadGBDT(pmmlFileInputStream);log.info("Loaded GBDT in {} ms.", (System.currentTimeMillis() - begin));if (objectiveFunction != null) {log.info("Setting custom objective function");gbdt.setObjectiveFunction(LightGBMUtil.parseObjectiveFunction(objectiveFunction));}Map<String, Object> options = new LinkedHashMap<>();options.put(HasLightGBMOptions.OPTION_COMPACT, compact);options.put(HasLightGBMOptions.OPTION_NAN_AS_MISSING, nanAsMissing);options.put(HasLightGBMOptions.OPTION_NUM_ITERATION, numIteration);// 生成标准PMMLbegin = System.currentTimeMillis();PMML pmml;pmml = gbdt.encodePMML(options, targetName, targetCategories);long end = System.currentTimeMillis();log.info("Converted GBDT to PMML in {} ms.", (System.currentTimeMillis() - begin));// no need// 输出PMML格式文件begin = System.currentTimeMillis();File outputFile = new File("E://t.pmml");OutputStream os = new FileOutputStream(outputFile);MetroJAXBUtil.marshalPMML(pmml, os);log.info("Marshalled PMML in {} ms.", (System.currentTimeMillis() - begin));// 生成evaluatorbegin = System.currentTimeMillis();ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory.newInstance();ModelEvaluatorBuilder modelEvaluatorBuilder = new ModelEvaluatorBuilder(pmml);modelEvaluatorBuilder.setModelEvaluatorFactory(modelEvaluatorFactory);ModelEvaluator<?> evaluator = modelEvaluatorBuilder.build();evaluator.verify();log.info("Init evaluator in {} ms.", (System.currentTimeMillis() - begin));return evaluator;}public static String getPredictedValue(Map<String, ?> argumentMap,ModelEvaluator<?> evaluator) {// 预测计算Map<String, ?> evaluateResult = evaluator.evaluate(argumentMap);log.info("evaluateResult:" + evaluateResult);// 提取预测结果String predictedValue = null;TargetField targetFieldName = evaluator.getTargetField();Object targetFieldValue = evaluateResult.get(targetFieldName.getFieldName());// 输出预测结果if (targetFieldValue instanceof ProbabilityDistribution) {predictedValue = ((ProbabilityDistribution<?>) targetFieldValue).getPrediction().toString();log.info("Predicted value(ProbabilityDistribution) : " + predictedValue);} else if (targetFieldValue instanceof FieldValue) {FieldValue fieldValue = (FieldValue) targetFieldValue;predictedValue = fieldValue.asString();log.info("Predicted value(FieldValue) : " + predictedValue);} else if (targetFieldValue instanceof List) {List<String> resultList =((List<?>) targetFieldValue).stream().map(e -> ((FieldValue) e).asString()).collect(Collectors.toList());predictedValue = String.join(",", resultList);log.info("Predicted value(List) : " + predictedValue);} else {log.error("unknown type for targetFieldValue:" + targetFieldValue);}return predictedValue;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/828800.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

因为采购同行,造成的一次Java heap space 堆内存溢出

Caused by: java.sql.SQLException: Java heap space不多说了,没见过这样的。 报错原因是JVM内存XMX超了 Xms512m -Xmx2048m下班记得打卡

2个月搞定计算机二级C语言——真题(10)解析qg

合集 - 3个月搞定计算机二级C语言(6)1.2个月搞定计算机二级C语言——真题(5)解析10-292.2个月搞定计算机二级C语言——真题(6)解析10-303.2个月搞定计算机二级C语言——真题(7)解析11-034.2个月搞定计算机二级C语言——真题(8)解析11-035.2个月搞定计算机二级C语言——…

cmu15545-数据存储(Database Storage)

蓝图数据库自己管理磁盘数据和缓冲区,而不是通过操作系统管理(Os is not your friend.)。 三层视图 数据库以页(page)为存储数据的基本单位,文件(file)是一系列页的集合,页中存储页数据(data),形成文件-页-数据三层架构。 文件有不同的组织形式,页包含页头和页数据…

mysql分区表占用大量容量处理(优化)及归档分区表

背景 生产环境中,某个分区表两三年了,占用磁盘1T多,需要对前几年的数据做归档点击查看代码 SELECTtable_schema as 数据库,table_name as 表名,table_rows as 记录数,truncate(data_length/1024/1024, 2) as 数据容量(MB),truncate(index_length/1024/1024, 2) as 索引容量(…

深入理解Java虚拟机 --- 类加载机制

类的生命周期 类的生命周期:加载→验证→准备→解析→初始化→使用→卸载 类加载的时机 关于在什么情况下需要需要开始类加载过程的第一个阶段"加载",虚拟机并没有进行强制约束,这点交给虚拟机的具体实现来自由把握。 但严格规定了有且只有六种情况必须立即对类进…

深入理解Java虚拟机 --- 垃圾标记/收集算法

在开始本章之前,我们得了解一个概念,那就是我们怎么知道这个对象是"垃圾"?所以如何定义垃圾就成为我们第一个需要探讨的重要的点之一。 垃圾标记算法 常见的垃圾标记算法有:引用计数算法和可达性分析算法。 引用计数算法 实现思路 每个对象去额外存储一个引用计数…

深入理解Java虚拟机 --- 垃圾回收器

Serial收集器 HotSpot虚拟机运行在客户端模式下的默认新生代收集器。 类型:单线程串行垃圾回收器 垃圾收集算法:复制算法 作用区域:新生代 特点: 1、只会用单个线程去完成垃圾收集工作,用户线程会STW,直到收集结束。 2、没有线程交互,专心做垃圾收集,获得最高的单线程收…

【补档】玄武550电源怎么样? - 约呼的回答 - 知乎

【补档】玄武550电源怎么样? - 约呼的回答 - 知乎 约呼 一个路过的图吧用户 低预算整机非常推荐,高预算慎选。 低预算整机非常推荐,高预算慎选。 优点不少,缺点也有。 先说优点: 价格上来说便宜大碗,用料不错,部分型号反向虚标,比如550v4其实是按650w规格用料来做的,拆…

打造吸睛开场白:六招教你瞬间抓住客户心弦

开场白是在初次接触客户的头30秒至1分钟时间内,销售人员用以吸引目标客户注意力的简短言辞,通常涵盖前几句关键对话。 为了设计出一个引人入胜的开场白,以下策略值得尝试: 赞美客户赞美是人际交往中的润滑剂,恰当的赞美能迅速引起客户的关注。可以从客户的外观、着装、气质…

MM--项目中遇到的一些问题记录

采购订单: 创建采购订单时,供应商对应的信息记录已失效,但是切换供应商之后价格不会自动更新成0 1.SU01-查看用户对应的采购缺省值2.SPRO-维护采购缺省值 采购订单收货的时候,提示无符合条件的行项目 经打断点发现是由于程序中判断时公司间的内部交易所导致的,根本原因是因为采…

C#代码扫描工具SonarQube安装

前言 安装环境:Windows10+SonarQube 9.9.7 LTA Community Edition+jdk17+PostgreSQL 16.4+SonarScanner for .NET 9.0.1 在安装SonarQube 前需要搭建好jdk环境,这里我用的版本是jdk17,之前用过jdk1.8、jdk11和jdk21都失败了。还需提前安装第三方数据库,我用的是PostgreSQL …