我使用Augustus作为PMML模型消费者。我修改了add two numbers example以包含一个DefineFunction元素,如下所示:
<PMML version="4.1" xmlns="http://www.dmg.org/PMML-4_1">
<Header/>
<DataDictionary>
<DataField name="x" dataType="double" optype="continuous"/>
<DataField name="y" dataType="double" optype="continuous"/>
</DataDictionary>
<TransformationDictionary>
<DefineFunction dataType="float" optype="continuous" name="add">
<ParameterField optype="continuous" name="first"></ParameterField>
<ParameterField optype="continuous" name="second"></ParameterField>
<Apply function="+" invalidValueTreatment="returnInvalid">
<FieldRef field="first"></FieldRef>
<FieldRef field="second"></FieldRef>
</Apply>
</DefineFunction>
<DerivedField name="z" dataType="double" optype="continuous">
<Apply function="add">
<FieldRef field="x"/>
<FieldRef field="y"/>
</Apply>
</DerivedField>
</TransformationDictionary>
</PMML>
我将此模型保存在文件中并尝试运行它:
from resources import add_two_numbers_file # this is just the path to my model file
from augustus.strict import modelLoader
# Load model
with open(add_two_numbers_file, 'r') as model_file:
model_str = model_file.read()
model = modelLoader.loadXml(model_str)
# Run model
print model.calc({'x':[1,2,3],'y':[4,5,6]}).look()
然而,我收到错误:
AttributeError: 'DefineFunction' object has no attribute '_setupCalculate'
我正在使用最新的主干(版本794),并且能够运行未修改的示例(没有DefineFunction)而没有问题。 Augustus是否支持DefineFunction?
答案 0 :(得分:2)
我能够通过两次更改来解决这个问题。在查看了augustus源并确定_setupCalculate
确实没有在任何地方定义之后,我对它进行了修补。我的脚本现在看起来像这样:
# Monkey-patch augustus
import augustus.pmml.DefineFunction
def _setupCalculate(self, dataTable, functionTable, performanceTable):
return (dataTable, functionTable, performanceTable)
augustus.pmml.DefineFunction.DefineFunction._setupCalculate = _setupCalculate
# Now the actual script
from augustus.strict import modelLoader
# Load model
add_two_numbers_file = 'addTwoNumbers.pmml'
with open(add_two_numbers_file, 'r') as model_file:
model_str = model_file.read()
model = modelLoader.loadXml(model_str)
# Run model
print model.calc({'x':[1,2,3],'y':[4,5,6]}).look()
我做出了天真的假设,即_setupCalculate
不需要做任何重要的事情。我现在得到了一个不同的,更难以理解的错误:
ValueError: assignment destination is read-only
在
行mask[mask2] = defs.MISSING
FieldType.py中的。通过调试器几次之后,我看到这行只在类型转换期间执行,并注意到我在PMML中使用float和double类型。通过删除不必要的dataType属性,我能够使以下工作:
<PMML version="4.1" xmlns="http://www.dmg.org/PMML-4_1">
<Header/>
<DataDictionary>
<DataField name="x" dataType="double" optype="continuous"/>
<DataField name="y" dataType="double" optype="continuous"/>
</DataDictionary>
<TransformationDictionary>
<DefineFunction optype="continuous" name="add">
<ParameterField optype="continuous" name="first"></ParameterField>
<ParameterField optype="continuous" name="second"></ParameterField>
<Apply function="+" invalidValueTreatment="returnInvalid">
<FieldRef field="first"></FieldRef>
<FieldRef field="second"></FieldRef>
</Apply>
</DefineFunction>
<DerivedField name="z" dataType="double" optype="continuous">
<Apply function="add">
<FieldRef field="x"/>
<FieldRef field="y"/>
</Apply>
</DerivedField>
</TransformationDictionary>
</PMML>
我使用的奥古斯都的主干版本相当于版本0.6-beta3。看起来我遇到的问题只是错误,而且在不久的将来,这个答案中使用的技巧可能变得不必要了。
答案 1 :(得分:2)
jcrudy,你是对的:这是一个错误。 (API已更改且DefineFunction未更新。)现在已在public SVN repository中修复:使用Augustus&gt; = r795,您可以按原定的目的运行示例。
顺便提一下,您的PMML来自外部文件,但您将其加载到字符串中然后加载到PMML DOM中。您只需传递loadXML
文件名即可跳过中间步骤:
model = modelLoader.loadXml(add_two_numbers_file)
(这可能与非常大的PMML文件有关;还要注意它们可以被GZip压缩。)