PMML版本1.5和1.4的API发生了变化。网上搜到的都是1.4版本的例子。所以这里提供一个1.5版本的例子。
public class PredictTest {
public static void main(String[] args) throws Exception {
String pathxml = "xgb_ip.pmml";
Map<String, Double> map = new HashMap<String, Double>();
map.put(“ip_count”, 10);
map.put(“finger_count”, 2);
...
predict(map, pathxml);
}
public static void predict(Map<String, Double> kxmap, String pathxml) throws Exception {
File file = new File(pathxml);
InputStream inputStream = new FileInputStream(file);
PMML pmml = org.jpmml.model.PMMLUtil.unmarshal(inputStream);
inputStream.close();
ModelEvaluatorBuilder evaluatorBuilder = new ModelEvaluatorBuilder(pmml, (String) null)
.setModelEvaluatorFactory(ModelEvaluatorFactory.newInstance())
.setValueFactoryFactory(ValueFactoryFactory.newInstance());
// .setOutputFilter(this.filterOutput ? OutputFilters.KEEP_FINAL_RESULTS : OutputFilters.KEEP_ALL);
Evaluator evaluator = evaluatorBuilder.build();
List<InputField> inputFields = evaluator.getInputFields();
Map<FieldName, FieldValue> arguments = new LinkedHashMap<FieldName, FieldValue>();
for (InputField inputField : inputFields) {
FieldName inputFieldName = inputField.getName();
Object rawValue = kxmap.get(inputFieldName.getValue());
FieldValue inputFieldValue = inputField.prepare(rawValue);
arguments.put(inputFieldName, inputFieldValue);
}
Map<FieldName, ?> results = evaluator.evaluate(arguments);
List<TargetField> targetFields = evaluator.getTargetFields();
for (TargetField targetField : targetFields) {
FieldName targetFieldName = targetField.getName();
ProbabilityDistribution targetFieldValue = (ProbabilityDistribution)results.get(targetFieldName);
System.out.println(" value: " + targetFieldValue.getValue("1"));
}
}
}