从R中创建的pmml加载Scala / Java中的模型

时间:2017-06-09 15:53:37

标签: java r scala pmml

我想从R中保存PMML中的随机森林回归模型,并将其加载到Spark(Scala或Java)中。不幸的是,我在第二步中遇到了问题。

下面提供了在R中保存随机森林回归模型的PMML的最小示例。

当我尝试使用jpmml从Scala或Java加载此模型时(请参阅下面的代码),我收到以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: http://www.dmg.org/PMML-4_3

我可以克服编辑xml文件的错误:标记“PMML”中的属性“xmlns”包含错误消息中显示的URL。如果我完全删除了网址,或者我将4_3更改为4_2,则此错误消失。但是,会出现一条新的错误消息:

Exception in thread "main" org.jpmml.evaluator.UnsupportedFeatureException (at or around line 19): MiningModel

对于如何解决此特定错误,或者更一般地说,如何在Scala中加载在R中创建的pmml,您有任何建议或想法吗?

谢谢!

更新: @ user1808924回答的问题是jpmml库的版本。下面引用的代码现在可以正常工作。应加载正确的库,例如使用Maven Central Repository:

    <dependency>
        <groupId>org.jpmml</groupId>
        <artifactId>pmml-evaluator</artifactId>
        <version>1.3.6</version>
    </dependency>
    <dependency>
        <groupId>org.jpmml</groupId>
        <artifactId>pmml-model</artifactId>
        <version>1.3.7</version>
    </dependency>
    <dependency>
        <groupId>org.jpmml</groupId>
        <artifactId>pmml-spark</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

在R中保存随机森林回归模型的PMML的最小示例:

library(randomForest)
library(r2pmml)
data(mtcars)

MPGmodel.rf <- randomForest(mpg~., mtcars, ntree=5, do.trace=1)

# with package "r2pmml", convert model to pmml version 4.3 and save to xml:
r2pmml(MPGmodel.rf, "MPGmodel-r2pmml.pmml")

在Scala中加载模型:

import java.io.File
import org.jpmml.evaluator.Evaluator
import org.jpmml.spark.EvaluatorUtil

val fileNamePmml = "MPGmodel-r2pmml.pmml"
val pmmlFile = new File(fileNamePmml)
// the "UnsupportedFeature MiningModel" error appears here:
val myEvaluator: Evaluator = EvaluatorUtil.createEvaluator(pmmlFile)

我还尝试使用Java加载模型,并使用相同的错误消息:

import org.dmg.pmml.PMML;
import org.jpmml.evaluator.ModelEvaluator;
import org.jpmml.evaluator.ModelEvaluatorFactory;
import java.io.*;
import java.util.Scanner;
import java.io.ByteArrayInputStream;

File pmmlFile = new File(fileNamePmml );

// the pmml file is successfully loaded as a string:
String pmmlString = null;
pmmlString = new Scanner(pmmlFile).useDelimiter("FILEFINISHESHERE").next();

// a PMML object is successfully created from the pmml string:
PMML myPmml = null;
try(InputStream is = new ByteArrayInputStream(pmmlString.getBytes())){
    myPmml = org.jpmml.model.PMMLUtil.unmarshal(is);
}

// the "UnsupportedFeature MiningModel" error appears here:
ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory.newInstance();
ModelEvaluator<?> modelEvaluator = modelEvaluatorFactory.newModelEvaluator(myPmml);

2 个答案:

答案 0 :(得分:1)

您正在使用旧版JPMML库,该库已在3年多前停止使用。当然,它不支持从那时起添加的新PMML功能(例如PMML 4.2和4.3模式)。

只需升级到JPMML-Evaluator库。作为奖励,您的代码将更短更清洁。

答案 1 :(得分:1)

您可以使用PMML4S在Scala中加载PMML模型,例如:

import org.pmml4s.model.Model

val model = Model.fromFile("MPGmodel-r2pmml.pmml")
val result = model.predict(data)

输入data可以是地图,键和值对列表,数组,json或PMML4S的系列。