jpmml / r2pmml

R library for converting R models to PMML
GNU Affero General Public License v3.0
73 stars 18 forks source link

Using r2pmml for Regression ranger returns issue with variable levels #22

Closed laserman2000 closed 7 years ago

laserman2000 commented 7 years ago

If we use the iris dataset to create a regression model [e.g. iris.ranger = ranger(Sepal.Width ~ ., data = iris, num.trees = 7, write.forest = TRUE)] then the r2pmml function

r2pmml(iris.ranger, "iris_ranger.pmml", variable.levels = sapply(iris, levels))

Returns the following error

SEVERE: Failed to convert
java.lang.IllegalArgumentException
        at org.jpmml.converter.ValueUtil.asInt(ValueUtil.java:109)
        at org.jpmml.rexp.RangerConverter.encodeNode(RangerConverter.java:295)
        at org.jpmml.rexp.RangerConverter.encodeNode(RangerConverter.java:320)
        at org.jpmml.rexp.RangerConverter.encodeNode(RangerConverter.java:315)
        at org.jpmml.rexp.RangerConverter.encodeNode(RangerConverter.java:320)
        at org.jpmml.rexp.RangerConverter.encodeTreeModel(RangerConverter.java:264)
        at org.jpmml.rexp.RangerConverter.encodeForest(RangerConverter.java:249)
        at org.jpmml.rexp.RangerConverter.encodeRegression(RangerConverter.java:158)
        at org.jpmml.rexp.RangerConverter.encodeModel(RangerConverter.java:137)
        at org.jpmml.rexp.RangerConverter.encodeModel(RangerConverter.java:45)
        at org.jpmml.rexp.ModelConverter.encodePMML(ModelConverter.java:78)
        at org.jpmml.rexp.ModelConverter.encodePMML(ModelConverter.java:70)
        at org.jpmml.rexp.Main.run(Main.java:149)
        at org.jpmml.rexp.Main.main(Main.java:97)

Exception in thread "main" java.lang.IllegalArgumentException
        at org.jpmml.converter.ValueUtil.asInt(ValueUtil.java:109)
        at org.jpmml.rexp.RangerConverter.encodeNode(RangerConverter.java:295)
        at org.jpmml.rexp.RangerConverter.encodeNode(RangerConverter.java:320)
        at org.jpmml.rexp.RangerConverter.encodeNode(RangerConverter.java:315)
        at org.jpmml.rexp.RangerConverter.encodeNode(RangerConverter.java:320)
        at org.jpmml.rexp.RangerConverter.encodeTreeModel(RangerConverter.java:264)
        at org.jpmml.rexp.RangerConverter.encodeForest(RangerConverter.java:249)
        at org.jpmml.rexp.RangerConverter.encodeRegression(RangerConverter.java:158)
        at org.jpmml.rexp.RangerConverter.encodeModel(RangerConverter.java:137)
        at org.jpmml.rexp.RangerConverter.encodeModel(RangerConverter.java:45)
        at org.jpmml.rexp.ModelConverter.encodePMML(ModelConverter.java:78)
        at org.jpmml.rexp.ModelConverter.encodePMML(ModelConverter.java:70)
        at org.jpmml.rexp.Main.run(Main.java:149)
        at org.jpmml.rexp.Main.main(Main.java:97)

Does r2pmml support Regression forest for the ranger package? If yes, how can we pass the variable.levels argument?

Thanks!

vruusmann commented 7 years ago

What is your r2pmml package version?

The following R script executes cleanly with ranger 0.6.0 and r2pmml 0.13.0:

library("ranger")
library("r2pmml")

data(iris)

iris.ranger = ranger(Sepal.Width ~ ., data = iris, num.trees = 7, write.forest = TRUE)
r2pmml(iris.ranger, "iris_ranger.pmml", variable.levels = sapply(iris, levels))
laserman2000 commented 7 years ago

Thanks for the speedy reply.

I was using ranger 0.7.0 in R 3.3.3. I'm looking to find 0.6.0, but it seems it's missing (https://cran.r-project.org/src/contrib/ranger_0.6.0.tar.gz).

vruusmann commented 7 years ago

I upgraded ranger package from 0.6.0 to 0.7.0, and I'm getting the same exception now. Will investigate.

vruusmann commented 7 years ago

@laserman2000 Upgrade to r2pmml version 0.13.1, and the conversion will succeed.

laserman2000 commented 7 years ago

Checked it and it works great! Thanks!