当使用包xgboost和r中的函数xgb.cv
时,我有一个问题与模型的交叉验证、调整、训练和预测有关。
特别是,我重新使用并改编了来自互联网的代码,以便在分类问题中使用xgb.cv
在参数空间(调整(中搜索最佳参数。
在这里,您可以找到用于执行此任务的代码:
# *****************************
# ******* TUNING ************
# *****************************
start_time <- Sys.time()
best_param <- list()
best_seednumber <- 1234
best_acc <- 0
best_acc_index <- 0
set.seed(1234)
# In reality, might need 100 or 200 iters
for (iter in 1:200) {
param <- list(objective = "binary:logistic",
eval_metric = c("error"), # rmse is used for regression
max_depth = sample(6:10, 1),
eta = runif(1, .01, .1), # Learning rate, default: 0.3
subsample = runif(1, .6, .9),
colsample_bytree = runif(1, .5, .8),
min_child_weight = sample(5:10, 1), # These two are important
max_delta_step = sample(5:10, 1) # Can help to focus error
# into a small range.
)
cv.nround <- 1000
cv.nfold <- 10 # 10-fold cross-validation
seed.number <- sample.int(10000, 1) # set seed for the cv
set.seed(seed.number)
mdcv <- xgb.cv(data = dtrain, params = param,
nfold = cv.nfold, nrounds = cv.nround,
verbose = F, early_stopping_rounds = 20, maximize = FALSE,
stratified = T)
max_acc_index <- mdcv$best_iteration
max_acc <- 1 - mdcv$evaluation_log[mdcv$best_iteration]$test_error_mean
print(i)
print(max_acc)
print(mdcv$evaluation_log[mdcv$best_iteration])
if (max_acc > best_acc) {
best_acc <- max_acc
best_acc_index <- max_acc_index
best_seednumber <- seed.number
best_param <- param
}
}
end_time <- Sys.time()
print(end_time - start_time) # Duration -> 1.54796 hours
大约1.5个小时后,此代码将在交叉验证设置中为我返回性能最佳的参数。我还能够重现在循环中获得的精度和最佳参数。
# Reproduce what found in loop
set.seed(best_seednumber)
best_model_cv <- xgb.cv(data=dtrain, params=best_param, nfold=cv.nfold, nrounds=cv.nround,
verbose = T, early_stopping_rounds = 20, maximize = F, stratified = T,
prediction=TRUE)
print(best_model_cv)
best_model_cv$params
现在,我想使用这个"最佳参数"来使用xgboost
或xgb.train
训练我的完整训练集,并对测试数据集进行预测。
best_model <- xgboost(params = best_param, data=dtrain,
seed=best_seednumber, nrounds=10)
在这一点上,我不确定用于训练的代码是否正确,以及我应该在xgboost
中使用哪些参数。问题是,当我运行此训练并在测试数据集中进行预测时,我的分类器基本上将几乎所有新实例分类在一个类中(这是不可能的,因为我还使用了其他模型,这些模型原则上给出了准确的分类率(。
综上所述,我的问题是:
如何在xgboost包的训练函数中使用从交叉验证阶段获得的训练参数?
由于我在这个领域还是个新手,你能确认我应该像预处理训练数据集一样预处理测试数据集(转换、功能工程等等(吗?
我知道我的代码是不可复制的,但我对函数的使用更感兴趣,所以我想在现阶段这并不重要。
谢谢。
最后,是我的测试数据集定义中的一个错误产生了问题。我定义训练模型参数的方式没有错。