自定义Recipe步骤依赖结果变量时Tidymodels预测报错的解决
解决tidymodels自定义step_limma预测时的target列缺失问题
问题背景
为基于基因表达的分类器实现了自定义tidymodels recipe步骤step_limma,该步骤利用limma进行二元结果变量的差异表达分析,筛选指定数量的特征基因。但在使用predict函数对不含结果变量target的测试集进行预测时,bake阶段的dplyr::select操作因尝试选择不存在的target列而报错。
解决方案
修改bake.step_limma函数,增加对new_data中是否存在target列的判断:
- 处理训练数据(包含
target列)时,保留target和选中的特征 - 处理测试/预测数据(无
target列)时,仅保留选中的特征
修改后的代码
仅需替换原有的bake.step_limma函数:
bake.step_limma <- function(object, new_data, ...) { # 判断target列是否存在于new_data中 if (object$target %in% colnames(new_data)) { new_data <- new_data %>% dplyr::select(object$target, dplyr::all_of(object$features)) } else { new_data <- new_data %>% dplyr::select(dplyr::all_of(object$features)) } new_data }
验证效果
替换上述函数后,重新运行预测代码:
fit %>% predict(set_test)
此时将正常返回预测结果,不再出现target列缺失的报错。
补充说明
tidymodels在预测阶段会自动剥离测试集中的结果变量(如果存在),但如果测试集本身就不含target列,自定义步骤的bake操作必须兼容这种情况。通过条件判断可以确保步骤在训练和预测阶段都能正确运行。
内容的提问来源于stack exchange,提问作者Patrick Gauthier
相关产品推荐
相关产品推荐

