为什么要使用;xgbTree“;在列车控制中,插入符号如此缓慢?

为什么要使用;xgbTree“;在列车控制中,插入符号如此缓慢?,r,machine-learning,r-caret,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_chi

我试图将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"
)
为什么会这样

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

 dim(sparse_train)
[1] 702402     36

您的列车控制对象不同

在第一个trainControl对象中,方法是
method=“none”

在第二个列车控制对象中,方法是
method=“cv”
number=2
。因此,在第二个对象中,您正在运行双重交叉验证,这比不运行交叉验证花费的时间更长

您可以尝试的另一件事是将
nthread=1
添加到
caret::train()
调用中

XGBoost和Caret都尝试在可能的情况下使用并行/多核处理,而在过去,我发现这会(无声地)导致太多线程生成,从而限制您的机器


告诉插入符号按顺序处理模型可以最小化问题,并且应该意味着只有xgboost将生成线程

你有一个可复制的例子吗?我注意到了完全相同的事情。将trainControl()直接放入train()对象中,而不是首先将其设置为自己的变量,可以显著提高速度。这是事实,但我不希望它将时间从20秒增加到15分钟以上。
 dim(sparse_train)
[1] 702402     36