跳到内容

xgboost 的交叉验证函数。

用法

xgb.cv(
  params = xgb.params(),
  data,
  nrounds,
  nfold,
  prediction = FALSE,
  showsd = TRUE,
  metrics = list(),
  objective = NULL,
  custom_metric = NULL,
  stratified = "auto",
  folds = NULL,
  train_folds = NULL,
  verbose = TRUE,
  print_every_n = 1L,
  early_stopping_rounds = NULL,
  maximize = NULL,
  callbacks = list(),
  ...
)

参数

params

XGBoost 参数列表,用于控制模型构建过程。详情请参阅在线文档xgb.params() 的文档。

应作为包含命名条目的列表传入。未在此列表中指定的参数将使用其默认值。

可以通过函数 xgb.params() 创建一个命名参数列表,该函数接受所有有效参数作为函数参数。

数据

一个 xgb.DMatrix 对象,带有相应的字段,例如 label 或模型训练所需的目标边界。

请注意,仅支持基本的 xgb.DMatrix 类 - 不支持 xgb.QuantileDMatrixxgb.ExtMemDMatrix 等变体。

nrounds

最大提升迭代次数。

nfold

原始数据集被随机划分为 nfold 个大小相等的子样本。

prediction

一个逻辑值,指示是否返回每个交叉验证模型中的测试折叠预测。此参数启用 xgb.cb.cv.predict() 回调。

showsd

一个逻辑值,指示是否显示交叉验证的标准差。

metrics

交叉验证中使用的评估指标列表,未指定时,评估指标根据目标函数选择。可能的选项有:

  • error:二元分类错误率

  • rmse:均方根误差

  • logloss:负对数似然函数

  • mae:平均绝对误差

  • mape:平均绝对百分比误差

  • auc:曲线下面积

  • aucpr:PR 曲线下面积

  • merror:用于评估多类分类的精确匹配错误

objective

自定义目标函数。应接受两个参数:第一个参数是当前预测(可以是数值向量或矩阵,具体取决于目标/类别的数量),第二个参数是用于训练的 data DMatrix 对象。

它应返回一个包含两个元素 gradhess(按此顺序)的列表,作为数值向量或数值矩阵,具体取决于目标/类别的数量(与作为第一个参数传入的预测具有相同的维度)。

custom_metric

自定义评估函数。与 objective 类似,应接受两个参数,第一个参数是预测,第二个参数是 data DMatrix。

它应返回一个包含两个元素 metric(将显示为此指标的名称,应为字符串/字符)和 value(函数计算的数值,应为数值标量)的列表。

请注意,即使传入 custom_metric,目标也有一个关联的默认指标,除自定义指标外也会被评估。为了禁用内置指标,可以传入参数 disable_default_eval_metric = TRUE

stratified

逻辑标志,指示折叠采样是否应按结果标签的值进行分层。对于回归目标中的实值标签,分层将通过预先将标签离散化为最多 5 个桶来完成。

如果传入“auto”,如果 params 中的目标是分类目标(来自 XGBoost 的内置目标,不适用于自定义目标),则设置为 TRUE,否则设置为 FALSE

data 具有 group 字段时,此参数将被忽略 - 在这种情况下,拆分将基于整个组(请注意,这可能会使折叠具有不同的大小)。

此处的 TRUE支持自定义目标。

folds

包含预定义交叉验证折叠的列表(每个元素必须是测试折叠索引的向量)。当提供折叠时,nfoldstratified 参数将被忽略。

如果 data 具有 group 字段且目标需要此字段,则每个折叠(列表元素)必须额外具有两个属性(可通过 attributes 检索),名为 group_testgroup_train,它们应保存通过 setinfo.xgb.DMatrix() 分配给生成的 DMatrices 的 group

train_folds

指定用于训练的索引的列表。如果为 NULL(默认值),则 folds 中未指定的所有索引将用于训练。

data 具有 group 字段时,不支持此功能。

verbose

