用于训练 LightGBM 模型的低层 R 接口。与 lightgbm 不同,此函数专注于性能(例如速度、内存效率)。与 lightgbm 相比,新版本中发生破坏性 API 更改的可能性也较低。

lgb.train(
  params = list(),
  data,
  nrounds = 100L,
  valids = list(),
  obj = NULL,
  eval = NULL,
  verbose = 1L,
  record = TRUE,
  eval_freq = 1L,
  init_model = NULL,
  early_stopping_rounds = NULL,
  callbacks = list(),
  reset_data = FALSE,
  serializable = TRUE
)

参数

params

一个参数列表。有关参数和有效值的列表,请参阅 文档的“Parameters”部分

data

一个用于训练的 lgb.Dataset 对象。某些函数(例如 lgb.cv)可能允许您传递其他类型的数据(如 matrix),然后单独提供 label 作为关键字参数。

nrounds

训练轮数

valids

一个 lgb.Dataset 对象列表,用于验证

obj

目标函数,可以是字符或自定义目标函数。示例包括 regression, regression_l1, huber, binary, lambdarank, multiclass, multiclass

eval

评估函数。可以是字符向量、函数或包含字符串和函数的混合列表。

  • a. 字符向量: 如果为此参数提供字符向量,它应包含有效的评估指标字符串。有关有效指标列表,请参阅 文档的“metric”部分

  • b. 函数: 您可以提供自定义评估函数。此函数应接受关键字参数 predsdtrain,并应返回一个包含三个元素的命名列表

    • name: 包含指标名称的字符串,用于打印和存储结果。

    • value: 表示给定预测值和真实值对应的指标值的单个数字

    • higher_better: 一个布尔值,指示值越大是否表示拟合效果越好。例如,对于 MAE 或 RMSE 等指标,这将是 FALSE

  • c. 列表: 如果给定列表,它应仅包含字符向量和函数。这些应遵循上述描述中的要求。

verbose

输出的详细程度,如果 <= 0 并且已提供 valids,也将禁用训练期间的评估输出

record

布尔值,TRUE 将把迭代消息记录到 booster$record_evals

eval_freq

评估输出频率,仅在 verbose > 0 且已提供 valids 时有效

init_model

模型文件路径或 lgb.Booster 对象,将从此模型继续训练

early_stopping_rounds

整数。激活提前停止。当此参数非空时,如果在任何验证集上的任何指标评估连续 early_stopping_rounds 次提升轮次都未能改进,训练将停止。如果训练提前停止,返回的模型将具有属性 best_iter,其值设置为最佳迭代的迭代编号。

callbacks

在每次迭代时应用的 callback 函数列表。

reset_data

布尔值,将其设置为 TRUE(非默认值)将把 booster 模型转换为 predictor 模型,从而释放内存和原始数据集

serializable

是否通过 savesaveRDS 等函数使结果对象可序列化(参见“模型序列化”部分)。

返回值

一个训练好的 booster 模型 lgb.Booster

提前停止

“提前停止”是指如果在给定验证集上模型的性能连续几次迭代没有改进,则停止训练过程。

如果为 eval 提供多个参数,它们的顺序将保留。如果在 params 中设置 early_stopping_rounds 启用提前停止,默认情况下所有指标都将用于提前停止。

如果您只想考虑第一个指标进行提前停止,请在 params 中传递 first_metric_only = TRUE。请注意,如果您也在 params 中指定了 metric,该指标将被视为“第一个”指标。如果您省略 metric,将根据您为参数 obj(关键字参数)或 objective(传递到 params 中)的选择使用默认指标。

示例

# \donttest{
data(agaricus.train, package = "lightgbm")
train <- agaricus.train
dtrain <- lgb.Dataset(train$data, label = train$label)
data(agaricus.test, package = "lightgbm")
test <- agaricus.test
dtest <- lgb.Dataset.create.valid(dtrain, test$data, label = test$label)
params <- list(
  objective = "regression"
  , metric = "l2"
  , min_data = 1L
  , learning_rate = 1.0
  , num_threads = 2L
)
valids <- list(test = dtest)
model <- lgb.train(
  params = params
  , data = dtrain
  , nrounds = 5L
  , valids = valids
  , early_stopping_rounds = 3L
)
#> [LightGBM] [Info] Auto-choosing row-wise multi-threading, the overhead of testing was 0.000710 seconds.
#> You can set `force_row_wise=true` to remove the overhead.
#> And if memory is not enough, you can set `force_col_wise=true`.
#> [LightGBM] [Info] Total Bins 232
#> [LightGBM] [Info] Number of data points in the train set: 6513, number of used features: 116
#> [LightGBM] [Info] Start training from score 0.482113
#> [LightGBM] [Warning] No further splits with positive gain, best gain: -inf
#> [1]:  test's l2:6.44165e-17 
#> Will train until there is no improvement in 3 rounds.
#> [LightGBM] [Warning] No further splits with positive gain, best gain: -inf
#> [2]:  test's l2:1.97215e-31 
#> [LightGBM] [Warning] No further splits with positive gain, best gain: -inf
#> [3]:  test's l2:0 
#> [LightGBM] [Warning] No further splits with positive gain, best gain: -inf
#> [LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements
#> [4]:  test's l2:0 
#> [LightGBM] [Warning] No further splits with positive gain, best gain: -inf
#> [LightGBM] [Warning] Stopped training because there are no more leaves that meet the split requirements
#> [5]:  test's l2:0 
#> Did not meet early stopping, best iteration is: [3]:  test's l2:0
# }