从 R 中创建的 pmml 加载 Scala/Java 中的模型
Load model in Scala/Java from pmml created in R
我想在 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。如果我完全删除 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 中央存储库:
<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);
您使用的是旧版 JPMML 库,该库已在 3 年多前停用。当然,它不支持从那时起添加的新 PMML 功能(例如 PMML 4.2 和 4.3 模式)。
只需升级到JPMML-Evaluator库。作为奖励,您的代码将更短更清晰。
您可以使用 PMML4S 在 Scala 中加载 PMML 模型,例如:
import org.pmml4s.model.Model
val model = Model.fromFile("MPGmodel-r2pmml.pmml")
val result = model.predict(data)
输入 data
可以是映射、键值对列表、数组 json 或 PMML4S 的系列。
我想在 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。如果我完全删除 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 中央存储库:
<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);
您使用的是旧版 JPMML 库,该库已在 3 年多前停用。当然,它不支持从那时起添加的新 PMML 功能(例如 PMML 4.2 和 4.3 模式)。
只需升级到JPMML-Evaluator库。作为奖励,您的代码将更短更清晰。
您可以使用 PMML4S 在 Scala 中加载 PMML 模型,例如:
import org.pmml4s.model.Model
val model = Model.fromFile("MPGmodel-r2pmml.pmml")
val result = model.predict(data)
输入 data
可以是映射、键值对列表、数组 json 或 PMML4S 的系列。