gpt4 book ai didi

r - R : how does xgb. cv 中的 xgboost 将最优参数传递到 xgb.train

转载 作者:行者123 更新时间:2023-11-30 08:20:25 25 4
gpt4 key购买 nike

我一直在探索 R 中的 xgboost 包,并完成了几个演示和教程,但这仍然让我感到困惑:在使用 xgb.cv 进行交叉之后验证,最优参数如何传递给xgb.train?或者我应该根据xgb.cv的输出计算理想参数(例如nroundmax.depth)?

param <- list("objective" = "multi:softprob",
"eval_metric" = "mlogloss",
"num_class" = 12)
cv.nround <- 11
cv.nfold <- 5
mdcv <-xgb.cv(data=dtrain,params = param,nthread=6,nfold = cv.nfold,nrounds = cv.nround,verbose = T)

md <-xgb.train(data=dtrain,params = param,nround = 80,watchlist = list(train=dtrain,test=dtest),nthread=6)

最佳答案

看来你误解了xgb.cv,它不是一个参数搜索函数。它只进行 k 次交叉验证,仅此而已。

在您的代码中,它不会更改 param 的值。

为了在 R 的 XGBoost 中找到最佳参数,有一些方法。这是2个方法,

(1) 使用 mlr 包,http://mlr-org.github.io/mlr-tutorial/release/html/

有一个XGBoost + mlr example code在 Kaggle 的 Prudential 挑战中,

但是该代码用于回归,而不是分类。据我所知,mlr 包中还没有 mlogloss 指标,因此您必须自己从头开始编写 mlogloss 测量代码。 CMIIW。

(2)第二种方法,手动设置参数然后重复,例如,

param <- list(objective = "multi:softprob",
eval_metric = "mlogloss",
num_class = 12,
max_depth = 8,
eta = 0.05,
gamma = 0.01,
subsample = 0.9,
colsample_bytree = 0.8,
min_child_weight = 4,
max_delta_step = 1
)
cv.nround = 1000
cv.nfold = 5
mdcv <- xgb.cv(data=dtrain, params = param, nthread=6,
nfold=cv.nfold, nrounds=cv.nround,
verbose = T)

然后,你找到最好(最小)的mlogloss,

min_logloss = min(mdcv[, test.mlogloss.mean])
min_logloss_index = which.min(mdcv[, test.mlogloss.mean])

min_logloss是mlogloss的最小值,而min_logloss_index是索引(round)。

您必须重复上述过程几次,每次都手动更改参数(mlr 会为您重复操作)。直到最后您获得最佳全局最小值 min_logloss

注意:您可以在 100 或 200 次迭代的循环中执行此操作,在每次迭代中随机设置参数值。这样,您必须将最佳的[parameters_list, min_logloss, min_logloss_index]保存在变量或文件中。

注意:最好通过 set.seed() 设置随机种子,以获得可重现结果。不同的随机种子产生不同的结果。因此,您必须将[parameters_list, min_logloss, min_logloss_index, seedsnumber] 保存在变量或文件中。

假设您最终在 3 次迭代/重复中得到 3 个结果:

min_logloss = 2.1457, min_logloss_index = 840
min_logloss = 2.2293, min_logloss_index = 920
min_logloss = 1.9745, min_logloss_index = 780

那么您必须使用第三个参数(它的全局最小值 min_logloss1.9745)。您的最佳索引 (nrounds) 是 780

一旦获得最佳参数,就将其用于训练,

# best_param is global best param with minimum min_logloss
# best_min_logloss_index is the global minimum logloss index
nround = 780
md <- xgb.train(data=dtrain, params=best_param, nrounds=nround, nthread=6)

我认为您在训练中不需要watchlist,因为您已经完成了交叉验证。但如果您仍然想使用watchlist,那也没关系。

更好的是,您可以在 xgb.cv 中使用提前停止。

mdcv <- xgb.cv(data=dtrain, params=param, nthread=6, 
nfold=cv.nfold, nrounds=cv.nround,
verbose = T, early.stop.round=8, maximize=FALSE)

使用此代码,当mlogloss值在8步中没有减少时,xgb.cv将停止。您可以节省时间。您必须将 maximize 设置为 FALSE,因为您期望 mlogloss 最小。

这是一个示例代码,具有 100 次迭代循环和随机选择的参数。

best_param = list()
best_seednumber = 1234
best_logloss = Inf
best_logloss_index = 0

for (iter in 1:100) {
param <- list(objective = "multi:softprob",
eval_metric = "mlogloss",
num_class = 12,
max_depth = sample(6:10, 1),
eta = runif(1, .01, .3),
gamma = runif(1, 0.0, 0.2),
subsample = runif(1, .6, .9),
colsample_bytree = runif(1, .5, .8),
min_child_weight = sample(1:40, 1),
max_delta_step = sample(1:10, 1)
)
cv.nround = 1000
cv.nfold = 5
seed.number = sample.int(10000, 1)[[1]]
set.seed(seed.number)
mdcv <- xgb.cv(data=dtrain, params = param, nthread=6,
nfold=cv.nfold, nrounds=cv.nround,
verbose = T, early.stop.round=8, maximize=FALSE)

min_logloss = min(mdcv[, test.mlogloss.mean])
min_logloss_index = which.min(mdcv[, test.mlogloss.mean])

if (min_logloss < best_logloss) {
best_logloss = min_logloss
best_logloss_index = min_logloss_index
best_seednumber = seed.number
best_param = param
}
}

nround = best_logloss_index
set.seed(best_seednumber)
md <- xgb.train(data=dtrain, params=best_param, nrounds=nround, nthread=6)

使用此代码,您可以运行交叉验证 100 次,每次都使用随机参数。然后你就得到了最好的参数集,即在具有最小 min_logloss 的迭代中。

增加early.stop.round的值,以防您发现它太小(太早停止)。您还需要根据您的数据特征更改随机参数值的限制。

并且,对于 100 或 200 次迭代,我认为您需要将 verbose 更改为 FALSE。

旁注:这是随机方法的示例,您可以调整它,例如通过贝叶斯优化以获得更好的方法。如果您有 XGBoost 的 Python 版本,那么有一个很好的 XGBoost 超参数脚本,https://github.com/mpearmain/BayesBoost使用贝叶斯优化搜索最佳参数集。

编辑:我想添加第三种手动方法,由 Kaggle 大师“Davut Polat”发布,在 Kaggle forum 中.

编辑:如果你了解Python和sklearn,你也可以使用GridSearchCV与 xgboost.XGBClassifier 或 xgboost.XGBRegressor 一起使用

关于r - R : how does xgb. cv 中的 xgboost 将最优参数传递到 xgb.train,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35050846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com