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



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

updated_model = lightgbm.train(params=last_model_params, train_set=new_data, init_model = last_model)

然而,我想知道这是否真的是在LightGBM库中进行连续学习的正确方法,因为n_estimators每次应用train()时,拟合树(num_trees()(的数量都会增加。据我所知,模型更新应该采用初始的模型定义(在给定的模型参数集下(,并在不增加树数量/模型定义大小的情况下对其进行细化。

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

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

lightgbm模型对象是一个Booster。通过对输入数据进行训练来产生拟合的CCD_ 10。给定一个初始训练的Booster。。。

  • Booster.refit()不会改变已经训练好的模型的结构。它只是根据新数据更新叶数和叶值它不会向模型中添加任何树
  • CCD_ 13将在现有的CCD_它最多会为模型添加1棵树
  • 具有CCD_ 16的CCD_ 15将对CCD_。它还允许许多其他功能,如自定义回调(例如,从一次迭代到另一次迭代更改学习率(和提前停止(如果验证集的性能无法提高,则停止添加树(它将向模型添加多达num_iterations

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

这一选择涉及权衡,其中没有一个是全局的";右";实现目标的方式;基于新到达的数据修改现有模型";。

CCD_ 19是这些方法中唯一符合您对"的定义的方法;在不增加树的数量/模型定义的大小的情况下改进[模型]">。但这可能会导致模型产生的预测发生剧烈变化,特别是如果新到达的一批数据比原始训练数据小得多,或者目标的分布非常不同。

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

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

最新更新