从 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 的转换不完整,因为它不包含有关活动字段(又名输入字段)名称的信息。在这种情况下,它们被假定为 x1
、x2
、..、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 中。
我有一个 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 的转换不完整,因为它不包含有关活动字段(又名输入字段)名称的信息。在这种情况下,它们被假定为 x1
、x2
、..、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 中。