在tidymodels中调优正则化Cox比例风险模型遇模式错误求助
解决tidymodels中正则化Cox比例风险模型调优的"未知模式"错误
你的核心问题出在响应变量的定义方式以及调优时的指标适配问题,以下是具体修正方案:
问题根源
- 配方中你将
time和status作为两个独立的响应变量,但Cox模型需要的是一个Surv()生存对象作为单一响应。 tune_grid()默认的指标集不支持censored regression模式,需要显式指定生存分析专用的评估指标。
修正后的完整代码
library(glmnet) library(survival) library(tidymodels) library(censored) data("CoxExample") # 合并数据并正确构造生存响应列 df <- as.data.frame(cbind(CoxExample[["y"]], CoxExample[["x"]])) df$surv_obj <- with(df, Surv(time, status)) # 修正配方:使用生存对象作为响应 lasso_prep <- recipe(surv_obj ~ ., data = df) %>% step_rm(time, status) %>% # 移除单独的时间和状态列,避免冗余 step_normalize(all_predictors()) # 模型定义:保持penalty调优、mixture=1(LASSO) lasso_tune <- proportional_hazards(penalty = tune(), mixture = 1) %>% set_engine("glmnet") %>% set_mode("censored regression") # 工作流整合 lasso_workflow <- workflow() %>% add_recipe(lasso_prep) %>% add_model(lasso_tune) # 交叉验证与调优网格 set.seed(123) cv_splits <- vfold_cv(df, v = 10) lambda_grid <- grid_regular(penalty(), levels = 50) # 显式指定生存分析指标,解决模式不匹配问题 lasso_grid <- tune_grid( lasso_workflow, resamples = cv_splits, grid = lambda_grid, metrics = metric_set(censored::concordance_survival) )
关键修改说明
- 响应变量处理:新增
surv_obj列存储Surv(time, status)对象,配方中以此作为响应,同时移除单独的time和status列避免混淆。 - 指标指定:通过
metrics = metric_set(censored::concordance_survival)指定生存分析专用的C指数指标,确保check_metrics()能识别censored regression模式。 - 模型定义部分无需修改,你原本的
proportional_hazards()配置是正确的,错误并非来自模型模式的指定。
验证结果
运行修正后的代码后,tune_grid()将正常执行交叉验证调优,你可以通过collect_metrics(lasso_grid)查看不同penalty下的模型性能。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

