Clannad_汐

所有成功的背后,都是痛苦的坚持,所有的痛苦,都是傻瓜般的不放弃!

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

准备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 https://blog.csdn.net/c1481118216/article/details/74496902
个人分类: pmml
想对作者说点什么? 我来说一句

jpmml全部Jar包和source包

2017年10月17日 6.5MB 下载

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