当我只想使用 sub 预测数据的最后一行时如何重新采样和比较结果。 mlr 包中的函数,R?
how to resample and compare the resutls when I just want to predict the last row of the data using surv. functions in mlr package, R?
我刚开始尝试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)
肺部数据来自生存包。我只使用三个维度:时间、状态和年龄。现在,让我们假设它们并不意味着病人的年龄和他们能活多久。假设这是一位客户的墨水购买历史。
age=74表示该客户当天购买了74瓶墨水,time=306表示客户运行306天后墨水用完。所以,我想使用除最后一行以外的所有数据建立一个生存模型。然后,当我有了最后一行的数据,即age=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
你可以看到我在makeResampleDesc
中使用了split=1
,因为我有固定的训练集,不需要重新采样。 makeTuneWrapper
中的措施目前对我没有意义,因为我需要自定义我自己的措施。由于固定数据拆分,我无法使用 resample
或 tuneParams
等函数在使用不同的超参数时对测试数据进行评估。
所以,我的问题是:在训练集和测试集固定的情况下,mlr能否对每个超参数进行全面的比较?如果可以,怎么做?
顺带一提,貌似有个函数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!
使用 makeFixedHoldoutInstance
可以得到您要求的重采样。
但是您不能将相同的固定重采样索引用于调整包装器内部的调整和重采样。
这是因为首先resample
会根据固定的holdout实例f
拆分数据。然后调整包装器内部的调整也需要一个重采样方法来计算给定配置的性能。由于调整只能看到 resample
完成拆分后的数据,因此无法应用相同的固定重采样。
从阅读你的问题我猜你不想使用 tuneWrapper
但你想直接调整你的学习者。所以你应该简单地使用 tuneParams
:
tr = tuneParams(learner = surv.lrn, task = surv.task, resampling = cv2, par.set = ps, control = ctrl)
注意:这对给定的例子不起作用,因为 cindex 需要至少一个未经审查的观察,即使那样它也没有意义,因为 cindex 只对一个有意义更大的测试集。
我刚开始尝试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)
肺部数据来自生存包。我只使用三个维度:时间、状态和年龄。现在,让我们假设它们并不意味着病人的年龄和他们能活多久。假设这是一位客户的墨水购买历史。
age=74表示该客户当天购买了74瓶墨水,time=306表示客户运行306天后墨水用完。所以,我想使用除最后一行以外的所有数据建立一个生存模型。然后,当我有了最后一行的数据,即age=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
你可以看到我在makeResampleDesc
中使用了split=1
,因为我有固定的训练集,不需要重新采样。 makeTuneWrapper
中的措施目前对我没有意义,因为我需要自定义我自己的措施。由于固定数据拆分,我无法使用 resample
或 tuneParams
等函数在使用不同的超参数时对测试数据进行评估。
所以,我的问题是:在训练集和测试集固定的情况下,mlr能否对每个超参数进行全面的比较?如果可以,怎么做?
顺带一提,貌似有个函数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!
使用 makeFixedHoldoutInstance
可以得到您要求的重采样。
但是您不能将相同的固定重采样索引用于调整包装器内部的调整和重采样。
这是因为首先resample
会根据固定的holdout实例f
拆分数据。然后调整包装器内部的调整也需要一个重采样方法来计算给定配置的性能。由于调整只能看到 resample
完成拆分后的数据,因此无法应用相同的固定重采样。
从阅读你的问题我猜你不想使用 tuneWrapper
但你想直接调整你的学习者。所以你应该简单地使用 tuneParams
:
tr = tuneParams(learner = surv.lrn, task = surv.task, resampling = cv2, par.set = ps, control = ctrl)
注意:这对给定的例子不起作用,因为 cindex 需要至少一个未经审查的观察,即使那样它也没有意义,因为 cindex 只对一个有意义更大的测试集。