JPMML解析Random Forest模型并使用其预测分析

导入Jar包

maven 的pom.xml文件中添加jpmml的依赖

<dependency>
<groupId>org.jpmml</groupId>
<artifactId>pmml-evaluator</artifactId>
<version>1.3.7</version>
</dependency>

具体实现代码

模型读取类

import java.io.*;
import java.nio.charset.Charset;
import java.util.*; import com.google.common.io.Files;
import org.dmg.pmml.FieldName; /**
* 使用模型
* @author biantech
*
*/
public class PmmlCalc {
final static String utf8="utf-8";
public static void main(String[] args) throws IOException {
if(args.length < 2){
System.out.println("参数个数不匹配");
}
//文件生成路径
String pmmlPath = args[0];
String modelArgsFilePath = args[1];
PmmlInvoker invoker = new PmmlInvoker(pmmlPath);
List<Map<FieldName, String>> paramList = readInParams(modelArgsFilePath);
int lineNum = 0; //当前处理行数
File file = new File("result.txt");
for(Map<FieldName, String> param : paramList){
lineNum++;
//System.out.println("======当前行: " + lineNum + "=======");
Files.append("======当前行: " + lineNum + "=======",file,Charset.forName(utf8));
Map<FieldName, ?> result = invoker.invoke(param);
Set<FieldName> keySet = result.keySet(); //获取结果的keySet
for(FieldName fn : keySet){
String tempString = result.get(fn).toString()+"\n";
Files.append(tempString,file,Charset.forName(utf8));
}
}
System.out.println("resultFile="+file.getAbsolutePath());
} /**
* 读取参数文件
* @param filePath 文件路径
* @return
* @throws IOException
*/
public static List<Map<FieldName,String>> readInParams(String filePath) throws IOException{
InputStream is;
is = PmmlCalc.class.getClassLoader().getResourceAsStream(filePath);
if(is==null){
is = new FileInputStream(filePath);
}
InputStreamReader isreader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isreader);
String[] nameArr = br.readLine().split(","); //读取表头的名字
ArrayList<Map<FieldName,String>> list = new ArrayList<>();
String paramLine; //一行参数
//循环读取 每次读取一行数据
while((paramLine = br.readLine()) != null){
Map<FieldName,String> map = new HashMap<>();
String[] paramLineArr = paramLine.split(",");
for(int i=0; i<paramLineArr.length; i++){//一次循环处理一行数据
map.put(new FieldName(nameArr[i]), paramLineArr[i]); //将表头和值组成map 加入list中
}
list.add(map);
}
is.close();
return list;
}
}

调用执行类:PmmlInvoker

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import javax.xml.bind.JAXBException;
import org.dmg.pmml.FieldName;
import org.dmg.pmml.PMML;
import org.jpmml.evaluator.ModelEvaluator;
import org.jpmml.evaluator.ModelEvaluatorFactory;
import org.jpmml.model.PMMLUtil;
import org.xml.sax.SAXException;
/**
* 读取pmml 获取模型
* @author biantech
*
*/
public class PmmlInvoker {
private ModelEvaluator modelEvaluator;
// 通过文件读取模型
public PmmlInvoker(String pmmlFileName) {
PMML pmml = null;
InputStream is = null;
try {
if (pmmlFileName != null) {
is = PmmlInvoker.class.getClassLoader().getResourceAsStream(pmmlFileName);
if(is==null){
is = new FileInputStream(pmmlFileName);
}
pmml = PMMLUtil.unmarshal(is);
}
this.modelEvaluator = ModelEvaluatorFactory.newInstance().newModelEvaluator(pmml);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(is!=null)
is.close();
} catch (Exception localIOException3) {
localIOException3.printStackTrace();
}
}
this.modelEvaluator.verify();
System.out.println("模型读取成功");
} // 通过输入流读取模型
public PmmlInvoker(InputStream is) {
PMML pmml;
try {
pmml = PMMLUtil.unmarshal(is);
try {
is.close();
} catch (IOException localIOException) { }
this.modelEvaluator = ModelEvaluatorFactory.newInstance().newModelEvaluator(pmml);
} catch (SAXException e) {
pmml = null;
} catch (JAXBException e) {
pmml = null;
} finally {
try {
is.close();
} catch (IOException localIOException3) {
}
}
this.modelEvaluator.verify();
} public Map<FieldName, String> invoke(Map<FieldName, String> paramsMap) {
return this.modelEvaluator.evaluate(paramsMap);
}
}

如何运行

  1. mvn package  命令生成 jpmml-parser-1-jar-with-dependencies.jar
  2. 将pmml文件, 数据集文件,jar 放在同一个目录下.(如 demo-model.pmml ,demo-data.csv)
  3. 使用命令行运行

    java -jar jpmml-parser-1-jar-with-dependencies.jar demo-model.pmml demo-data.csv

  4. 运行结束后会生成一个result.txt,里面存储的是对数据的预测分析结果
======当前行: 1=======ProbabilityDistribution{result=setosa, probability_entries=[setosa=1.0]}
setosa
1.0
0.0
0.0
======当前行: 2=======ProbabilityDistribution{result=setosa, probability_entries=[setosa=1.0]}
setosa
1.0
0.0
0.0
======当前行: 3=======ProbabilityDistribution{result=setosa, probability_entries=[setosa=1.0]}
setosa
1.0
0.0
0.0
======当前行: 4=======ProbabilityDistribution{result=setosa, probability_entries=[setosa=1.0]}
setosa
1.0
0.0
0.0
======当前行: 5=======ProbabilityDistribution{result=setosa, probability_entries=[setosa=1.0]}
setosa
1.0
0.0
0.0
======当前行: 6=======ProbabilityDistribution{result=setosa, probability_entries=[setosa=1.0]}
setosa
1.0
0.0
0.0

