Closed thu-zxs closed 3 years ago
I wonder why a java.util.List's clear() method could lead to a AbstractFixedSizeList's unsupported remove method?
The underlying JPMML-Model library performs java.util.List
type optimization, where the type of singleton, doubleton and tripleton lists are changed to org.jpmml.model.collections.SingletonList
, o.j.m.c.DoubletonList
and o.j.m.c.TripletonList
, respectively.
This optimization is implemented as the org.jpmml.model.visitors.ArrayListTransformer
Visitor class:
https://github.com/jpmml/jpmml-model/blob/1.5.15/pmml-model/src/main/java/org/jpmml/model/visitors/ArrayListTransformer.java
This Visitor class is a member of the org.jpmml.evaluator.visitors.ElementFinalizerBattery
Visitor Battery class:
https://github.com/jpmml/jpmml-evaluator/blob/1.5.15/pmml-evaluator/src/main/java/org/jpmml/evaluator/visitors/ElementFinalizerBattery.java#L28
TLDR: This List
type optimization is applied automatically during org.jpmml.evaluator.LoadingModelEvaluatorBuilder#load
method:
https://github.com/jpmml/jpmml-evaluator/blob/1.5.15/pmml-evaluator/src/main/java/org/jpmml/evaluator/LoadingModelEvaluatorBuilder.java#L62
https://github.com/jpmml/jpmml-evaluator/blob/1.5.15/pmml-evaluator/src/main/java/org/jpmml/evaluator/LoadingModelEvaluatorBuilder.java#L120-L122
How to resolve this issue?
Simply replace the default Visitor Battery instance with a custom one, which does not include the o.j.m.visitors.ArrayListTransformer
Visitor class.
For example:
VisitorBattery customVisitorBattery = new org.jpmml.evaluator.visitors.DefaultModelEvaluatorBattery();
// THIS!
customVisitorBattery.remove(org.jpmml.model.visitors.ArrayListTransformer.class);
Evaluator evaluator = new LoadingModelEvaluatorBuilder()
.setVisitors(customVisitorBattery)
.load(is)
.build();
Alternatively:
Evaluator evaluator = new LoadingModelEvaluatorBuilder()
.setVisitors(null)
.load(is)
.build();
Thanks for your help! I manage to transpile a XGBoost Model by following your instruction.
But I am getting this error when doing evaluation
Caused by: java.lang.IllegalArgumentException
at org.jpmml.evaluator.regression.RegressionModelUtil.normalizeBinaryLogisticClassificationResult(RegressionModelUtil.java:198)
at org.jpmml.evaluator.regression.RegressionModelUtil.computeBinomialProbabilities(RegressionModelUtil.java:46)
at MyCompany.XgbModel$JavaModel$108982313.evaluateRegressionTableList$1250816994(XgbModel.java:12752)
at MyCompany.XgbModel$JavaModel$108982313.evaluateClassification(XgbModel.java:12770)
at org.jpmml.evaluator.java.JavaModelEvaluator.evaluateClassification(JavaModelEvaluator.java:59)
at org.jpmml.evaluator.ModelEvaluator.evaluateInternal(ModelEvaluator.java:449)
at org.jpmml.evaluator.mining.MiningModelEvaluator.evaluateSegmentation(MiningModelEvaluator.java:539)
at org.jpmml.evaluator.mining.MiningModelEvaluator.evaluateClassification(MiningModelEvaluator.java:304)
at org.jpmml.evaluator.ModelEvaluator.evaluateInternal(ModelEvaluator.java:449)
at org.jpmml.evaluator.mining.MiningModelEvaluator.evaluateInternal(MiningModelEvaluator.java:237)
at org.jpmml.evaluator.ModelEvaluator.evaluate(ModelEvaluator.java:302)
Which is from this line of code Map<FieldName, ?> results = evaluator.evaluate(arguments);
I am doing just fine for the same evaluation code when using the untranspiled .pmml
model. Could you please help?
@thu-zxs I've extracted your last comment into a separate issue: https://github.com/jpmml/jpmml-transpiler/issues/14
In brief, you are using a binary classification model, which probably specifies RegressionModel@normalizationMethod="softmax"
?
When following the README instructions:
Getting this error:
Debugging leads me to
PMMLObjectUtil.class
:From the line
pmmlValues.clear();
I wonder why ajava.util.List
'sclear()
method could lead to aAbstractFixedSizeList
's unsupportedremove
method? How to resolve this issue? Thanks for your help!