从R中的xgboost创建的pmml模型导致与R中的原始模型不同的结果

时间:2017-11-21 10:39:04

标签: java r xgboost pmml

我有一个排名任务,我的训练数据如下所示:

session_id   item_id   item_features   target
---------------------------------------------
session1     item1     ...             1
session1     item2     ...             0
...
sessionN     item1     ...             0
sessionN     itemX     ...             10
sessionN     itemY     ...             0
...

我在R中使用xgboost,目标是“rank:pairwise”来训练模型。 xgboost期望分组数据(相同的session_id)在训练和测试集中聚集在一起。属于同一session_id的行必须使用函数setinfo()指定(例如setinfo(model,'group',group_info)。

当我在R中评估模型时,应用新数据非常有效。但是,我使用了包pmml将模型转换为pmml文件,以便在Java中使用它。

在Java中,pmml文件通过org.jpmml pmml-evaluator依赖项(v.3.3.15)进行解析和评估。但是,将与R中相同的数据提供给o​​rg.jpmml.evaluator.Evaluator会产生不同的结果。结果大多是负值 - 这在我的设置中没有有效结果 - 所有预测目标都应该是正值。

我提出了两种可能的解释:

  • 我的方案中的pmml转换可能存在错误
  • 我不知道,我可以在Java中使用等效的setinfo()。由于我一次只将模型应用于单个会话,因此我觉得我不需要指定它。但也许,我错了。

请联系我以获取完整的工作示例,包括培训和测试数据,我将通过邮件发送。但对于初学者来说,这是训练模型的R代码:

library(xgboost)
example_matrix_train <- xgb.DMatrix(X, label = y)
setinfo(example_matrix_train, 'group', example_train_groupInfo)
example.model <- xgboost(data = example_matrix_train, objective = "rank:pairwise", max.depth = 8, eta = 0.2, nthread = 8, nround = 10, verbose=0)

library(pmml)
library(pmmlTransformations)
xgb.dump(example.model, "example.model.dumped.trees")
logfile <- file(paste0("pmml_example_model",Sys.Date(),".txt"), open="a")
sink(logfile)
pmml(example.model, inputFeatureNames = colnames(example_train), outputLabelName = "prediction1", xgbDumpFile = "example.model.dumped.trees")
sink()

欢迎任何帮助

2 个答案:

答案 0 :(得分:1)

  

我提出了两种可能的解释:pmml转换中可能存在错误

这是真正的解释 - pmml包为XGBoost模型生成错误的PMML。技术原因是它使用XGBoost文本转储文件作为输入,但其中包含的信息不完整(例如,舍入的阈值)。

如果您希望将XGBoost模型导出到PMML中,那么您应该使用r2pmml包,该包使用XGBoost二进制文件作为输入。

答案 1 :(得分:0)

事实上,&#39; pmml&#39;套餐目前不支持&#39;排名:成对&#39;你需要的目标函数。即将发布的&#39; pmml&#39; package(版本1.5.3)包括对不支持的目标函数的检查。