在 Python 中使用 PMML 和 Augustus 对回归模型进行评分
Scoring regression model using PMML with Augustus in Python
我有一个 PMML 文件(如下),它是从我同事的 R 线性模型生成的,用于根据 5 个特征预测项目的成本。我正在尝试使用 Python 中的 Augustus 使用此模型并做出这些预测。我已成功获取 Augustus 加载的 PMML 文件,但无法获取预测值。
我已经从 Augustus 的 Model abstraction and through searching Stack and Google but I have yet to find any examples of linear regression being successfully used. There was one similar question asked previously but it was never properly answered. I have also tried other example regression PMML files 中找到了很多例子,结果相似。
如何 运行 在 Python 中使用 Augustus(或其他库)进行回归并获得预测?
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代码:
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()
(输出)
# | 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
正如您从 table 中看到的那样,仅显示输入值,没有显示 "cost" 值。我如何获得要预测的成本?
我正在使用 Python 2.7,Augustus 0.6(也试过 0.5),OS X 10.11
您可以使用 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)
结果是:
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
我有一个 PMML 文件(如下),它是从我同事的 R 线性模型生成的,用于根据 5 个特征预测项目的成本。我正在尝试使用 Python 中的 Augustus 使用此模型并做出这些预测。我已成功获取 Augustus 加载的 PMML 文件,但无法获取预测值。
我已经从 Augustus 的 Model abstraction and through searching Stack and Google but I have yet to find any examples of linear regression being successfully used. There was one similar question asked previously but it was never properly answered. I have also tried other example regression PMML files 中找到了很多例子,结果相似。
如何 运行 在 Python 中使用 Augustus(或其他库)进行回归并获得预测?
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代码:
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()
(输出)
# | 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
正如您从 table 中看到的那样,仅显示输入值,没有显示 "cost" 值。我如何获得要预测的成本?
我正在使用 Python 2.7,Augustus 0.6(也试过 0.5),OS X 10.11
您可以使用 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)
结果是:
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