随机生存森林(RSF)模型SHAP值绘图报错求助:预测值需为数值型
问题描述
使用随机生存森林(RSF)模型绘制SHAP值时,执行代码触发报错:
Fejl i align_pred(pred_fun(object, bg_X, ...)) : Predictions must be numeric!
用户已确认模型的predicted结果为数值型数组,但无法定位问题根源。相关代码及预测值示例如下:
运行代码
xvars <- c("RIDRETH1", "RXDLIPID", "DRXTKCAL", "DRXTPROT", "DRXTCARB", "DRXTCHOL", "DRXTFIBE", "DRXTVARA", "DRXTATOC", "DRXTSODI", "DRXTPOTA", "DRXTM161", "DRXTM181", "DRXTM201", "DRXTM221", "DRXTP182", "DRXTP183", "DRXTP184", "DRXTP204", "DRXTP205", "DRXTP225", "DRXTP226", "DRXTRET", "DRXT_G_TOTAL", "DRXT_V_STARCHY_TOTAL", "DRXTS160", "DRXTS180", "DRXTsumSFA", "INDFMPIR", "LBXCOT", "GENDERRC") X <- Data[sample(nrow(Data), 1000), xvars] bg_X <- Data[sample(nrow(Data), 200), ] system.time( ks <- kernelshap(rf_mort_nutrients_withoutage_1018_all, X, bg_X = bg_X, type = 'prob') ) ks ks <- shapviz(ks) sv_importance(ks, kind = "bee", )
模型预测值示例
rf_mort_nutrients_withoutage_1018_all$predicted [1] 81.31376 75.82491 99.35944 58.63055 67.65847 98.32906 75.33934 107.81604 62.22175 75.69875 69.99881 83.67161 81.39735 65.59381
问题分析与解决方法
特征列不匹配:
X仅包含xvars指定的特征,但bg_X取了全数据集的行,包含额外列。模型预测时输入特征不一致,可能导致输出格式异常。
解决:修改bg_X定义,仅保留xvars列:bg_X <- Data[sample(nrow(Data), 200), xvars]type='prob'参数不适用:随机生存森林的预测目标通常是风险值或生存时间,并非分类任务的概率。kernelshap的type='prob'会触发分类模型的预测逻辑,导致输出不符合要求。
解决:移除type='prob'参数,或根据RSF模型输出类型指定正确参数(如type='response')。预测函数输出格式异常:默认预测函数可能返回带额外属性的对象(如矩阵、列表),而非纯数值向量——即使
model$predicted是数值型也可能出现此问题。
解决:自定义预测函数,强制返回数值向量:pred_fun <- function(model, newdata) { as.numeric(predict(model, newdata = newdata)) }然后在
kernelshap中指定该函数:ks <- kernelshap(rf_mort_nutrients_withoutage_1018_all, X, bg_X = bg_X, pred_fun = pred_fun)背景数据集类型不匹配:检查
bg_X与X的特征数据类型是否完全一致(如因子列的水平、数值列的类型),类型不匹配可能导致预测输出异常。
解决:用str(X)和str(bg_X)对比特征类型,对不一致的列进行转换统一。
内容的提问来源于stack exchange,提问作者mtvpr
相关产品推荐
相关产品推荐

