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

原创 2017年07月05日 20:03:46

准备pmml文件,数据集文件

如果没有可以参考我的博客:R训练Random Forest并转换成PMML
所有文件我的github上都有 地址在页面最下方

导入Jar包

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

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

具体实现代码

模型读取类:ModelInvoker

package pmmlParser;

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 liaotuo
 *
 */
public class ModelInvoker {
    private ModelEvaluator modelEvaluator;

    // 通过文件读取模型
    public ModelInvoker(String pmmlFileName) {
        PMML pmml = null;
        InputStream is = null;
        try {
            if (pmmlFileName != null) {
                is = ModelInvoker.class.getClassLoader().getResourceAsStream(pmmlFileName);
                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();
        System.out.println("模型读取成功");
    }

    // 通过输入流读取模型
    public ModelInvoker(InputStream is) {
        PMML pmml = null;
        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, ?> invoke(Map<FieldName, Object> paramsMap) {
        return this.modelEvaluator.evaluate(paramsMap);
    }
}

调用执行类:ModelCalc

package pmmlParser;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.dmg.pmml.FieldName;

/**
 * 使用模型
 * @author liaotuo
 *
 */
public class ModelCalc {
    public static void main(String[] args) throws IOException {
        if(args.length < 2){
            System.out.println("参数个数不匹配");
        }
         //文件生成路径   
        PrintStream ps=new PrintStream("D:\\result.txt");   
        System.setOut(ps);   

        String pmmlPath = args[0];  
        String modelArgsFilePath = args[1];

        ModelInvoker invoker = new ModelInvoker(pmmlPath);
         List<Map<FieldName, Object>> paramList = readInParams(modelArgsFilePath);
         int lineNum = 0;  //当前处理行数
         for(Map<FieldName, Object> param : paramList){
             lineNum++;
             System.out.println("======当前行: " + lineNum + "=======");
             Map<FieldName, ?> result = invoker.invoke(param);
             Set<FieldName> keySet = result.keySet();  //获取结果的keySet
             for(FieldName fn : keySet){
                 System.out.println(result.get(fn).toString());
             }
         }
    }

    /**
     * 读取参数文件
     * @param filePath
     * @return
     * @throws IOException 
     */
    private static List<Map<FieldName,Object>> readInParams(String filePath) throws IOException{
        BufferedReader br = new BufferedReader(new FileReader(filePath));
        String[] nameArr = br.readLine().split(",");  //读取表头的名字

        List<Map<FieldName,Object>> list = new ArrayList();
        String paramLine = null;  //一行参数
        //循环读取  每次读取一行数据
        while((paramLine = br.readLine()) != null){
            Map<FieldName,Object> map = new HashMap<FieldName, Object>();
            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);
        }
        return list;
    }

}

如何运行

1.导出成可运行的Jar
2.将pmml文件, 数据集文件,jar 放在同一个目录下
这里写图片描述
3.使用命令行运行:
这里写图片描述
4.运行结束后会生成一个result.txt在D盘根目录下,里面存储的是对数据的预测分析结果:

这里写图片描述

源代码github地址:https://github.com/liaotuo/pmmlParser
这样就成功了,有疑问可以留言,有错误希望指出,互相学习。。

版权声明:欢迎转载,请注明原文地址:http://blog.csdn.net/c1481118216

XGBoost模型文件转化为PMML

运用java包和指令行讲XGBoost模型转化为PMML通用模型文件。 前期准备 下载jpmml-xgboost, https://github.com/jpmml/jpmml-xgboost/...
  • Sinsa110
  • Sinsa110
  • 2016年08月13日 22:54
  • 4881

Spark加载PMML进行预测

软件版本:CDH:5.8.0 , CDH-hadoop :2.6.0 ; CDH-spark :1.6.0 目标:使用Spark 加载PMML文件到模型,并使用Spark平台进行预测(这里测试使用的是...
  • fansy1990
  • fansy1990
  • 2016年11月25日 22:28
  • 5992

JPMML打分流程

准备数据输入数据即预测变量数据集,不包括目标标量。预测变量由挖掘模式 (Mining Schema) 定义,每一个预测变量的属性在数据字典中定义。数据预处理该过程的主要目的是检测输入数据的有效行。 遗...
  • c1481118216
  • c1481118216
  • 2017年11月01日 13:49
  • 124

jpmml全部Jar包和source包

  • 2017年10月17日 10:33
  • 6.5MB
  • 下载

机器学习算法线上部署方法

本文由携程技术中心投递,ID:ctriptech。作者:潘鹏举,携程酒店研发BI经理,负责酒店服务相关的业务建模工作,主要研究方向是用机器学习实现业务流程自动化、系统智能化、效率最优化,专注于算法实践...
  • u012294181
  • u012294181
  • 2017年01月15日 20:25
  • 3204

将python或R生成的模型存为PMML供java调用

查看jpmml的说明文档:https://github.com/jpmml/jpmml-evaluator 其它参考资料 1、XGBoost模型文件转化为PMML 2、JPMML Example ...
  • u010035907
  • u010035907
  • 2017年05月27日 10:33
  • 3865

PMML模型文件在机器学习的实践经验

算法工程师和业务开发工程师,所掌握的技能容易在长期的工作中出现比较深的鸿沟,算法工程师辛辛苦苦调参的成果,业务工程师可能不清楚如何使用,如何为线上决策给予支持。本文介绍一种基于PMML的模型上线方法。...
  • hopeztm
  • hopeztm
  • 2017年10月23日 18:33
  • 1817

Sklearn-RandomForest随机森林

在scikit-learn中,RandomForest的分类类是RandomForestClassifier,回归类是RandomForestRegressor,需要调参的参数包括两部分,第一部分是B...
  • CherDW
  • CherDW
  • 2017年02月10日 16:28
  • 20860

机器学习中的算法:决策树模型组合之随机森林(Random Forest)

随机森林(Random Forest):     随机森林是一个最近比较火的算法,它有很多的优点:     在数据集上表现良好    在当前的很多数据集上,相对其他算法有着很大的优势   ...
  • u012564690
  • u012564690
  • 2014年05月13日 14:15
  • 32204

【机器学习】决策树及Bagging, Random Forest和Boosting模型融合

前言一晃一个月没写博客了。懒癌又犯了TT。 之前提到过,写博客是为了记录实习中学到的点滴。博主在某家做travelling IT solution的公司实习。公司核心业务还是做Global Dist...
  • AmourDeMai
  • AmourDeMai
  • 2016年05月19日 21:49
  • 4214
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JPMML解析Random Forest模型并使用其预测分析
举报原因:
原因补充:

(最多只允许输入30个字)