【问题标题】:CARET. Relationship between data splitting and trainControl插入符号。数据拆分与trainControl的关系
【发布时间】:2013-02-04 19:21:05
【问题描述】:

我仔细阅读了CARET 的文档:http://caret.r-forge.r-project.org/training.html,这些小插曲,一切都很清楚(网站上的例子很有帮助!),但我仍然对两个参数之间的关系感到困惑致trainControl

method 
index

以及trainControl 与插入符号中的数据拆分函数之间的相互作用(例如createDataPartitioncreateResamplecreateFoldscreateMultiFolds

为了更好地表达我的问题,让我使用文档中的以下示例:

data(BloodBrain)
set.seed(1)
tmp <- createDataPartition(logBBB,p = .8, times = 100)
trControl = trainControl(method = "LGOCV", index = tmp)
ctreeFit <- train(bbbDescr, logBBB, "ctree",trControl=trControl)

我的问题是:

  1. 如果我使用createDataPartition(我假设它会进行分层引导),如上例所示,并将结果作为index 传递给trainControl,我是否需要使用LGOCV 作为我的电话trainControl 中的方法?如果我使用另一个(例如cv)会有什么不同?在我看来,一旦你修复了index,你实际上是在选择交叉验证的类型,所以我不确定如果你使用indexmethod 扮演什么角色。

  2. createDataPartitioncreateResample 有什么区别?是不是createDataPartition 进行分层引导,而createResample 没有?

3) 我如何使用插入符号进行分层 k-fold(例如 10 折)交叉验证?下面会做吗?

tmp <- createFolds(logBBB, k=10, list=TRUE,  times = 100)
trControl = trainControl(method = "cv", index = tmp)
ctreeFit <- train(bbbDescr, logBBB, "ctree",trControl=trControl)

【问题讨论】:

    标签: r machine-learning cross-validation


    【解决方案1】:

    如果您不确定使用索引时方法扮演什么角色,为什么不应用所有方法并比较结果。这是一种盲目的比较方法,但它可以给你一些直觉。

      methods <- c('boot', 'boot632', 'cv', 
                   'repeatedcv', 'LOOCV', 'LGOCV')
    

    我创建我的索引:

      n <- 100
      tmp <- createDataPartition(logBBB,p = .8, times = n)
    

    我为我的方法列表应用trainControl,并从结果中删除索引,因为它对我的所有方法都是通用的。

    ll <- lapply(methods,function(x)
             trControl = trainControl(method = x, index = tmp))
    ll <- sapply(ll,'[<-','index', NULL)
    

    因此我的 ll 是:

                     [,1]      [,2]      [,3]      [,4]         [,5]      [,6]     
    method            "boot"    "boot632" "cv"      "repeatedcv" "LOOCV"   "LGOCV"  
    number            25        25        10        10           25        25       
    repeats           25        25        1         1            25        25       
    verboseIter       FALSE     FALSE     FALSE     FALSE        FALSE     FALSE    
    returnData        TRUE      TRUE      TRUE      TRUE         TRUE      TRUE     
    returnResamp      "final"   "final"   "final"   "final"      "final"   "final"  
    savePredictions   FALSE     FALSE     FALSE     FALSE        FALSE     FALSE    
    p                 0.75      0.75      0.75      0.75         0.75      0.75     
    classProbs        FALSE     FALSE     FALSE     FALSE        FALSE     FALSE    
    summaryFunction   ?         ?         ?         ?            ?         ?        
    selectionFunction "best"    "best"    "best"    "best"       "best"    "best"   
    preProcOptions    List,3    List,3    List,3    List,3       List,3    List,3   
    custom            NULL      NULL      NULL      NULL         NULL      NULL     
    timingSamps       0         0         0         0            0         0        
    predictionBounds  Logical,2 Logical,2 Logical,2 Logical,2    Logical,2 Logical,2
    

    【讨论】:

    • 有趣。谢谢!我很难将您的答案映射到我的问题。基于此,您认为index 在这里扮演了什么角色?
    • @user273158 索引的作用是什么意思?索引只是你的 tmp 矢量...你的分区..
    • 嗯,但是像boot (bootstrapping) 这样的方法如何使用index 中指定的分区?我将引导程序理解为 CV 的一种方法(带替换的样本进行训练,并评估剩下的内容),但不理解 index 在引导程序中的使用方式。
    • @user273158 是的,我知道。我不确定......但我认为你的猜测是正确的。一旦你修复了索引,你正在做一种预采样(离线),并且通过方法它是在线采样......我正在验证一些东西,我之后会发布我的最终答案...
    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多