jpmml / r2pmml

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

Failing to convert when using r2pmml and GLM #43

Closed Clls1 closed 6 years ago

Clls1 commented 6 years ago

I have done an ensemble through caretStacking and now I needed to extract the pmmls from the models However i am having problems with one of them, namely the glm. My model is an ensemble of a glm with a rf trough a gbm. As the gbm is the ensemble model, it only receives 2 variables the one from the glm and the other from the gbm. For extracting the ensemble model (the gbm) I did:

library(r2pmml)
r2pmml(gbm_ensemble$ens_model, "ens_ensemble.pmml")

and it went ok. After for extracting the rf i did:

r2pmml(gbm_ensemble$models$rf$finalModel, "rf_ensemble_test.pmml")

which also went ok.

With the same logic, I tried the glm but it din't work.

r2pmml(gbm_ensemble$models$glm$finalModel, "glm_ensemble_test.pmml")

Can someone help me please? Thank you!

Error discription:

abr 24, 2018 6:43:58 PM org.jpmml.rexp.Main run
INFO: Parsing RDS..
abr 24, 2018 6:44:08 PM org.jpmml.rexp.Main run
SEVERE: Failed to parse RDS
java.lang.ClassCastException: org.jpmml.rexp.RFunctionCall cannot be cast to org.jpmml.rexp.RPair
    at org.jpmml.rexp.RExpParser.readFunctionCall(RExpParser.java:218)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:82)
    at org.jpmml.rexp.RExpParser.readFunctionCall(RExpParser.java:218)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:82)
    at org.jpmml.rexp.RExpParser.readPromise(RExpParser.java:208)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:80)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readEnvironment(RExpParser.java:195)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:78)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readEnvironment(RExpParser.java:195)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:78)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readEnvironment(RExpParser.java:195)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:78)
    at org.jpmml.rexp.RExpParser.readTag(RExpParser.java:461)
    at org.jpmml.rexp.RExpParser.readPromise(RExpParser.java:206)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:80)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readEnvironment(RExpParser.java:195)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:78)
    at org.jpmml.rexp.RExpParser.readTag(RExpParser.java:461)
    at org.jpmml.rexp.RExpParser.readPromise(RExpParser.java:206)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:80)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readEnvironment(RExpParser.java:195)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:78)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readAttributes(RExpParser.java:477)
    at org.jpmml.rexp.RExpParser.readAttributes(RExpParser.java:470)
    at org.jpmml.rexp.RExpParser.readFunctionCall(RExpParser.java:214)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:82)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readAttributes(RExpParser.java:477)
    at org.jpmml.rexp.RExpParser.readAttributes(RExpParser.java:470)
    at org.jpmml.rexp.RExpParser.readVector(RExpParser.java:329)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:97)
    at org.jpmml.rexp.RExpParser.readVector(RExpParser.java:324)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:97)
    at org.jpmml.rexp.RExpParser.parse(RExpParser.java:53)
    at org.jpmml.rexp.Main.run(Main.java:109)
    at org.jpmml.rexp.Main.main(Main.java:97)

Exception in thread "main" java.lang.ClassCastException: org.jpmml.rexp.RFunctionCall cannot be cast to org.jpmml.rexp.RPair
    at org.jpmml.rexp.RExpParser.readFunctionCall(RExpParser.java:218)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:82)
    at org.jpmml.rexp.RExpParser.readFunctionCall(RExpParser.java:218)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:82)
    at org.jpmml.rexp.RExpParser.readPromise(RExpParser.java:208)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:80)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readEnvironment(RExpParser.java:195)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:78)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readEnvironment(RExpParser.java:195)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:78)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readEnvironment(RExpParser.java:195)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:78)
    at org.jpmml.rexp.RExpParser.readTag(RExpParser.java:461)
    at org.jpmml.rexp.RExpParser.readPromise(RExpParser.java:206)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:80)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readEnvironment(RExpParser.java:195)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:78)
    at org.jpmml.rexp.RExpParser.readTag(RExpParser.java:461)
    at org.jpmml.rexp.RExpParser.readPromise(RExpParser.java:206)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:80)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readEnvironment(RExpParser.java:195)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:78)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readAttributes(RExpParser.java:477)
    at org.jpmml.rexp.RExpParser.readAttributes(RExpParser.java:470)
    at org.jpmml.rexp.RExpParser.readFunctionCall(RExpParser.java:214)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:82)
    at org.jpmml.rexp.RExpParser.readPairList(RExpParser.java:155)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:74)
    at org.jpmml.rexp.RExpParser.readAttributes(RExpParser.java:477)
    at org.jpmml.rexp.RExpParser.readAttributes(RExpParser.java:470)
    at org.jpmml.rexp.RExpParser.readVector(RExpParser.java:329)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:97)
    at org.jpmml.rexp.RExpParser.readVector(RExpParser.java:324)
    at org.jpmml.rexp.RExpParser.readRExp(RExpParser.java:97)
    at org.jpmml.rexp.RExpParser.parse(RExpParser.java:53)
    at org.jpmml.rexp.Main.run(Main.java:109)
    at org.jpmml.rexp.Main.main(Main.java:97)
Error in .convert(tempfile, file, converter, converter_classpath, verbose) : 
  1
vruusmann commented 6 years ago

You should update to the latest r2pmml package version, which is 0.17.3 at the moment.

I ran into a similar issue myself, and it has been fixed - the left-hand side of the assignment is RExp (not RPair as suggested by your ClassCastException instance): https://github.com/jpmml/jpmml-r/blob/master/src/main/java/org/jpmml/rexp/RExpParser.java#L218

If the exception happens even after the upgrade, then please re-open this issue, and please provide a reproducible test case (eg. an R script that operates on some publicly available dataset).