MML pmml = org.jpmml.model.PMMLUtil.unmarshal(is);ModelEvaluatorFactory modelEvaluatorFactory =ModelEvaluatorFactory.newInstance();Evaluator evaluator =modelEvaluatorFactory.newModelEvaluator(pmml);return evaluator;}private int predict(Evaluator evaluator,inta, int b, int c, int d) {Map<String, Integer> data = new HashMap<String, Integer>();data.put("x1", a);data.put("x2", b);data.put("x3", c);data.put("x4", d);List<InputField> inputFields =evaluator.getInputFields();//过模型的原始特征,从画像中获取数据,作为模型输入Map<FieldName, FieldValue> arguments =new LinkedHashMap<FieldName, FieldValue>();for(InputField inputField : inputFields) {FieldName inputFieldName = inputField.getName();Object rawValue = data.get(inputFieldName.getValue());FieldValue inputFieldValue = inputField.prepare(rawValue);arguments.put(inputFieldName, inputFieldValue);}Map<FieldName, ?> results =evaluator.evaluate(arguments);List<TargetField> targetFields =evaluator.getTargetFields();TargetField targetField = targetFields.get(0);FieldName targetFieldName =targetField.getName();Object targetFieldValue =results.get(targetFieldName);System.out.println("target: " +targetFieldName.getValue() + " value: " + targetFieldValue);int primitiveValue = -1;if (targetFieldValue instanceof Computable){Computable computable = (Computable) targetFieldValue;primitiveValue = (Integer)computable.getResult();}System.out.println(a + " " + b +" " + c + " " + d + ":" + primitiveValue);return primitiveValue;}PMML的确是跨平台的利器,但是也会存在一些问题:PMML为了满足跨平台通用性,牺牲了很多平台独有的优化,所以很多时候我们用算法库自己的保存模型的API得到的模型文件,要比生成的PMML模型文件小很多;PMML文件加载速度也比算法库自己独有格式的模型文件加载慢很多。PMML加载得到的模型和算法库自己独有的模型相比,预测会有一点点的偏差,当然这个偏差并不大。比如某一个样本,用sklearn的决策树模型本地预测为类别1,但是如果我们把这个决策树导出为PMML,并用JAVA加载后,预测有较小的概率出现预测的结果不为类别1;对于超大模型,比如大规模的集成学习模型(xgboost、随机森林等)以及神经网络,生成的PMML文件很容易得到几个G,甚至上T,这时使用PMML文件加载预测就不太合适了,此时推荐为模型建立一个专有的环境,就没有必要去考虑跨平台了。更多参考:Java跨语言调用Python sklearn模型jpmml阿里云pai平台机器学习模型部署社群 了解更多干货文章,可以关注微信小程序“八斗问答” | 欢迎光临 机器人与人工智能爱好者论坛 (http://robot-ai.org/) | Powered by Discuz! X3.2 |