简体   繁体   English

使用PMML和Python中的Augustus对回归模型进行评分

[英]Scoring regression model using PMML with Augustus in Python

I have a PMML file (below) generated from an R linear model from my colleague that is to be used to predict the cost of an item based on 5 features. 我有一个PMML文件(下面)来自我的同事的R线性模型,用于根据5个特征预测项目的成本。 I am trying to consume this model using Augustus in Python and make these predictions. 我试图在Python中使用Augustus来使用这个模型并进行这些预测。 I have been successful in getting the PMML file loaded by Augustus but I am failing to get the predicted values. 我已成功获取Augustus加载的PMML文件,但我未能获得预测值。

I've gone through many examples from Augustus's Model abstraction and through searching Stack and Google but I have yet to find any examples of linear regression being successfully used. 我从奥古斯都的模型抽象和搜索Stack和Google中经历了很多例子,但我还没有找到任何成功使用线性回归的例子。 There was one similar question asked previously but it was never properly answered. 之前有一个类似的问题,但从未得到适当的回答。 I have also tried other example regression PMML files with similar results. 我还尝试了其他具有类似结果的示例回归PMML文件

How can I run the regression using Augustus (or other library) in Python and obtain the predictions? 如何使用Python中的Augustus(或其他库)运行回归并获取预测?

PMML Code: linear_model.xml PMML代码: linear_model.xml

<?xml version="1.0"?>
<PMML version="4.1" xmlns="http://www.dmg.org/PMML-4_1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dmg.org/PMML-4_1 http://www.dmg.org/v4-1/pmml-4-1.xsd">
 <Header copyright="Copyright (c) 2016 root" description="Linear Regression Model">
  <Extension name="user" value="root" extender="Rattle/PMML"/>
  <Application name="Rattle/PMML" version="1.4"/>
  <Timestamp>2016-02-02 19:20:59</Timestamp>
 </Header>
 <DataDictionary numberOfFields="6">
  <DataField name="cost" optype="continuous" dataType="double"/>
  <DataField name="quantity" optype="continuous" dataType="double"/>
  <DataField name="total_component_weight" optype="continuous" dataType="double"/>
  <DataField name="quantity_cost_mean" optype="continuous" dataType="double"/>
  <DataField name="mat_quantity_cost_mean" optype="continuous" dataType="double"/>
  <DataField name="solid_volume" optype="continuous" dataType="double"/>
 </DataDictionary>
 <RegressionModel modelName="Linear_Regression_Model" functionName="regression" algorithmName="least squares" targetFieldName="cost">
  <MiningSchema>
   <MiningField name="cost" usageType="predicted"/>
   <MiningField name="quantity" usageType="active"/>
   <MiningField name="total_component_weight" usageType="active"/>
   <MiningField name="quantity_cost_mean" usageType="active"/>
   <MiningField name="mat_quantity_cost_mean" usageType="active"/>
   <MiningField name="solid_volume" usageType="active"/>
  </MiningSchema>
  <Output>
   <OutputField name="Predicted_cost" feature="predictedValue"/>
  </Output>
  <RegressionTable intercept="-5.18924891969128">
   <NumericPredictor name="quantity" exponent="1" coefficient="0.0128484453941352"/>
   <NumericPredictor name="total_component_weight" exponent="1" coefficient="12.0357979395919"/>
   <NumericPredictor name="quantity_cost_mean" exponent="1" coefficient="0.500814050845585"/>
   <NumericPredictor name="mat_quantity_cost_mean" exponent="1" coefficient="0.556822746464491"/>
   <NumericPredictor name="solid_volume" exponent="1" coefficient="0.000197314943339284"/>
  </RegressionTable>
 </RegressionModel>
</PMML>

Python Code: Python代码:

import pandas as pd
from augustus.strict import *

train_full_df = pd.read_csv('train_data.csv', low_memory=False)

model = modelLoader.loadXml('linear_model.xml')
dataTable = model.calc({'quantity': train_full_df.quantity[:10], 
                        'total_component_weight': train_full_df.total_component_weight[:10],
                        'quantity_cost_mean': train_full_df.quantity_cost_mean[:10],
                        'mat_quantity_cost_mean': train_full_df.mat_quantity_cost_mean[:10],
                        'solid_volume': train_full_df.solid_volume[:10],
                       })
dataTable.look()

(output) (输出)

