使用Bayesian Additive Regression Tree(BART)预测测试集列数不匹配如何解决
问题根因
该报错是BayesTree包gbart/wbart函数的典型设计逻辑问题,触发原因有两个:
- 若输入的训练特征包含因子型变量,
gbart拟合时会自动将因子转换为独热编码,实际训练用到的特征维度远高于原始输入的25列(4~28列共25个变量),编码后总维度达到50列,而你传入predict的测试集是未编码的原始25列,维度不匹配。 - 你在调用
gbart拟合时已经传入了xtest参数,模型对象内部已经自带测试集预测结果,额外调用predict属于多余操作,会触发不必要的维度校验逻辑。
排查步骤
- 运行
sapply(xtrain, class)查看训练特征的变量类型,确认是否存在因子(factor)类型字段 - 检查
gbart调用参数,确认是否已经传入了测试集xtest
解决方案
方案一:直接提取内置预测结果(推荐)
拟合时已经传入xtest的场景下,不需要调用predict函数,直接从模型对象中提取测试集预测结果即可:
# yhat.test每行对应一次后验抽样,每列对应一个测试样本 test_post_result <- bartfit$yhat.test # 取后验均值作为最终预测值 test_pred <- colMeans(test_post_result)
方案二:适配全新测试集的预测逻辑
如果需要对拟合时未传入的全新数据集做预测,先统一训练、测试集的特征编码逻辑,避免自动独热导致维度不一致:
# 1. 对全量特征手动做独热编码,保证编码逻辑统一,去掉截距项 x_encoded <- model.matrix(~ . -1, data = x) # 2. 拆分训练、测试集 xtrain <- x_encoded[train, ] xtest <- x_encoded[-train, ] # 3. 拟合时不传xtest参数 bartfit <- gbart(xtrain, ytrain) # 4. 此时调用predict不会触发维度不匹配报错 test_pred <- colMeans(predict(bartfit, xtest))
内容的提问来源于stack exchange,提问作者RoiMinuit
相关产品推荐
相关产品推荐

