我有一个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)
由于
答案 0 :(得分:1)
PMML文档是否包含实际的字段名称?在文本编辑器中打开它,看看/PMML/DataDictionary/DataField@name
属性的值是什么。
您的问题表明从Scikit-Learn到PMML的转换不完整,因为它不包含有关活动字段(也称为输入字段)名称的信息。在这种情况下,他们被假定为x1
,x2
,..,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中。