#  | quantity   | total_comp | quantity_c | mat_quanti | solid_volu
---+------------+------------+------------+------------+-----------
0  | 1.0        | 0.018      | 32.2903337 | 20.4437141 | 1723.48653
1  | 2.0        | 0.018      | 17.2369194 | 12.0418426 | 1723.48653
2  | 5.0        | 0.018      | 10.8846412 | 7.22744702 | 1723.48653
3  | 10.0       | 0.018      | 6.82802948 | 4.3580642  | 1723.48653
4  | 25.0       | 0.018      | 4.84356482 | 3.09218161 | 1723.48653
5  | 50.0       | 0.018      | 4.43703495 | 2.74377648 | 1723.48653
6  | 100.0      | 0.018      | 4.22259101 | 2.5990824  | 1723.48653
7  | 250.0      | 0.018      | 4.1087198  | 2.53432422 | 1723.48653
8  | 1.0        | 0.018      | 32.2903337 | 20.4437141 | 1723.48653
9  | 2.0        | 0.018      | 17.2369194 | 12.0418426 | 1723.48653

As you can see from the table, only the input values are being displayed and no "cost" values. 从表中可以看出,只显示输入值而没有“成本”值。 How do I get the cost to be predicted? 如何预测成本?

I am using Python 2.7, Augustus 0.6 (also tried 0.5), OS X 10.11 我使用的是Python 2.7,Augustus 0.6(也尝试过0.5),OS X 10.11

You could use the PyPMML to score PMML models in Python, takes your model as an example: 您可以使用PyPMML在Python中对PMML模型进行评分,以您的模型为例:

import pandas as pd
from pypmml import Model

model = Model.fromString('''<?xml version="1.0"?>
<PMML version="4.1" xmlns="http://www.dmg.org/PMML-4_1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dmg.org/PMML-4_1 http://www.dmg.org/v4-1/pmml-4-1.xsd">
 <Header copyright="Copyright (c) 2016 root" description="Linear Regression Model">
  <Extension name="user" value="root" extender="Rattle/PMML"/>
  <Application name="Rattle/PMML" version="1.4"/>
  <Timestamp>2016-02-02 19:20:59</Timestamp>
 </Header>
 <DataDictionary numberOfFields="6">
  <DataField name="cost" optype="continuous" dataType="double"/>
  <DataField name="quantity" optype="continuous" dataType="double"/>
  <DataField name="total_component_weight" optype="continuous" dataType="double"/>
  <DataField name="quantity_cost_mean" optype="continuous" dataType="double"/>
  <DataField name="mat_quantity_cost_mean" optype="continuous" dataType="double"/>
  <DataField name="solid_volume" optype="continuous" dataType="double"/>
 </DataDictionary>
 <RegressionModel modelName="Linear_Regression_Model" functionName="regression" algorithmName="least squares" targetFieldName="cost">
  <MiningSchema>
   <MiningField name="cost" usageType="predicted"/>
   <MiningField name="quantity" usageType="active"/>
   <MiningField name="total_component_weight" usageType="active"/>
   <MiningField name="quantity_cost_mean" usageType="active"/>
   <MiningField name="mat_quantity_cost_mean" usageType="active"/>
   <MiningField name="solid_volume" usageType="active"/>
  </MiningSchema>
  <Output>
   <OutputField name="Predicted_cost" feature="predictedValue"/>
  </Output>
  <RegressionTable intercept="-5.18924891969128">
   <NumericPredictor name="quantity" exponent="1" coefficient="0.0128484453941352"/>
   <NumericPredictor name="total_component_weight" exponent="1" coefficient="12.0357979395919"/>
   <NumericPredictor name="quantity_cost_mean" exponent="1" coefficient="0.500814050845585"/>
   <NumericPredictor name="mat_quantity_cost_mean" exponent="1" coefficient="0.556822746464491"/>
   <NumericPredictor name="solid_volume" exponent="1" coefficient="0.000197314943339284"/>
  </RegressionTable>
 </RegressionModel>
</PMML>''')
data = pd.DataFrame({
    'quantity': [1.0,2.0,5.0,10.0,25.0,50.0,100.0,250.0,1.0,2.0],
    'total_component_weight': [0.018, 0.018, 0.018, 0.018, 0.018, 0.018, 0.018, 0.018, 0.018, 0.018],
    'quantity_cost_mean': [32.2903337,17.2369194,10.8846412,6.82802948,4.84356482,4.43703495,4.22259101,4.1087198,32.2903337,17.2369194],
    'mat_quantity_cost_mean': [20.4437141,12.0418426,7.22744702,4.3580642 ,3.09218161,2.74377648,2.5990824 ,2.53432422,20.4437141,12.0418426],
    'solid_volume': [1723.48653,1723.48653,1723.48653,1723.48653,1723.48653,1723.48653,1723.48653,1723.48653,1723.48653,1723.48653]
})
result = model.predict(data)

The result is: 结果是:

    Predicted_cost
0   22.935291
1   10.730825
2   4.907295
3   1.342192
4   -0.163801
5   -0.240186
6   0.214271
7   2.048450
8   22.935291
9   10.730825

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM