lightgbm.LightGBMClassifier调参总结Parameters Tuning


本节将主要总结lightGBM在不同场景下的参数调优指南

概述

LightGBM 是一个流行的梯度提升框架,它使用的是叶子优先(leaf-wise)的树增长算法,而许多其他流行的工具使用的是深度优先(depth-wise)的树增长算法。与深度优先增长相比,叶子优先算法可以更快地收敛。然而,如果不配合适当的参数使用,叶子优先增长可能会导致过拟合。

要使用叶子优先树获得好的结果

以下是一些重要的参数:
num_leaves(叶子数量):这是控制树模型复杂度的主要参数。理论上,我们可以设置 num_leaves = 2^(max_depth) 来获取与深度优先树相同数量的叶子。然而,这种简单的转换在实践中并不理想。原因在于,对于固定数量的叶子,叶子优先树通常比深度优先树要深得多。不受约束的深度会诱发过拟合。因此,在调整 num_leaves 时,我们应该让它小于 2^(max_depth)。例如,当 max_depth=7 时,深度优先树可以获得良好的准确率,但将 num_leaves 设置为127可能会导致过拟合,而设置为70或80可能比深度优先树获得更好的准确率。

min_data_in_leaf(叶子节点的最小数据量): 这是防止叶子优先树过拟合的非常重要的参数。其最佳值取决于训练样本的数量和 num_leaves 的值。将其设置为较大的值可以避免树生长过深,但可能会导致欠拟合。在实践中,对于大数据集,将其设置为几百或几千就足够了。

max_depth(最大深度): 您还可以使用 max_depth 来显式限制树的深度。虽然叶子优先的策略主要通过控制叶子的数量来控制模型的复杂度,但设置最大深度是另一种简单直接的方法来防止模型过于复杂,从而避免过拟合。
为了提高速度,LightGBM提供了一些方法来利用更多的计算资源,从而加快模型的训练过程:

如何获得更快的计算速度·

增加计算资源
  • LightGBM利用OpenMP来并行化多个操作。通过num_threads参数可以控制LightGBM使用的最大线程数。默认情况下,LightGBM会遵循OpenMP的默认行为——使用与实际CPU核心数相同的线程数,或者如果设置了环境变量OMP_NUM_THREADS,则使用该变量的值。为了获得最佳性能,应该将此参数设置为可用的实际CPU核心数。

  • 移动到一个拥有更多可用CPU核心的机器上,可能能够实现更快的训练速度。因为LightGBM能够有效地利用额外的计算资源来加速训练过程,尤其是在处理大型数据集时。

使用分布式(多机)训练
  • 使用分布式训练,即在多台机器上进行模型训练,也可以减少训练时间。分布式训练允许模型训练任务在多台机器上分布执行,通过并行处理来加速训练过程。

  • LightGBM支持分布式训练,并提供了详细的分布式学习指南。这个指南详细介绍了如何配置和启动分布式训练,包括设置网络通信、准备数据以及启动训练任务等。

使用支持 GPU 的 LightGBM 版本

你可能会发现,使用支持 GPU 的 LightGBM 构建版本进行训练速度更快。详见 GPU 教程。

培养较浅的树

LightGBM 的总训练时间随着添加的树节点总数的增加而增加。LightGBM 提供了几个参数,可以用来控制每棵树的节点数。

以下建议将加快训练速度,但可能会影响训练精度。

  • 减少 max_depth:此参数是一个整数,控制从每棵树的根节点到叶节点的最大距离。减少 max_depth 可以减少训练时间。
  • 减少 num_leaves:LightGBM 根据添加节点的增益来添加节点,而不考虑深度。因此,仅使用 max_depth 不能直接限制树的复杂性。num_leaves 参数设置每棵树的最大节点数。减少 num_leaves 可以减少训练时间。
  • 增加 min_gain_to_split:在添加新的树节点时,LightGBM 选择增益最大的分割点。增益基本上是从添加分割点导致的训练损失减少。默认情况下,LightGBM 将 min_gain_to_split 设置为 0.0,意味着“没有太小的改进”。然而,实际上你可能会发现,训练损失的非常小的改进对模型的泛化错误没有实质性影响。增加 min_gain_to_split 可以减少训练时间。
增加 min_data_in_leafmin_sum_hessian_in_leaf

根据训练数据的大小和特征分布,LightGBM 可能会添加只描述少量观测值的树节点。在极端情况下,考虑只有一个观测值落入的树节点的添加。这很可能无法很好地泛化,并且可能是过拟合的标志。

可以通过像 max_depthnum_leaves 这样的参数间接防止这种情况,但 LightGBM 也提供了参数,帮助你直接避免添加这些过于具体的树节点。

  • min_data_in_leaf:必须落入树节点才能被添加的最小观测数。
  • min_sum_hessian_in_leaf:落入叶子的观测的 Hessian(目标函数对每个观测求二阶导数)的最小和。对于一些回归目标,这只是必须落入每个节点的最小记录数。对于分类目标,它代表概率分布的总和。
训练较少的树
  • 减少 num_iterations:此参数控制将执行的提升轮数。由

于 LightGBM 使用决策树作为学习器,这也可以被认为是“树的数量”。

如果尝试更改 num_iterations,同时更改 learning_ratelearning_rate 不会影响训练时间,但会影响训练精度。一般规则是,如果减少 num_iterations,应该增加 learning_rate

