我正在尝试在多类预测问题上使用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
答案 0 :(得分:6)
您的trainControl对象不同。
在第一个trainControl对象中,方法为method="none"
。
在第二个trainControl对象中,方法为method="cv"
和number=2
。因此,在第二个对象中,您运行的是双重交叉验证,这需要更长时间才能运行交叉验证。
答案 1 :(得分:1)
您可以尝试的另一件事是将nthread = 1
添加到caret::train()
来电。
XGBoost和Caret都尝试在可能的情况下使用并行/多核处理,并且在过去我发现(静默地)导致太多线程产生,限制你的机器。
告诉插入符号按顺序处理模型可以最大限度地减少问题,并且应该意味着只有xgboost才会产生线程。