我有一个从SAS Miner生成的PMML,使用JPMML 1.1.4无法正确评估。 JPMML 1.1.4说它支持PMML 4.2,而PMML说它是PMML版本4.2。
以下函数“ SAS-EM-String-Normalize”中的FMTWIDTH是否正确的PMML语法?
有什么想法为什么我不能使用JPMML评估此功能?
我的TransformationDictionary中有一个看起来像的函数,
<TransformationDictionary>
<DefineFunction name="SAS-EM-String-Normalize" optype="categorical" dataType="string">
<ParameterField name="FMTWIDTH" optype="continuous"/>
<ParameterField name="AnyCInput" optype="categorical"/>
<Apply function="trimBlanks">
<Apply function="uppercase">
<Apply function="substring">
<FieldRef field="AnyCInput"/>
<Constant>1</Constant>
<Constant>FMTWIDTH</Constant>
</Apply>
</Apply>
</Apply>
</DefineFunction>
</TransformationDictionary>
我得到以下异常,
线程“主” org.jpmml.evaluator.TypeCheckException中的异常:
预期为INTEGER,但达到了STRING(FMTWIDTH)
org.jpmml.evaluator.FieldValue.asInteger(FieldValue.java:125)在
org.jpmml.evaluator.FunctionRegistry $ 36.evaluate(FunctionRegistry.java:463)
在org.jpmml.evaluator.FunctionUtil.evaluate(FunctionUtil.java:38)
在
org.jpmml.evaluator.ExpressionUtil.evaluateApply(ExpressionUtil.java:203)
在
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:91)
在org.jpmml.evaluator.FunctionUtil.evaluate(FunctionUtil.java:76)
在org.jpmml.evaluator.FunctionUtil.evaluate(FunctionUtil.java:43)
在
org.jpmml.evaluator.ExpressionUtil.evaluateApply(ExpressionUtil.java:203)
在
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:91)
在
org.jpmml.evaluator.ExpressionUtil.evaluateApply(ExpressionUtil.java:188)
在
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:91)
在
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:58)
在
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:45)
在
org.jpmml.evaluator.ExpressionUtil.evaluateMapValues(ExpressionUtil.java:169)
在
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:87)
在
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:58)
在
org.jpmml.evaluator.ExpressionUtil.evaluate(ExpressionUtil.java:45)
在
org.jpmml.evaluator.RegressionModelEvaluator.evaluateRegressionTable(RegressionModelEvaluator.java:150)
在
org.jpmml.evaluator.RegressionModelEvaluator.evaluateClassification(RegressionModelEvaluator.java:107)
在
org.jpmml.evaluator.RegressionModelEvaluator.evaluate(RegressionModelEvaluator.java:57)
在
org.jpmml.evaluator.ModelEvaluator.evaluate(ModelEvaluator.java:65)
在
ValidPMMLTesterRandomScores.randomEvaluation(ValidPMMLTesterRandomScores.java:116)
在
ValidPMMLTesterRandomScores.printModelInformation(ValidPMMLTesterRandomScores.java:94)
在
ValidPMMLTesterRandomScores.readModelFromFile(ValidPMMLTesterRandomScores.java:142)
在
ValidPMMLTesterRandomScores.main(ValidPMMLTesterRandomScores.java:160)
最佳答案
根据formal definition of the PMML built-in function "substring",它需要一个字符串参数和两个整数参数。 SAS EM生成的PMML代码尝试使用一个字符串参数,一个整数参数和另一个字符串参数substring($AnyCInput, 1, "FMTWIDTH")
调用此函数。
可以通过使用FieldRef
元素访问“ FMTWIDTH”参数的值来修复此PMML片段:
<Apply function="substring">
<FieldRef field="AnyCInput"/>
<Constant>1</Constant>
<FieldRef field="FMTWIDTH"/>
</Apply>
总之,JPMML是正确的,而SAS EM是错误的。
关于java - 使用JPMML评估SAS生产的PMML文件时出现FMTWIDTH错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33003359/