如果为 0,xgboost 将保持静默。如果为 1,它将打印有关性能的信息。如果为 2,将打印一些额外信息。请注意,设置 verbose > 0 会自动启用 xgb.cb.print.evaluation(period=1) 回调函数。

print_every_n

当传入 verbose>0 时,评估日志(在 evals 下传入的数据上计算的指标)将根据此处传入的值每 n 次迭代打印一次。第一次和最后一次迭代总是被包含,无论此“n”的值如何。

仅在 evals 下传入数据且 verbose>0 时才有效。该参数传递给 xgb.cb.print.evaluation() 回调。

early_stopping_rounds

如果评估数据(在 evals 下传入)上的性能(由提供的或目标默认选择的评估指标衡量)没有改善,训练将在经过此数量的提升轮次后停止。

必须传入 evals 才能使用此功能。设置此参数会添加 xgb.cb.early.stop() 回调。

如果为NULL,则不使用提前停止。

maximize

如果设置了 fevalearly_stopping_rounds,则此参数也必须设置。当它为 TRUE 时,表示评估分数越大越好。此参数传递给 xgb.cb.early.stop() 回调。

callbacks

回调函数列表,用于在提升过程中执行各种任务。参见 xgb.Callback()。一些回调会根据参数值自动创建。用户可以提供现有或自己的回调方法来定制训练过程。

...

未使用。

在以前的 XGBoost 版本中,此函数的一些参数已被弃用或重命名。如果传递已弃用或重命名的参数,将(默认)抛出警告并改用其当前等效项。如果使用 '严格模式'选项,此警告将变为错误。

如果传递了既不是当前函数参数也不是已弃用或重命名参数的附加参数,则根据“严格模式”选项,将抛出警告或错误。

重要: ... 将在未来版本中删除,所有当前的弃用警告将变为错误。请仅使用构成函数签名的参数。

一个“xgb.cv.synchronous”类的对象,包含以下元素:

  • call:函数调用。

  • params:传递给 xgboost 库的参数。请注意,它不捕获 xgb.cb.reset.parameters() 回调更改的参数。

  • evaluation_log:存储为 data.table 的评估历史,第一列对应迭代次数,其余列对应训练和测试交叉验证集基于交叉验证的评估均值和标准差。它由 xgb.cb.evaluation.log() 回调创建。

  • niter:提升迭代次数。

  • nfeatures:训练数据中的特征数量。

  • folds:交叉验证折叠索引列表 - 无论是通过 folds 参数传入的还是随机生成的。

以及其他潜在的由回调产生的元素,例如当传入 prediction = TRUE 时,包含子元素 pred 的列表 cv_predict,该列表由 xgb.cb.cv.predict() 回调添加(请注意,也可以在 callbacks 下手动传入不同的设置,例如保存交叉验证期间创建的模型);或列表 early_stop,当使用提前停止回调(xgb.cb.early.stop())时,它将包含诸如 best_iteration 等元素。

详细信息

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

nfold 个子样本中,保留一个子样本作为验证数据以测试模型,其余 nfold - 1 个子样本用作训练数据。

然后交叉验证过程重复 nrounds 次,每个 nfold 个子样本都恰好用作验证数据一次。

所有观测值都用于训练和验证。

改编自 https://en.wikipedia.org/wiki/Cross-validation_%28statistics%29

示例

data(agaricus.train, package = "xgboost")

dtrain <- with(agaricus.train, xgb.DMatrix(data, label = label, nthread = 2))

cv <- xgb.cv(
  data = dtrain,
  nrounds = 20,
  early_stopping_rounds = 1,
  params = xgb.params(
    nthread = 2,
    max_depth = 3,
    objective = "binary:logistic"
  ),
  nfold = 5,
  metrics = list("rmse","auc"),
  prediction = TRUE
)
print(cv)
print(cv, verbose = TRUE)

# Callbacks might add additional attributes, separated by the name of the callback
cv$early_stop$best_iteration
head(cv$cv_predict$pred)