我正在尝试在一个多类预测问题上拟合xgboost模型,并希望使用caret
来进行超参数搜索。为了测试这个包,我使用了以下代码,当我不向train
对象提供trainControl时,执行时间为20秒。
# 只使用一个参数组合xgb_grid_1 <- expand.grid( nrounds = 1, eta = 0.3, max_depth = 5, gamma = 0, colsample_bytree=1, min_child_weight=1)# 训练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
回答:
你的trainControl对象是不同的。
在第一个trainControl对象中,方法是method="none"
。在第二个trainControl对象中,方法是method="cv"
和number=2
。因此,在第二个对象中,你正在运行一个两折交叉验证,这比不运行交叉验证需要更长的时间。