我有一个从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/

10-12 17:36