2017-08-11 45 views
2

我剛開始嘗試R包mlr,我想知道如果我可以自定義訓練集和測試集。例如,時間序列的所有數據都是訓練集,除了最後一個,最後一個是測試集。這裏是我的例子,如何使用surv預測最後一行數據時如何對resutls進行重新採樣和比較。函數在mlr包中,R?

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) 

肺數據來自生存包。我只使用三個維度:時間,地位和年齡。現在,讓我們假設他們並不意味着病人的年齡和他們能夠存活多久。假設這是一位顧客的墨水購買歷史。年齡= 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 

你可以看到,我在makeResampleDesc,因爲我有固定的訓練集,並不需要進行重新採樣使用split=1。在makeTuneWrapper中的措施對我來說目前沒有意義,因爲我需要自定義我自己的措施。由於固定的數據拆分,當使用不同的超參數時,我不能使用resampletuneParams等函數來獲取測試數據的評估。所以,我的問題是:當訓練集和測試集是固定的,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! 

誰能請幫助?

+0

請問您可以添加您使用的軟件包嗎?另外,它似乎是'target = c('DaysDiff','Status')' – loki

+0

我只是使用包mr。版本是2.11 –

+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是唯一有意義一個更大的測試集。

+0

非常感謝。你能解釋一下什麼是cv2嗎? –

+0

cv2只是'makeResampleDesc(「CV」,iters = 2)'的一個快捷方式''所以進行雙重交叉驗證。 –

相關問題