如何使用XGBoost自定义交叉验证折叠

时间:2016-07-09 23:34:31

标签: r xgboost

我使用R包装器进行XGBoost。在函数 xgb.cv 中,有一个带有描述的folds参数

  

列表提供了使用预定义CV折叠列表的可能性   (每个元素必须是折叠索引的向量)。如果是折叠   提供,nfold和分层参数将被忽略。

那么,我是否只是指定训练模型的指数并假设其余的将用于测试?例如,如果我的训练数据类似于

    Feature1 Feature2 Target
 1:        2       10     10
 2:        7        1      9
 3:        8        2      3
 4:        8       10      7
 5:        8        2      9
 6:        3        7      3

我希望使用((1,2,3),(4,5,6))和((4,5,6),(1,2,3)使用(训练,测试)指数进行交叉验证))我设置folds=list(c(1,2,3), c(4,5,6))

3 个答案:

答案 0 :(得分:2)

通过一些试验和错误,我发现xgboost正在使用传递的索引作为 test 折叠的索引。通过注意xgboost的当前开发版本明确指出documentation来确认这一点。

答案 1 :(得分:2)

以下是生成折叠并使用它们的示例。

假设在我们的数据框中我们有一列id,这样我们就想把所有具有给定id值的行放在一个折叠中。

以下代码

  • 找到唯一的ID
  • 预先分配折叠列表
  • 迭代id,创建匹配

    的行索引列表

    fold.ids <- unique(df$id) custom.folds <- vector("list", length(fold.ids)) i <- 1 for( id in fold.ids){ custom.folds[[i]] <- which( df$id %in% id ) i <- i+1 }

以下是使用xgb.cv

中上述折叠列表的示例

res <- xgb.cv(param, dtrain, nround, folds=custom.folds, prediction = TRUE)

其他xgb.cv参数的合理值可以是found in the documentation

答案 2 :(得分:1)

这对我来说效果最好:

custom.folds <- caret::createFolds(data$Label, k=10, list=T)

xgbcv <- xgb.cv(
  params = params
  ,data = df
  ,maximize = F
  ,prediction = T
  ,metrics = "logloss"
  ,folds = custom.folds
)