在R环境中无法将XGBoost模型导出为PMML格式的问题求助
一、pmml包的输入特征名错误
你遇到的错误:
Error in pmml.xgb.Booster(bst, input_feature_names = colnames(as.matrix(dev_samp[, : Input feature names required at present version. Try using colnames function on Matrix, matrix or xgb.DMatrix$data
其实是因为pmml包的XGBoost导出函数更依赖模型自身携带的feature_names属性,而非你手动传入的input_feature_names参数。虽然单独调用colnames(as.matrix(dev_samp[,1:2]))能得到正确列名,但训练模型时直接传入as.matrix(dev_samp[,1:2])并没有把列名绑定到XGBoost模型对象上,导致函数无法识别特征名。
修复方案:
先给训练用的特征矩阵明确设置列名,再训练模型,让XGBoost自动把列名存入模型的feature_names属性:
library(xgboost) library(pmml) dev_samp = data.matrix(mtcars[,c(4,6,9)]) # 提取训练特征并设置列名(对应mtcars第4、6列的实际列名) train_features <- as.matrix(dev_samp[,1:2]) colnames(train_features) <- c("hp", "wt") set.seed(123) bst <- xgboost(data = train_features, label = dev_samp[,3], max_depth=2, eta=0.2, nrounds=2, colsample_bytree = 0.5, lambda = 0.3, objective = "binary:logistic", eval_metric = "error") # 此时无需手动传入input_feature_names,pmml函数会自动读取模型的feature_names pmod <- pmml(bst, output_label_name = colnames(dev_samp)[3])
二、r2pmml包的JPMML转换失败错误
你用r2pmml时遇到的错误:
Error in .convert(tempfile, file, converter, converter_classpath, verbose) : The JPMML-R conversion application has failed (error code 1). The Java executable should have printed more information about the failure into its standard output and/or standard error streams
大概率是手动构建的fmap格式有问题(比如把特征名转成了因子类型,不符合JPMML的要求),或者模型的标签/特征信息没有正确传递。其实r2pmml不需要手动构建特征映射表,只要模型携带正确的特征名和标签信息就能自动处理。
修复方案:
改用xgb.DMatrix封装训练数据,明确传入特征名和标签,避免手动构建fmap的麻烦:
library(xgboost) library(r2pmml) # 保留原始数据框格式,方便处理列名和标签 dev_samp <- mtcars[,c(4,6,9)] # 二分类任务建议把标签转成因子,确保r2pmml正确识别分类类型 dev_samp$am <- as.factor(dev_samp$am) # 用xgb.DMatrix封装训练数据,明确指定特征名和数值型标签(0/1) dtrain <- xgb.DMatrix(data = as.matrix(dev_samp[,1:2]), label = as.integer(dev_samp$am) - 1, feature_names = colnames(dev_samp)[1:2]) set.seed(123) bst <- xgboost(data = dtrain, max_depth=2, eta=0.2, nrounds=2, colsample_bytree = 0.5, lambda = 0.3, objective = "binary:logistic", eval_metric = "error") # 直接调用r2pmml,指定必要参数即可 r2pmml(bst, "XGBoostModel2.pmml", input_feature_names = colnames(dev_samp)[1:2], response_name = "am", response_levels = c("0", "1"))
额外排查点:
如果还是报错,检查你的Java环境:在R中运行system("java -version"),确保Java版本是1.8(即JDK 8)及以上。r2pmml依赖JPMML工具链,旧版本Java可能会导致兼容性问题。
内容的提问来源于stack exchange,提问作者Mar