具体源代码请看如下地址

https://github.com/biantech/jpmml-parser

 

JPMML解析PMML模型并导入数据进行分析生成结果的更多相关文章

  1. 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件

    小程序导入,别人导出的数据库json文件,错误信息如下: 导入数据库失败, Error: Poll error, 导入数据任务(id:373985)异常,错误信息:解析导入文件错误,请检查导入文件内容 ...

  2. Elasticsearch —— bulk批量导入数据

    在使用Elasticsearch的时候,一定会遇到这种场景--希望批量的导入数据,而不是一条一条的手动导入.那么此时,就一定会需要bulk命令! 更多内容参考我整理的Elk教程 bulk批量导入 批量 ...

  3. android 导入数据(通讯录)

    接着android 中导出数据 一文,下面介绍在android中导入数据的思路: 1.将数据从文本中读取出来 2.封装处理成自己想要的对象或模型 3.将处理好的数据对象插入自己应用的数据库中 4.更新 ...

  4. C#实现Excel模板导出和从Excel导入数据

    午休时间写了一个Demo关于Excel导入导出的简单练习 1.窗体 2.引用office命名空间 添加引用-程序集-扩展-Microsoft.Office.Interop.Excel 3.封装的Exc ...

  5. Python数据可视化编程实战——导入数据

    1.从csv文件导入数据 原理:with语句打开文件并绑定到对象f.不必担心在操作完资源后去关闭数据文件,with的上下文管理器会帮助处理.然后,csv.reader()方法返回reader对象,通过 ...

  6. 使用Jsoup帮助解析具有html标签的数据和解析网页

    下载Jsoup包后导入 /** * Created by YGW on 2016/4/17. * 显示公告的详细内容 */public class PressFragment extends Frag ...

  7. sqoop:mysql和Hbase/Hive/Hdfs之间相互导入数据

    1.安装sqoop 请参考http://www.cnblogs.com/Richardzhu/p/3322635.html 增加了SQOOP_HOME相关环境变量:source ~/.bashrc  ...

  8. Solr 07 - Solr从MySQL数据库中导入数据 (Solr DIH的使用示例)

    目录 1 加入数据导入处理器的jar包 2 加入数据库驱动包 3 配置solrconfig.xml文件 3.1 配置lib标签 - 加入驱动jar包 3.2 配置requestHandler标签 - ...

  9. [转]Greenplum 通过gpfdist + EXTERNAL TABLE 并行导入数据

    摘要: Greenplum 提供了快速导入数据的方法,下面通过一个例子演示给大家. Greenplum 提供了快速导入数据的方法,下面通过一个例子演示给大家. 我们用TPCH测试中最大的表做导入测试 ...

随机推荐

  1. UIButton的titleLabel

    UIButton的titleLabel @property(nonatomic, readonly, retain) UILabel *titleLabel Description - 描述A vie ...

  2. angular2 ng build --prod 报错:Module not found: Error: Can't resolve './$$_gendir/app/app.module.ngfactory'

    调试页面 ng serve 正常 ng build 也正常 ng build --prod 异常:Module not found: Error: Can't resolve './$$_gendir ...

  3. 运维不仅仅是懂Linux就行,还需要知道这些……

    运维不仅仅是懂Linux就行,因为还有一大部分的Windows运维,最近看一个报道说,windows的服务器占了47.71%.嗯,向windows运维人员致敬.当然我们这篇文章不是说运维除了懂Linu ...

  4. 设计模式:装饰器(Decorator)模式

    设计模式:装饰器(Decorator)模式 一.前言    装饰器模式也是一种非常重要的模式,在Java以及程序设计中占据着重要的地位.比如Java的数据流处理,我们可能看到数据流经过不同的类的包装和 ...

  5. PHP:通过MVC,实现第三方登录(百度)

    这里,仓鼠将手把手记录下来实现第三方登录的流程,这里以百度为例 百度开发者中心-官方网址:传送门. 所有第三方接口都不支持本地调试,只有真实的项目和服务器才有可能申请成功. 所以申请的资料全部都要填写 ...

  6. 来自Google资深工程师的API设计最佳实践

    来自Google资深工程师Joshua Bloch的分享:API设计最佳实践 为什么API设计如此重要?API是一个公司最重要的资产. 为什么API的设计对程序员如此重要? API一旦发布,出于兼容性 ...

  7. c++中左值的含义

    <<cpp primer plus 6th edition>>中的原文(Chapter 8 Adventures in Functions): What is an lvalu ...

  8. PHP-------MySQLi 的函数

    MySQLi 的函数 在数据库中找到一张是自增长的科目表表就可以, Code主键值是自增长的,name是varchar类型的. 如果想往科目表里添加一条数据,是自增长列的表中添加数据,添加完之后,取添 ...

  9. 虚拟机Centos安装docker小记

    本书记录是参考 <Spring Cloud 与 Docker 微服务架构实战(第二版)>这本书实现的. 记录简单几个命令,安装顺序如下: 1. 安装docker所需的包 sudo yum ...

  10. Telnet配置

    一.环境 路由 IP:192.168.56.2 本地云 IP:192.168.56.1 二.认证模式 AAA模式 认证 授权 计费的安全技术 当配置用户界面的认证方式为AAA时, 用户登录设备时需要首 ...