用于定义可在模型训练的不同阶段(训练前/后、每次提升迭代前/后)执行的回调函数结构的构造函数。
用法
xgb.Callback(
cb_name = "custom_callback",
env = new.env(),
f_before_training = function(env, model, data, evals, begin_iteration, end_iteration)
NULL,
f_before_iter = function(env, model, data, evals, iteration) NULL,
f_after_iter = function(env, model, data, evals, iteration, iter_feval) NULL,
f_after_training = function(env, model, data, evals, iteration, final_feval,
prev_cb_res) NULL
)参数
- cb_name
回调的名称。
如果回调产生非 NULL 结果(通过执行在
f_after_training下传入的函数),该结果将作为 R 属性添加到生成的助推器(或作为 CV 结果中的命名元素),其属性名称在此处指定。回调名称必须是唯一的——即不能有两个名称相同的回调。
- env
一个将传递给回调中不同函数的环境对象。请注意,此环境不会与其他回调共享。
- f_before_training
一个将在训练开始前执行的函数。
如果为此或其他函数输入传入
NULL,则不会执行任何函数。如果传入一个函数,它将使用非命名参数调用,这些参数与每个函数参数的默认值中显示的函数签名匹配。
- f_before_iter
一个将在每次提升轮次前执行的函数。
此函数可以通过输出一个评估为
TRUE的值来指示训练是否应该结束——即,如果在给定轮次中此处提供的函数的输出为TRUE,则训练将在当前迭代发生之前停止。NULL的返回值将被解释为FALSE。- f_after_iter
一个将在每次提升轮次后执行的函数。
此函数可以通过输出一个评估为
TRUE的值来指示训练是否应该结束——即,如果在给定轮次中此处提供的函数的输出为TRUE,则训练将在该轮次停止。NULL的返回值将被解释为FALSE。- f_after_training
一个将在训练结束后执行的函数。
此函数可以选择性地输出非 NULL 的内容,该内容将成为助推器 R 属性的一部分(假设将
keep_extra_attributes=TRUE传递给xgb.train()),在xgb.train()的情况下,其名称由参数cb_name提供;或者成为xgb.cv()结果中命名元素的一部分。
值
一个 xgb.Callback 对象,可以传递给 xgb.train() 或 xgb.cv()。
详细信息
将传递给所提供函数的参数如下:
env 作为参数
env传入的相同环境。它可能被函数修改,例如,用于跟踪迭代期间发生的情况或类似情况。
此环境仅由提供给回调的函数使用,并且在模型拟合函数终止后不会保留(参见参数
f_after_training)。model 使用
xgb.train()时的助推器对象,或使用xgb.cv()时的折叠。对于
xgb.cv(),折叠是具有以下结构的一个列表:dtrain: 该折叠的训练数据(作为xgb.DMatrix对象)。bst: 该折叠的xgb.Booster对象。evals: 一个包含两个 DMatrix 的列表,名称分别为train和test(test是该折叠的保留数据)。index: 该折叠的保留数据的索引(从 1 开始索引),evals中的test条目由此获得。
此对象不应以与训练冲突的方式进行原地修改(例如,以将轮数重置为零的方式重置训练更新的参数以覆盖轮数)。
请注意,在回调函数期间分配给助推器的任何 R 属性,此后将不会保留,因为助推器对象变量在训练期间不会重新分配。但是,可以通过
xgb.attr()或xgb.attributes()设置助推器的 C 级属性,这些属性应在剩余的迭代和训练完成后仍然可用。为了跨迭代保留变量,建议使用
env。data 正在拟合模型的作为
xgb.DMatrix对象的数据。请注意,对于
xgb.cv(),这将是完整数据,而特定折叠的数据可以在model对象中找到。evals 评估数据,作为参数
evals传递给xgb.train()。对于
xgb.cv(),这将始终为NULL。begin_iteration 将要执行的第一个提升迭代的索引(从 1 开始索引)。
这通常是“1”,但当使用训练继续时,根据更新的参数,提升轮次将从前一个模型结束的位置继续,在这种情况下,这将大于 1。
end_iteration 将要执行的最后一个提升迭代的索引(从 1 开始索引,包括此结束)。
它应与传递给
xgb.train()或xgb.cv()的参数nrounds匹配。请注意,提升可能会在此最后一次迭代之前中断,例如通过使用提前停止回调
xgb.cb.early.stop()。iteration 正在执行的迭代编号的索引(第一次迭代将与参数
begin_iteration相同,然后下一次将加 1,依此类推)。iter_feval 为所提供的
evals计算的评估指标,由目标或参数custom_metric确定。对于
xgb.train(),这将是一个命名向量,其中evals中的每个元素对应一个条目,名称由“evals name” + “-” + “metric name”确定——例如,如果evals包含名为“tr”的条目且指标为“rmse”,这将是一个名为“tr-rmse”的单元素向量。对于
xgb.cv(),这将是一个二维矩阵,维度为[length(evals), nfolds],其中行名将遵循与xgb.train()中传入的一维向量相同的命名逻辑。请注意,在内部,内置回调(例如 xgb.cb.print.evaluation)通过计算行均值和标准差来汇总此表。
final_feval 最后一次提升轮次执行后的评估结果(格式与
iter_feval相同,并将是模型拟合期间执行的最后一轮中作为iter_feval传入的完全相同的输入)。prev_cb_res 在进行训练继续时,如果助推器 R 属性中有任何相同名称(由参数
cb_name给出)的回调的先前运行结果。有时,可能希望将新结果附加到以前的结果,内置回调(例如 xgb.cb.evaluation.log)将自动完成此操作,它将新行附加到以前的表中。
如果没有此类先前的回调结果可用(在从头开始拟合模型而不是更新现有模型时永远不会有),这将为
NULL。对于不支持训练继续的
xgb.cv(),这将始终为NULL。
以下名称(cb_name 值)保留用于内部回调:
print_evaluation
evaluation_log
reset_parameters
early_stop
save_model
cv_predict
gblinear_history
以下名称保留用于其他非回调属性:
names
class
call
params
niter
nfeatures
folds
当使用内置的提前停止回调 (xgb.cb.early.stop) 时,该回调将始终在其他回调之前执行,因为它设置了一些其他回调可能也会使用的助推器 C 级属性。否则,执行顺序将与回调传递给模型拟合函数的顺序匹配。
示例
# Example constructing a custom callback that calculates
# squared error on the training data (no separate test set),
# and outputs the per-iteration results.
ssq_callback <- xgb.Callback(
cb_name = "ssq",
f_before_training = function(env, model, data, evals,
begin_iteration, end_iteration) {
# A vector to keep track of a number at each iteration
env$logs <- rep(NA_real_, end_iteration - begin_iteration + 1)
},
f_after_iter = function(env, model, data, evals, iteration, iter_feval) {
# This calculates the sum of squared errors on the training data.
# Note that this can be better done by passing an 'evals' entry,
# but this demonstrates a way in which callbacks can be structured.
pred <- predict(model, data)
err <- pred - getinfo(data, "label")
sq_err <- sum(err^2)
env$logs[iteration] <- sq_err
cat(
sprintf(
"Squared error at iteration %d: %.2f\n",
iteration, sq_err
)
)
# A return value of 'TRUE' here would signal to finalize the training
return(FALSE)
},
f_after_training = function(env, model, data, evals, iteration,
final_feval, prev_cb_res) {
return(env$logs)
}
)
data(mtcars)
y <- mtcars$mpg
x <- as.matrix(mtcars[, -1])
dm <- xgb.DMatrix(x, label = y, nthread = 1)
model <- xgb.train(
data = dm,
params = xgb.params(objective = "reg:squarederror", nthread = 1),
nrounds = 5,
callbacks = list(ssq_callback)
)
# Result from 'f_after_iter' will be available as an attribute
attributes(model)$ssq