我正在将https://lightgbm.readthedocs.io/en/latest/index.html (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?实现持续学习的正确方法是什么?
发布于 2022-09-10 03:25:40
在lightgbm (用于LightGBM的package )中,您提到的这些入口点确实有不同的用途。
主要的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_iterations和learning_rate。这些参数的较低值将减少新到达的数据对经过训练的模型的影响,较高的值将允许对模型进行较大的更改。在这两者之间找到适当的平衡是你的评估框架的一个问题。
https://stackoverflow.com/questions/73664093
复制相似问题