为什么使用trainControl在插入符号中使用"xgbTree"这么慢?

Alb*_*lby 1 r machine-learning r-caret

我试图在多类预测问题上拟合xgboost模型,并希望caret用来进行超参数搜索.为了测试包,我使用了以下代码,当我不train使用trainControl 提供对象时需要20秒

# just use one parameter combination
xgb_grid_1 <- expand.grid(
  nrounds = 1,
  eta = 0.3,
  max_depth = 5,
  gamma = 0,
  colsample_bytree=1, 
  min_child_weight=1
)
# train
xgb_train_1 = train(
  x = as.matrix(sparse_train),
  y = conversion_tbl$y_train_c ,
  trControl = trainControl(method="none", classProbs = TRUE, summaryFunction = multiClassSummary),
  metric="logLoss",
  tuneGrid = xgb_grid_1,
  method = "xgbTree"
)
Run Code Online (Sandbox Code Playgroud)

但是,当我提供traintrainControl对象时,代码永远不会完成..或者花费很长时间(至少它完成了15分钟.

xgb_trcontrol_1 <- trainControl(
  method = "cv",
  number = 2,
  verboseIter = TRUE, 
  returnData = FALSE,
  returnResamp = "none",                                         
  classProbs = TRUE,                                           
  summaryFunction = multiClassSummary
)
xgb_train_1 = train(
  x = as.matrix(sparse_train),
  y = conversion_tbl$y_train_c ,
  trControl = xgb_trcontrol_1,
  metric="logLoss",
  tuneGrid = xgb_grid_1,
  method = "xgbTree"
)
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

仅供参考,我的数据大小是

 dim(sparse_train)
[1] 702402     36
Run Code Online (Sandbox Code Playgroud)

小智 6

您的trainControl对象是不同的.

在第一个trainControl对象中,方法是method="none".在第二个trainControl对象中,方法是method="cv"number=2.因此,在第二个对象中,您运行的是双重交叉验证,这需要更长时间才能运行交叉验证.