LightGBM:train() vs update() vs refit()

Oli*_*fer 7 python machine-learning lightgbm

我正在将LightGBM (Python) 实施到持续学习管道中。我的目标是训练初始模型并使用新的可用数据更新模型(例如每天)。大多数示例加载已经训练好的模型并再次应用 train() :

updated_model = lightgbm.train(params=last_model_params, train_set=new_data, init_model = last_model)
Run Code Online (Sandbox Code Playgroud)

然而,我想知道这实际上是否是在LightGBM库中进行持续学习的正确方法,因为拟合树 ( ) 的数量随着bynum_trees()的每个应用程序而增长。根据我的理解,模型更新应该采用初始模型定义(在给定的一组模型参数下)并对其进行改进,而无需增加模型定义的树数量/大小。train()n_estimators

我发现有关的文档train()并不是特别有帮助。使用 LightGBM 实施持续学习的正确方法是什么?update()refit()

Jam*_*amb 12

lightgbm(LightGBM 的 Python 包)中,您提到的这些入口点确实有不同的用途。

主要lightgbm模型对象是一个Booster. Booster通过对输入数据进行训练来产生拟合。鉴于经过初步训练Booster...

  • Booster.refit()不会改变已训练模型的结构。它只是根据新数据更新叶子计数和叶子值。它不会向模型添加任何树木
  • Booster.update()将在现有的Booster. 它将最多向模型添加 1 棵树。
  • train()init_model执行额外轮次的梯度提升num_iterations。它还允许许多其他功能,例如自定义回调(例如,更改迭代之间的学习率)和提前停止(如果验证集的性能无法提高,则停止添加树)。它将向模型添加树。num_iterations

使用 LightGBM 实施持续学习的正确方法是什么?

这一选择涉及权衡,但这些都不是实现“基于新到达的数据修改现有模型”目标的全球“正确”方法。

Booster.refit()是这些方法中唯一满足您的定义的“在不增加树的数量/模型定义的大小的情况下优化[模型]”的定义。但这可能会导致模型产生的预测发生巨大变化,特别是如果新到达的数据批次比原始训练数据小得多,或者目标的分布非常不同。

Booster.update()是最简单的接口,但单次迭代可能不足以将新到达的数据中的大部分信息获取到模型中。例如,如果您使用相当浅的树(例如num_leaves=7)和非常小的学习率,即使是与原始训练数据非常不同的新到达的数据也可能不会对模型的预测产生太大影响。

train(init_model=previous_model)是最灵活、最强大的选项,但它也引入了更多的参数和选择。如果选择使用train(init_model=previous_model),请注意参数num_iterationslearning_rate。这些参数的较低值将减少新到达的数据对训练模型的影响,较高的值将允许对模型进行更大的更改。在这些之间找到适当的平衡是评估框架的一个关注点。