从JPMML模型的InputField获取实际字段名称

时间:2018-01-01 04:19:14

标签: java scikit-learn pmml

我有一个scikit模型,我在使用JPMML的java应用程序中使用。我尝试使用训练期间使用的列的名称来设置InputFields,但是" inField.getName()。getValue()"被混淆为" x {#}"。无论如何我可以映射" x {#}"回到原始功能/属性名称?

Map<FieldName, FieldValue> arguments = new LinkedHashMap<>();
    or (InputField inField : patternEvaluator.getInputFields()) {
        int value = activeFeatures.contains(inField.getName().getValue()) ? 1 : 0;
        FieldValue inputFieldValue = inField.prepare(value);
        arguments.put(inField.getName(), inputFieldValue);              
            }
Map<FieldName, ?> results = patternEvaluator.evaluate(arguments);

这是我如何生成模态

from sklearn2pmml import PMMLPipeline
from sklearn2pmml import PMMLPipeline
import os
import pandas as pd
from sklearn.pipeline import Pipeline
import numpy as np

data = pd.read_csv('/pydata/training.csv')
X = data[data.keys()[:-1]].as_matrix()
y = data['classname'].as_matrix()

X_train, X_test, y_train, y_test =    train_test_split(X,y,test_size=0.3,random_state=0)

estimators = [("read", RandomForestClassifier(n_jobs=5,n_estimators=200, max_features='auto'))]    
pipe = PMMLPipeline(estimators)
pipe.fit(X_train,y_train)
pipe.active_fields = np.array(data.columns)
sklearn2pmml(pipe, "/pydata/model.pmml", with_repr = True)

由于

2 个答案:

答案 0 :(得分:1)

PMML文档是否包含实际的字段名称?在文本编辑器中打开它,看看/PMML/DataDictionary/DataField@name属性的值是什么。

您的问题表明从Scikit-Learn到PMML的转换不完整,因为它不包含有关活动字段(也称为输入字段)名称的信息。在这种情况下,他们被假定为x1x2,..,xn

答案 1 :(得分:0)

您的管道只包含估算工具,这就是名称丢失的原因。您还必须包括所有预处理步骤,以便将它们引入PMML。

假设您根本不进行任何预处理,那么这可能就是您所需要的(我不会重复此代码段中所需的部分代码):

nones = [(d, None) for d in data.columns]

mapper = DataFrameMapper(nones,df_out=True)

lm = PMMLPipeline([
    ("mapper", mapper),
    ("estimator", estimators)
])

lm.fit(X_train,y_train)

sklearn2pmml(lm, "ScikitLearnNew.pmml", with_repr=True)

如果您确实需要对数据进行一些预处理,而不是“无”,则可以使用任何其他转换器(例如LabelBinarizer)。但是预处理必须在管道内进行才能包含在PMML中。