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

Get actual field name from JPMML model's InputField

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

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)

谢谢

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

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

您的管道仅包含估算器,这就是名称丢失的原因。您还必须包括所有预处理步骤才能将它们纳入 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)

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