2014-01-10 61 views
2

我正在使用Augustus作爲PMML模型的使用者。我已經修改了add two numbers example到包括DefineFunction元素,像這樣:我可以使用包含使用Augustus(Python)的DefineFunction的PMML模型嗎?

<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)。奧古斯都支持DefineFunction嗎?

回答

2

jcrudy,你是對的:這是一個錯誤。 (API已更改,DefineFunction未更新。)現在,它已在public SVN repository中修復:在Augustus> = r795的情況下,您可以像最初設想的那樣運行示例。

順便說一下,您的PMML來自外部文件,但您將其加載到一個字符串中,然後加載到PMML DOM中。您可以跳過被剛好路過loadXML文件名的中間步驟:

model = modelLoader.loadXml(add_two_numbers_file) 

(這可能是相關的非常大的PMML文件;還指出,他們可以用gzip壓縮)

2

我能夠通過進行兩項更改來解決此問題。在看看奧古斯源和確定,確實後,_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類型。通過消除不必要的數據類型屬性,我能夠得到以下工作:

<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版。看起來我遇到的問題只是錯誤,在這個答案中使用的技巧很可能在不久的將來變得沒有必要。

相關問題