【发布时间】:2019-11-05 22:37:57
【问题描述】:
我想使用 mlr 对 R 中右删失的生存数据运行 xgboost。xgboost 代码列出了一个目标函数survival:cox,它说:
survival:cox:右删失生存时间数据的 Cox 回归(负值被视为右删失)。
我正在使用的 Mlr 2 仅支持用于回归和分类学习器的 xgboost。如果我尝试使用 xgboost 的内置回归学习器,它会使用 mse 作为评估指标。所以我尝试将指标更改为 cindex 并得到错误
措施:cindex cindex
FUN(X[[i]], ...) 中的错误: 度量 cindex 不支持任务类型 regr!
然后我尝试为 xgboost 编写一个新的生存学习器,它只是回归学习器的副本,但“Regr”更改为“Surv”,但它当然希望目标有 2 列 - 时间和status - 并且不接受负时间,而 xgboost 只需要一列 - time - 并假定时间为负值的任何行都会被审查。
以下是我尝试过的。有没有办法在 mlr2 或 mlr3 中实现这一点?
- 为 xgboost 使用内置回归学习器:
data(veteran)
veteran_xgb <- veteran
veteran_xgb <- veteran_xgb[c("trt", "karno", "diagtime", "age", "prior", "time")]
veteran_xgb$time <- ifelse(veteran$status==1, veteran$time, -veteran$time)
xgb.task <- makeRegrTask(id="XGBOOST_VET", data = veteran_xgb, target="time")
xgb_learner <- makeLearner(id="xgboost",
cl="regr.xgboost",
predict.type = "response",
par.vals = list(
objective = "survival:cox",
eval_metric = "cox-nloglik",
nrounds = 200
)
)
learners = list(xgb_learner)
outer = makeResampleDesc("CV", iters=5) # Benchmarking
bmr = benchmark(learners, xgb.task, outer, show.info = TRUE)
- 为 xgboost 使用自定义 surv 学习器:
data(veteran)
veteran_xgb <- veteran
veteran_xgb <- veteran_xgb[c("trt", "karno", "diagtime", "age", "prior", "time", "status")]
veteran_xgb$time <- ifelse(veteran$status==1, veteran$time, -veteran$time)
xgb.task <- makeSurvTask(id="XGBOOST_VET", data = veteran_xgb, target = c("time", "status"))
xgb_learner <- makeLearner(id="xgboost",
cl="surv.xgboost",
predict.type = "response",
par.vals = list(
objective = "survival:cox",
eval_metric = "cox-nloglik",
nrounds = 200
)
)
learners = list(xgb_learner)
outer = makeResampleDesc("CV", iters=5) # Benchmarking
surv.measures = list(cindex)
bmr = benchmark(learners, xgb.task, outer, surv.measures, show.info = TRUE)
文件 RLearner_surv_xgboost.R 可以从 OneDrive 下载 https://1drv.ms/u/s!AjTjdzp0sDJRrhZtZF5-HZF2BrBB?e=FNLS94
【问题讨论】:
-
如果我理解正确,您正在尝试实现 xgboost 的生存版本?您是否看过其他一些生存学习者以了解它们是如何实施的? tutorial chapter on how to create your own learner 也应该有帮助。
-
是的,@Lars Kotthoff,我正在尝试在 mlr 中创建 xgboost 的生存版本。感谢您的答复。我确实知道如何创建自己的学习器,但主要问题是,如上所述,mlr 生存学习器期望目标有 2 列,状态和时间,而 xgboost 期望目标只有一列,时间, 状态由时间是正还是负来表示。所以我看不到任何方法可以在 mlr 中创建 xgboost 的生存版本。
-
听起来你不能用 xgboost 做到这一点。也许this issue 有帮助?