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. AWS的load balance

    Route53实现了地理上的load balance; ELB实现了region内的load balance CloudFront实现了静态内容的全网加速 ZULh?*;&T(

  2. NS Simulation Basic

    这个网站上的一系列讲解NS2的内容真的是深入浅出,看完立刻豁然开朗.所以就接连转了几篇. Scheduling Events那篇里的例子特别好,看完就懂了. http://www.mathcs.emo ...

  3. ASP.NET 4.5 MVC 4 无法在Windows2008的IIS7.0上解决方案

    环境 :    Windows2008 R2 Standard IIS 7.5     VS2012 SQL2005 最近才接触MVC4 自己做了个小实例 准备部署在 win2008 的IIS7.5 ...

  4. stream操作 z

    常见并常用的stream一共有 文件流(FileStream), 内存流(MemoryStream), 压缩流(GZipStream), 加密流(CrypToStream), 网络流(NetworkS ...

  5. CentOS7 Firewall超详细使用方法

    CentOs7改变的最大处就是防火墙了,下面列用了常用的防火墙规则,端口转发和伪装 一.Firewalld基础规则 --get-default-zone 打印已设置为默认区域的当前区域,默认情况下默认 ...

  6. MSSQL注入常用SQL语句整理

    很多情况下使用工具对mssql注入并不完善,所以我们就需要手工注入,一下是本人收集的一些mssql的sql语句. 手工MSSQL注入常用SQL语句 and exists (select * from ...

  7. mysql 修改已存在的表增加ID属性为auto_increment自动增长

    今天有需要将已经存在表设置自动增长属性 具体如下 alter table customers change id id int not null auto_increment primary key; ...

  8. 用w32tm设置服务器时间同步

    服务器时间同步是一个容易被忽视的问题,但在企业级应用环境中,不同服务器之间的时间差很可能引发应用系统问题.Windows提供的w32tm程序可以用来设置时间同步服务器,其用法如下: 1.指定外部时间源 ...

  9. C#图解教程读书笔记(第5章 方法)

    类型推断和var关键字 从C#3.0开始,可以在变量声明的开始部分的的位置使用新的关键字var. Var关键字并不是某种特别类型的符号.它只是句法上的速记,表示任何可以从初始化的右边推断出的类型. V ...

  10. 一对一关联关系基于主键映射的异常 IdentifierGenerationException

    具体异常:org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one pro ...