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

时间:2016-03-21 03:38:02

标签: r machine-learning r-caret

我正在尝试在多类预测问题上使用xgboost模型,并希望使用caret来进行超参数搜索。 为了测试包,我使用了以下代码,当我不使用trainControl提供train对象时需要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"
)

但是,当我向train提供trainControl对象时,代码永远不会完成..或者花费很长时间(至少它完成了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"
)

为什么会这样?

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

 dim(sparse_train)
[1] 702402     36

2 个答案:

答案 0 :(得分:6)

您的trainControl对象不同。

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

答案 1 :(得分:1)

您可以尝试的另一件事是将nthread = 1添加到caret::train()来电。

XGBoost和Caret都尝试在可能的情况下使用并行/多核处理,并且在过去我发现(静默地)导致太多线程产生,限制你的机器。

告诉插入符号按顺序处理模型可以最大限度地减少问题,并且应该意味着只有xgboost才会产生线程。