XG在R中使用mlr增强生存能力

XG在R中使用mlr增强生存能力,r,xgboost,mlr,survival,R,Xgboost,Mlr,Survival,我想使用mlr在R中的右删失生存数据上运行xgboost。xgboost代码列出了一个目标函数survival:cox,它表示: 生存率:右删失生存时间数据的cox:cox回归(负值视为右删失) 我正在使用的MLR2只支持回归和分类学习者的xgboost。如果我尝试使用xgboost的内置回归学习器,它会使用mse作为评估指标。因此,我尝试将度量值更改为cindex,但得到了错误 措施:cindex cindex 乐趣中的错误(X[[i]],…): Measure cindex不支持任务类型re

我想使用mlr在R中的右删失生存数据上运行xgboost。xgboost代码列出了一个目标函数survival:cox,它表示:

生存率:右删失生存时间数据的cox:cox回归(负值视为右删失)

我正在使用的MLR2只支持回归和分类学习者的xgboost。如果我尝试使用xgboost的内置回归学习器,它会使用mse作为评估指标。因此,我尝试将度量值更改为cindex,但得到了错误

措施:cindex cindex
乐趣中的错误(X[[i]],…): Measure cindex不支持任务类型regr

因此,我尝试为xgboost编写一个新的生存学习器,它只是回归学习器的一个副本,但“Regr”改为“Surv”,但它当然希望目标有两列-时间和状态-并且不接受负时间,而xgboost只需要一列time,并假设时间为负值的任何行都会被删除

下面是我试过的。有没有办法在mlr2或mlr3中实现这一点

  • 使用xgboost的内置回归学习器:
  • 数据(退伍军人)
    
    退伍军人\u xgb我找到了解决方案,并在此处更新了我的自定义学习者:

    诀窍是修改trainlearner.surv.xgboost函数。作为一名生存学习者,它希望通过包含2列时间和状态的目标传递数据。但在该学习者中,我们可以计算xgboost期望的目标,对经过审查的数据使用负时间,然后将这个新的单列目标传递给xgboost:

     trainLearner.surv.xgboost = function(.learner, .task, .subset, .weights = NULL,  ...) {
      parlist = list(...)
    
      if (is.null(parlist$objective))
      {
        parlist$objective = "survival:cox"
        parlist$eval_metric = "cox-nloglik"
      }
    
      task.data = getTaskData(.task, .subset, target.extra = TRUE)
      survtime <- ifelse(task.data$target$status==1, task.data$target$time, -task.data$target$time)
    
      parlist$data = xgboost::xgb.DMatrix(data = data.matrix(task.data$data), label = survtime)
    
      if (!is.null(.weights))
        xgboost::setinfo(parlist$data, "weight", .weights)
    
      if (is.null(parlist$watchlist))
        parlist$watchlist = list(train = parlist$data)
    
      do.call(xgboost::xgb.train, parlist)
    }
    
    trainLearner.surv.xgboost=函数(.learner、.task、.subset、.weights=NULL,…){
    parlist=list(…)
    if(is.null(参数列表$objective))
    {
    参数列表$objective=“生存:考克斯”
    参数列表$eval\u metric=“cox nloglik”
    }
    task.data=getTaskData(.task、.subset、target.extra=TRUE)
    
    survtime如果我理解正确的话,你正在尝试实现xgboost的生存版本?你有没有看过其他一些生存学习者,看看他们是如何实现的?这也应该很有帮助。是的,@Lars Kotthoff,我正在尝试在mlr中创建xgboost的生存版本。谢谢你的回答。我知道如何创建我自己的生存版本学习者,但主要问题是,正如我前面所述,mlr生存学习者希望目标有两列,状态和时间,而xgboost希望目标只有一列,时间,状态由时间是正是负来表示。因此,我看不到任何方法在mlr中创建xgboost的生存版本。听起来你不能用xgboost这么做。也许有帮助?嘿,@panda,你知道你可以勾选自己的问题吗?
        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)
    
     trainLearner.surv.xgboost = function(.learner, .task, .subset, .weights = NULL,  ...) {
      parlist = list(...)
    
      if (is.null(parlist$objective))
      {
        parlist$objective = "survival:cox"
        parlist$eval_metric = "cox-nloglik"
      }
    
      task.data = getTaskData(.task, .subset, target.extra = TRUE)
      survtime <- ifelse(task.data$target$status==1, task.data$target$time, -task.data$target$time)
    
      parlist$data = xgboost::xgb.DMatrix(data = data.matrix(task.data$data), label = survtime)
    
      if (!is.null(.weights))
        xgboost::setinfo(parlist$data, "weight", .weights)
    
      if (is.null(parlist$watchlist))
        parlist$watchlist = list(train = parlist$data)
    
      do.call(xgboost::xgb.train, parlist)
    }
    
    library(xgboost)
    library(survival)
    library(mlr)
    source("RLearner_surv_xgboost.R")
    
    data(veteran)
    veteran.xgb <- veteran[, !(names(veteran) %in% c("celltype"))]
    
    xgb.task <- makeSurvTask(id="XGBOOST_VET", data = veteran.xgb, target = c("time", "status"))
    surv.measures = list(cindex)
    outer= makeResampleDesc("CV", iters=5)
    
    xgb.learner <- makeLearner(id="xgboost",
                              cl="surv.xgboost",
                              predict.type = "response")
    learners = list(xgb.learner)
    bmr = benchmark(learners, xgb.task, outer, surv.measures, show.info = TRUE)