我有一个排名任务,我的训练数据如下所示:
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中相同的数据提供给org.jpmml.evaluator.Evaluator会产生不同的结果。结果大多是负值 - 这在我的设置中没有有效结果 - 所有预测目标都应该是正值。
我提出了两种可能的解释:
请联系我以获取完整的工作示例,包括培训和测试数据,我将通过邮件发送。但对于初学者来说,这是训练模型的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()
欢迎任何帮助
答案 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)包括对不支持的目标函数的检查。