使用早停参数earlyStoppingRound

如果启用了早停,在每轮提升后都会对模型的训练精度进行评估,与未参与训练过程的验证集进行比较。然后将该精度与前一轮提升的精度进行比较。如果模型的精度在一些连续轮次没有改善,LightGBM 会停止训练过程。

考虑更少的分裂
  • 启用在创建数据集时的特征预过滤:默认情况下,构建 LightGBM Dataset 对象时,一些特征会根据 min_data_in_leaf 的值被过滤掉。
  • 减少创建数据集时的 max_binmax_bin_by_feature:LightGBM 训练中通过将连续特征分桶为离散的箱来提高训练速度并减少训练内存要求。减少每个特征的箱数可以减少需要评估的分割数。
  • 增加创建数据集时的 min_data_in_bin:一些箱可能包含少量观测值,可能意味着评估该箱边界作为可能的分割点不太可能对最终模型产生很大改变。通过设置 min_data_in_bin 可以控制箱的粒度。
  • 减少 feature_fraction:默认情况下,LightGBM 在训练过程中考虑数据集中的所有特征。通过设置 feature_fraction 为大于 0 且小于或等于 1.0 的值可以改变这种行为。例如,设置 feature_fraction 为 0.5,告诉 LightGBM 在构建每棵树的开始随机选择 50% 的特征。这减少了添加每个树节点需要评估的总分割数。
  • 减少 max_cat_threshold:LightGBM 对于寻找最佳分裂的分类特征使用自定义方法。在此过程中,LightGBM 探索将分类特征分成两组的分割。更高的 max_cat_threshold 值对应于更多的分割点和需要搜索的更大可能组大小。
使用更少的数据baggingFraction
  • 使用装袋(Bagging):默认情况下,LightGBM 在每次迭代中使用训练数据的所有观测值。通过告诉 LightGBM 随机采样训练数据,可以代替使用所有观测值。这种在多个随机样本上进行无放回训练的过程称为“装袋”。
使用 save_binary 保存构建的数据集

这只适用于 LightGBM CLI。如果传递了 save_binary 参数,训练数据集和所有验证集将以 LightGBM 理解的二进制格式保存。这可以加速下次训练,因为在构建数据集时完成的分桶和其他工作不必重新完成。

如何提升精准度?

  • 使用大的 max_bin(可能会慢)
  • 使用小的 learning_rate 和大的 num_iterations
  • 使用大的 num_leaves(可能导致过拟合)
  • 使用更大的训练数据
  • 尝试 dart

如何减少过拟合?

  • 使用小的 max_bin
  • 使用小的 num_leaves
  • 使用 min_data_in_leafmin_sum_hessian_in_leaf
  • 通过设置 bagging_fractionbagging_freq 使用装袋
  • 通过设置 feature_fraction 使用特征子采样
  • 使用更大的训练数据
  • 尝试使用 lambda_l1lambda_l2min_gain_to_split 进行正则化
  • 尝试使用 max_depth 避免深树生长
  • 尝试 extra_trees
  • 尝试增加 path_smooth

综上所述

  • 正确调参对于使用叶子优先树模型尤其重要。通过精细调整这些参数,可以在加快模型训练速度的同时,防止过拟合,从而获得更好的模型性能。
  • 通过增加计算资源和采用分布式训练策略,可以显著加速LightGBM的模型训练。这些方法特别适用于大规模数据集和复杂模型的场景,可以帮助用户在保证模型性能的同时,缩短模型训练时间。
  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lightgbm是一种强大的机器学习算法,参数调整对于其性能的优化至关重要。下面是一些常见的lightgbm参数调整的方法: 1. 学习率(learning rate):学习率控制每一步迭代中算法对问题的贡献。较小的学习率可以帮助算法更好地适应数据,但也会增加训练时间。如果您的模型欠拟合,可以尝试增加学习率,反之则减小学习率。 2. 树的数量(num_iterations):树的数量决定了模型的复杂度,太少的树可能导致欠拟合,而太多的树可能导致过拟合。您可以通过验证集上的性能来选择最佳的树的数量。 3. 树的深度(max_depth):树的深度控制模型的复杂度,太深的树可能导致过拟合。因此,您可以通过限制树的深度来避免过拟合。 4. 正则化参数(lambda和alpha):正则化参数用于控制模型的复杂度。lambda是L2正则化参数,用于控制模型权重的平方和的大小;alpha是L1正则化参数,用于控制模型权重的绝对值的大小。适当调整正则化参数可以帮助防止过拟合。 5. 特征子采样比例(feature_fraction):特征子采样比例是指在每一次迭代中使用的特征的比例。通过减少特征子集的大小,可以减少过拟合的风险。 6. 数据子采样比例(bagging_fraction):数据子采样比例是指在每一次迭代中使用的数据的比例。通过减少数据子集的大小,可以减少过拟合的风险。 请记住,这些只是一些常见的参数调整方法,实际上,您可能需要尝试不同的参数组合来找到最佳的模型性能。您可以使用交叉验证来评估不同参数组合的性能,并选择表现最好的参数设置。 参考资料: 引用:https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html 引用:https://machinelearningmastery.com/gentle-introduction-lightgbm-library-python/ 引用[3]:https://www.analyticsvidhya.com/blog/2017/06/which-algorithm-takes-the-crown-light-gbm-vs-xgboost/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值