JPMML解析PMML模型并导入数据进行分析生成结果
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);
}
}
如何运行
- mvn package 命令生成 jpmml-parser-1-jar-with-dependencies.jar
- 将pmml文件, 数据集文件,jar 放在同一个目录下.(如 demo-model.pmml ,demo-data.csv)
使用命令行运行
java -jar jpmml-parser-1-jar-with-dependencies.jar demo-model.pmml demo-data.csv

- 运行结束后会生成一个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模型并导入数据进行分析生成结果的更多相关文章
- 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件
小程序导入,别人导出的数据库json文件,错误信息如下: 导入数据库失败, Error: Poll error, 导入数据任务(id:373985)异常,错误信息:解析导入文件错误,请检查导入文件内容 ...
- Elasticsearch —— bulk批量导入数据
在使用Elasticsearch的时候,一定会遇到这种场景--希望批量的导入数据,而不是一条一条的手动导入.那么此时,就一定会需要bulk命令! 更多内容参考我整理的Elk教程 bulk批量导入 批量 ...
- android 导入数据(通讯录)
接着android 中导出数据 一文,下面介绍在android中导入数据的思路: 1.将数据从文本中读取出来 2.封装处理成自己想要的对象或模型 3.将处理好的数据对象插入自己应用的数据库中 4.更新 ...
- C#实现Excel模板导出和从Excel导入数据
午休时间写了一个Demo关于Excel导入导出的简单练习 1.窗体 2.引用office命名空间 添加引用-程序集-扩展-Microsoft.Office.Interop.Excel 3.封装的Exc ...
- Python数据可视化编程实战——导入数据
1.从csv文件导入数据 原理:with语句打开文件并绑定到对象f.不必担心在操作完资源后去关闭数据文件,with的上下文管理器会帮助处理.然后,csv.reader()方法返回reader对象,通过 ...
- 使用Jsoup帮助解析具有html标签的数据和解析网页
下载Jsoup包后导入 /** * Created by YGW on 2016/4/17. * 显示公告的详细内容 */public class PressFragment extends Frag ...
- sqoop:mysql和Hbase/Hive/Hdfs之间相互导入数据
1.安装sqoop 请参考http://www.cnblogs.com/Richardzhu/p/3322635.html 增加了SQOOP_HOME相关环境变量:source ~/.bashrc ...
- Solr 07 - Solr从MySQL数据库中导入数据 (Solr DIH的使用示例)
目录 1 加入数据导入处理器的jar包 2 加入数据库驱动包 3 配置solrconfig.xml文件 3.1 配置lib标签 - 加入驱动jar包 3.2 配置requestHandler标签 - ...
- [转]Greenplum 通过gpfdist + EXTERNAL TABLE 并行导入数据
摘要: Greenplum 提供了快速导入数据的方法,下面通过一个例子演示给大家. Greenplum 提供了快速导入数据的方法,下面通过一个例子演示给大家. 我们用TPCH测试中最大的表做导入测试 ...
随机推荐
- IONIC屏幕方向锁定
如果希望阻止app在设备旋转时发生横屏,可以使用这个插件: cordova plugin add cordova-plugin-screen-orientation // set to either ...
- 全国大学生数据挖掘邀请赛中的NDCG
转:http://www.zhizhihu.com/html/y2011/2794.html 评价标准 性能良好的评分模型,应该能够给予那些引起msg或click的候选会员更高的评分(排序靠前),从而 ...
- 在windows平台上构建自己的PHP(仅适用于php5.2)
构建步骤 1, 安装vs2008 2, 安装windows sdk 6.1 3, 下载php 5.2源码,可以从此处获取Releases(先不要解压) 4, 下载bindlib_w32.zip,htt ...
- SNMP协议详解
简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议.在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案:由于SNMP的简单性,在Inter ...
- 针对ArcGIS Server 跨域问题的解释
在博客Hello World文章中提起过,以前在sinaapp中建立过wordpress博客,也写过一篇关于ArcGIS JavaScript API的文章,但是由于sinaapp开始收费以后,我的个 ...
- O(1) 和 O(n) 的区别
举个简单的例子,要从0加到n,我们会这么写:int sum = 0;for(int i = 0; i<=n; ++i){ sum += i;}一共算了n次加法,那么就说这个时间复杂度是O(n ...
- 关于映射异常org.hibernate.MappingException: An association from the table DUTY_INFO refers to an unmapped class: com.pms.entities.other.Department的原因。
在编程过程当中由于修改过了包名. 原来的包名是: com.pms.entities.base 然后改为了:com.pms.entities.other 当我重新映射生成数据表的时候就报错:org.hi ...
- is和as在类型转换时的性能差异
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xxdddail/article/details/36655219 is和as是.NET中经常使用的操 ...
- 18、配置嵌入式servlet容器(2)
使用其他Servlet容器 -Jetty(长连接) -Undertow(不支持jsp) 替换为其他嵌入式Servlet容器 默认支持: Tomcat(默认使用) Jetty: <depend ...
- Selenium应用代码(常见封装的方法二)
滚动窗口: //将滚动条滚到适合的位置 , 方法一 public static void setScroll(WebDriver driver,int height){ try { // String ...