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.QuantileDMatrix或xgb.ExtMemDMatrix等变体。- nrounds
最大提升迭代次数。
- nfold
原始数据集被随机划分为
nfold个大小相等的子样本。- prediction
一个逻辑值,指示是否返回每个交叉验证模型中的测试折叠预测。此参数启用
xgb.cb.cv.predict()回调。- showsd
一个逻辑值,指示是否显示交叉验证的标准差。
- metrics
交叉验证中使用的评估指标列表,未指定时,评估指标根据目标函数选择。可能的选项有:
error:二元分类错误率rmse:均方根误差logloss:负对数似然函数mae:平均绝对误差mape:平均绝对百分比误差auc:曲线下面积aucpr:PR 曲线下面积merror:用于评估多类分类的精确匹配错误
- objective
自定义目标函数。应接受两个参数:第一个参数是当前预测(可以是数值向量或矩阵,具体取决于目标/类别的数量),第二个参数是用于训练的
dataDMatrix 对象。它应返回一个包含两个元素
grad和hess(按此顺序)的列表,作为数值向量或数值矩阵,具体取决于目标/类别的数量(与作为第一个参数传入的预测具有相同的维度)。- custom_metric
自定义评估函数。与
objective类似,应接受两个参数,第一个参数是预测,第二个参数是dataDMatrix。它应返回一个包含两个元素
metric(将显示为此指标的名称,应为字符串/字符)和value(函数计算的数值,应为数值标量)的列表。请注意,即使传入
custom_metric,目标也有一个关联的默认指标,除自定义指标外也会被评估。为了禁用内置指标,可以传入参数disable_default_eval_metric = TRUE。- stratified
逻辑标志,指示折叠采样是否应按结果标签的值进行分层。对于回归目标中的实值标签,分层将通过预先将标签离散化为最多 5 个桶来完成。
如果传入“auto”,如果
params中的目标是分类目标(来自 XGBoost 的内置目标,不适用于自定义目标),则设置为TRUE,否则设置为FALSE。当
data具有group字段时,此参数将被忽略 - 在这种情况下,拆分将基于整个组(请注意,这可能会使折叠具有不同的大小)。此处的
TRUE值不支持自定义目标。- folds
包含预定义交叉验证折叠的列表(每个元素必须是测试折叠索引的向量)。当提供折叠时,
nfold和stratified参数将被忽略。如果
data具有group字段且目标需要此字段,则每个折叠(列表元素)必须额外具有两个属性(可通过attributes检索),名为group_test和group_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
如果设置了
feval和early_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)