当我想用surv预测数据的最后一行时,如何重新采样和比较resutls。函数在mlr包中,R?

时间:2017-08-11 06:02:57

标签: r mlr

我刚开始尝试R包mlr,我想知道我是否可以自定义训练集和测试集。例如,时间序列的所有数据都是训练集,除了最后一个,最后一个是测试集。这是我的例子,

library(mlr)
library(survival)
data(lung)
myData2 <- lung %>%
    select(time,status,age)
myData2$status = (myData2$status == 2)
myTrain <- c(1:(nrow(myData2)-1))
myTest <- nrow(myData2)

肺部数据来自生存包。我只使用三个维度:时间,地位和年龄。现在,让我们假设他们不代表患者&#39;年龄和他们能活多久。让我们说这是一个客户的墨水购买历史。年龄= 74表示该客户当天购买了74瓶墨水,时间= 306表示客户在306天后用完墨水。所以,我想建立一个使用除最后一行之外的所有数据的生存模型。然后,当我有最后一行的数据,即年龄= 58,暗示客户当天购买了58瓶墨水时,我可以按时进行预测。接近177的数字将是一个很好的估计。因此,我的训练集和测试集是固定的,不需要重新采样。

另外,我需要更改超参数以进行比较。这是我的代码:

surv.task <- makeSurvTask(data=myData2,target=c('time','status'))
surv.lrn <- makeLearner("surv.cforest")
ps <- makeParamSet(
  makeDiscreteParam('mincriterion',values=c(1.281552,2,3)),
  makeDiscreteParam('ntree',values=c(100,200,300))
)
ctrl <- makeTuneControlGrid()
rdesc <- makeResampleDesc('Holdout',split=1,predict='train') 
lrn = makeTuneWrapper(surv.lrn,control=ctrl,resampling=rdesc,par.set=ps,
                      measures = list(setAggregation(cindex,train.mean)))
mod <- train(learner=lrn,task=surv.task,subset=myTrain)
surv.pred <- predict(mod,task=surv.task,subset=myTest)
surv.pred

您可以看到我在split=1中使用makeResampleDesc,因为我有固定的训练集,不需要重新采样。 makeTuneWrapper中的度量对我来说当前没有意义,因为我需要自定义自己的度量。由于固定数据拆分,我无法使用resampletuneParams等函数在使用不同的超参数时对测试数据进行评估。所以,我的问题是:当训练集和测试集固定时,mlr可以为每个超参数提供全面的比较吗?如果是的话,该怎么做?

BTW,看起来有功能makeFixedHoldoutInstance可能会这样做,只是不知道如何使用它。例如,我以这种方式使用makeFixedHoldoutInstance并且我有这样的错误信息:

> f <- makeFixedHoldoutInstance(train.inds=myTrain,test.inds=myTest,size=length(myTrain)+1)
> lrn = makeTuneWrapper(surv.lrn,control=ctrl,resampling=f,par.set=ps)
> resample(learner=lrn,task=surv.task,resampling=f)
[Resample] holdout iter 1: [Tune] Started tuning learner surv.cforest for parameter set:
                 Type len Def       Constr Req Tunable Trafo
mincriterion discrete   -   - 1.281552,2,3   -    TRUE     -
ntree        discrete   -   -  100,200,300   -    TRUE     -
With control class: TuneControlGrid
Imputation value: -0
[Tune-x] 1: mincriterion=1.281552; ntree=100
Error in resample.fun(learner2, task, resampling, measures = measures,  : 
  Size of data set: 227 and resampling instance: 228 differ!

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

使用makeFixedHoldoutInstance,您可以获得所要求的重新取样。 但是,您无法使用相同的固定重采样索引进行调整包装器内的调整和重采样。

这是因为第一个resample将根据固定的保留实例f拆分数据。然后,调整包装器内部的调整还需要重采样方法来计算给定配置的性能。由于调优仅在resample完成拆分后才能看到数据,因此无法应用相同的固定重采样。

通过阅读您的问题,我猜您不想使用tuneWrapper,但您希望直接调整您的学习者。所以你应该只使用tuneParams

tr = tuneParams(learner = surv.lrn, task = surv.task, resampling = cv2, par.set = ps, control = ctrl)

注意:这对给定的例子不起作用,因为cindex需要至少一个未经审查的观察,即使这样也没有意义,因为cindex只对更大的测试集有意义。< / p>