如何理解R包xgboost

时间:2019-02-07 02:03:01

标签: r cross-validation xgboost

我正在尝试使用R的软件包xgboost。但是我感到有些困惑。在xgboost手册的xgb.cv功能下,它表示:

原始样本被随机分为n个等大小的子样本。

在n个折叠子样本中,保留了一个子样本作为用于测试模型的验证数据, 其余的nfold-1个子样本用作训练数据。

然后,将交叉验证过程重复nround次,每个nfold子样本 完全用作验证数据。

这是手册中的代码:

data(agaricus.train, package='xgboost')
dtrain <- xgb.DMatrix(agaricus.train$data, label = agaricus.train$label)
cv <- xgb.cv(data = dtrain, nrounds = 3, nthread = 2, nfold = 5, metrics = 
list("rmse","auc"),
max_depth = 3, eta = 1, objective = "binary:logistic")
print(cv)
print(cv, verbose=TRUE)

结果是:

##### xgb.cv 5-folds
call:
  xgb.cv(data = dtrain, nrounds = 3, nfold = 5, metrics = list("rmse", 
    "auc"), nthread = 2, max_depth = 3, eta = 1, objective = "binary:logistic")
params (as set within xgb.cv):
  nthread = "2", max_depth = "3", eta = "1", objective = "binary:logistic", 
eval_metric = "rmse", eval_metric = "auc", silent = "1"
callbacks:
  cb.print.evaluation(period = print_every_n, showsd = showsd)
  cb.evaluation.log()
niter: 3
evaluation_log:
 iter train_rmse_mean train_rmse_std train_auc_mean train_auc_std test_rmse_mean test_rmse_std test_auc_mean test_auc_std
1       0.1623756    0.002693092      0.9871108  1.123550e-03      0.1625222   0.009134128     0.9870954 0.0045008818
2       0.0784902    0.002413883      0.9998370  1.317346e-04      0.0791366   0.004566554     0.9997756 0.0003538184
3       0.0464588    0.005172930      0.9998942  7.315846e-05      0.0478028   0.007763252     0.9998902 0.0001347032

假设nfold = 5和nrounds = 2。这意味着数据被分为相等大小的5个部分。该算法将生成2棵树。

我的理解是:每个子样本必须进行一次验证。验证一个子样本时,将生成2棵树。因此,我们将有5套树(一组有2棵树,因为nrounds = 2)。然后,我们检查评估指标是否变化很大。

但是结果却不一样。一个nround值有一行评估指标,看起来它已经包含“交叉验证”部分。因此,如果“交叉验证过程然后重复nrounds次”,那么“ n个折叠子样本中的每一个仅被用作验证数据一次”又如何呢?有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:2)

这些是 nfold 拟合测试程序的得分的平均值标准偏差,每轮。 XGBoost交叉验证过程如下所示:

  1. 数据集X分为 nfold 个子样本,X 1 ,X 2 ... X nfold
  2. XGBoost算法将增强树适合包含X 1 ,X 2 ,...,X nfold-1 的训练数据集,而最后一个子样本(折叠)X nfold 被保留为验证 1 (样本外)数据集。为训练和验证数据集计算选定的评估指标(RMSE,AUC等)并保留。
  3. 现在训练数据集中的一个子样本(折叠)与验证子样本(折叠)交换,因此训练数据集现在包括X 1 ,X 2 ,。 ..,X nfold-2 ,X nfold 和验证(样本外)数据集为X nfold-1 。再次,该算法将增强树适合训练数据,计算评估得分(针对每个所选指标),依此类推。
  4. 此过程重复 nfold 次,直到每个子样本(折叠)都同时作为训练集的一部分。
  5. 现在,添加另一棵增强树,并重复步骤2-4中概述的过程。这一直持续到适合训练数据的增强树总数​​等于 rounds
  6. 现在,训练集和验证集的每个回合 nround 中都有 nfold 个计算的评估得分(选择的不同度量标准的次数)。验证集自然会变得更糟)。在 rounds 中为每个回合的训练集和验证集(乘以所选择的不同度量的数量),计算 nfold 分数的平均值和标准偏差,并在具有左右行的数据框。

1 请注意,XGBoost将我称为“验证”集的内容标识为评估日志中的“测试”集