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);
    }
}

如何運行

  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM