Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPMML评估SAS生成的PMML文件时发生FMTWIDTH错误_Java_Sas_Pmml - Fatal编程技术网

Java 使用JPMML评估SAS生成的PMML文件时发生FMTWIDTH错误

Java 使用JPMML评估SAS生成的PMML文件时发生FMTWIDTH错误,java,sas,pmml,Java,Sas,Pmml,我有一个从SAS Miner生成的PMML,无法使用JPMML 1.1.4正确评估。JPMML1.1.4说它支持PMML4.2,PMML说它是PMML版本4.2 下面函数“SAS EM字符串规格化”中的FMTWIDTH是否为正确的PMML语法 你知道为什么我不能用JPMML计算这个函数吗 我的TransformationDictionary中的函数如下所示 <TransformationDictionary> <DefineFunction name="SAS-EM-S

我有一个从SAS Miner生成的PMML,无法使用JPMML 1.1.4正确评估。JPMML1.1.4说它支持PMML4.2,PMML说它是PMML版本4.2

下面函数“SAS EM字符串规格化”中的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>

1.
FMTWIDTH
我得到以下例外情况

线程“main”org.jpmml.evaluator.TypeCheckException中的异常: 应为整数,但在处获取字符串(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.EvaluaterExpressionTable(RegressionModelEvaluator.java:150) 在 org.jpmml.evaluator.RegressionModelEvaluator.evaluateClassification(RegressionModelEvaluator.java:107) 在 org.jpmml.evaluator.RegressionModelEvaluator.evaluate(RegressionModelEvaluator.java:57) 在 org.jpmml.evaluator.modeleevaluator.evaluate(modeleevaluator.java:65) 在 ValidPMMLTesterRandomScores.randomEvaluation(ValidPMMLTesterRandomScores.java:116) 在 printModelInformation(ValidPMMLTesterRandomScores.java:94) 在 ValidPMMLTesterRandomScores.readModelFromFile(ValidPMMLTesterRandomScores.java:142) 在 main(validpmmlterrandomscores.java:160)

根据,它需要一个字符串参数和两个整数参数。SAS EM生成的PMML代码尝试使用字符串参数、整数参数和另一个字符串参数
子字符串($AnyCInput,1,“FMTWIDTH”)
调用此函数

通过使用
FieldRef
元素访问“FMTWIDTH”参数的值,可以修复此PMML片段:

<Apply function="substring">
  <FieldRef field="AnyCInput"/>
  <Constant>1</Constant>
  <FieldRef field="FMTWIDTH"/>
</Apply>

1.

总之,JPMML是正确的,SAS EM是错误的。

通过重新排列PMML类模型对象,可以动态更正无效的PMML文档。的访问者API正是为此目的而设计的:

PMML pmml = loadSasEmPMML()

Visitor invalidSubstringCorrector = new AbstractVisitor(){

    @Override
    public VisitorAction visit(Apply apply){
        if(isInvalidSubstring(apply)){
            List<Expression> expressions = apply.getExpressions();

            expressions.set(2, new FieldRef(new FieldName("FMTWIDTH")));
        }
        return super.visit(apply);
    }

    private boolean isInvalidSubstring(Apply apply){
        if(("substring").equals(apply.getFunction())){
            List<Expression> expressions = apply.getExpressions();

            Expression lengthArgument = expressions.get(2);
            if(lengthArgument instanceof Constant){
                Constant constant = (Constant)lengthArgument;
                return ("FMTWIDTH").equals(constant.getValue());
            }
        }
        return false;
    }
};

invalidSubstringCorrector.applyTo(pmml);
PMML PMML=loadsasemml()
Visitor invalidSubstringCorrector=new AbstractVisitor(){
@凌驾
公众访问行动访问(申请){
如果(isInvalidSubstring(应用)){
List expressions=apply.getExpressions();
expressions.set(2,新的FieldRef(新的FieldName(“FMTWIDTH”));
}
回访(申请);
}
私有布尔值isInvalidSubstring(应用){
if((“子字符串”).equals(apply.getFunction()){
List expressions=apply.getExpressions();
表达式lengthArgument=expressions.get(2);
if(常数的长度参数实例){
常量=(常量)长度参数;
返回(“FMTWIDTH”).equals(常量.getValue());
}
}
返回false;
}
};
无效的substringcorrector.applyTo(pmml);

目前,方法
isInvalidSubstring(Apply)
仅通过检查第三个表达式元素是否为字符串常量“FMTWIDTH”来识别有问题的Apply元素。如果需要特别确定,那么可能最好也添加关于第一个和第二个表达式元素的正确断言。

您应该将JPMML Evaluator dependency更新到最新的稳定版本,即1.2.5。作为进一步调试的一部分,我尝试升级到1.2.5版,但是它对这个特定的问题没有帮助。如果没有其他问题,那么升级版本将产生一个更相关的异常堆栈跟踪。JPMML Evaluator 1.1.4版可追溯到2014年5月,自那以后,许多东西都被移动/修改了。如果PMML文档本身无效,PMML消费软件的升级将无济于事。但是,您可以使用JavaPMMLAPI,尤其是JPMML模型库的访问者API,以编程方式执行PMML文档的动态更正。这个“SAS EM String Normalize”问题的模式非常容易识别和纠正(创建一个可重用组件需要大约10到15行Java代码)。我还遇到了其他错误,但这帮助我向前迈进。