LightGBM的参数详解以及如何调优(上)

简介: LightGBM的参数详解以及如何调优

lightGBM可以用来解决大多数表格数据问题的算法。有很多很棒的功能,并且在kaggle这种该数据比赛中会经常使用。

640.png

但我一直对了解哪些参数对性能的影响最大以及我应该如何调优lightGBM参数以最大限度地利用它很感兴趣。

我想我应该做一些研究,了解更多关于lightGBM的参数…并分享我的旅程。

我希望读完这篇文章后,你能回答以下问题:

  • LightGBM中实现了哪些梯度增强方法,它们有什么区别?
  • 一般来说,哪些参数是重要的?
  • 哪些正则化参数需要调整?
  • 如何调整lightGBM参数在python?

梯度提升的方法

使用LightGBM,你可以运行不同类型的渐变增强提升方法。你有:GBDT、DART和GOSS,这些可以通过“boosting”参数指定。

在下一节中,我将对这些方法进行解释和比较。

梯度提升决策树(GBDT)

该方法是本文首先提出的传统梯度提升决策树,也是XGBoost和pGBRT等优秀库背后的算法。

由于其精度高、效率高、稳定性好,目前已得到广泛的应用。你可能知道gbdt是一个决策树的集合模型但是它到底是什么意思呢?

让我来告诉你要点。

它基于三个重要原则:

  • 弱学习者(决策树)
  • 梯度优化
  • 提升技术

所以在gbdt方法中,我们有很多决策树(弱学习者)。这些树是按顺序构建的:

  • 首先,树学习如何适应目标变量
  • 第二棵树学习如何适合残差(差异)之间的预测,第一棵树和地面真相
  • 第三棵树学习如何匹配第二棵树的残差,以此类推。

所有这些树都是通过传播整个系统的误差梯度来训练的。

gbdt的主要缺点是,在每个树节点中找到最佳分割点非常耗时,而且会消耗内存。其他的提升方法试图解决这个问题。

DART 梯度提升

在这篇优秀的论文中(arxiv/1505.01866),你可以学习所有关于DART梯度提升的东西,这是一种使用dropout(神经网络中的标准)的方法,来改进模型正则化和处理一些其他不太明显的问题。

也就是说,gbdt存在过度专门化(over-specialization)的问题,这意味着在以后的迭代中添加的树往往只会影响对少数实例的预测,而对其余实例的贡献则可以忽略不计。添加dropout会使树在以后的迭代中更加难以专门化那些少数的示例,从而提高性能。

lgbm goss 基于梯度的单边采样

事实上,将该方法命名为lightgbm的最重要原因就是使用了基于本文的Goss方法。Goss是较新的、较轻的gbdt实现(因此是“light”gbm)。

标准的gbdt是可靠的,但在大型数据集上速度不够快。因此goss提出了一种基于梯度的采样方法来避免搜索整个搜索空间。我们知道,对于每个数据实例,当梯度很小时,这意味着不用担心数据是经过良好训练的,而当梯度很大时,应该重新训练。这里我们有两个方面,数据实例有大的和小的渐变。因此,goss以一个大的梯度保存所有数据,并对一个小梯度的数据进行随机抽样(这就是为什么它被称为单边抽样)。这使得搜索空间更小,goss的收敛速度更快。

让我们把这些差异放在一个表格中:

640.png

注意:如果你将增强设置为RF,那么lightgbm算法表现为随机森林而不是增强树! 根据文档,要使用RF,必须使用bagging_fraction和feature_fraction小于1。

正则化

在这一节中,我将介绍lightgbm的一些重要的正则化参数。显然,这些是您需要调优以防止过拟合的参数。

您应该知道,对于较小的数据集(<10000条记录),lightGBM可能不是最佳选择。在这里,调优lightgbm参数可能没有帮助。

此外,lightgbm使用叶向树生长算法,而xgboost使用深度树生长算法。叶向方法使树的收敛速度更快,但过拟合的几率增加。

注意:如果有人问您LightGBM和XGBoost之间的主要区别是什么?你可以很容易地说,它们的区别在于它们是如何实现的。

根据lightGBM文档,当面临过拟合时,您可能需要做以下参数调优:

  • 使用更小的max_bin
  • 使用更小的num_leaves
  • 使用min_data_in_leaf和min_sum_hessian_in_leaf
  • 通过设置bagging_fraction和bagging_freq使用bagging_freq
  • 通过设置feature_fraction使用特征子采样
  • 使用更大的训练数据
  • 尝试lambda_l1、lambda_l2和min_gain_to_split进行正则化
  • 尝试max_depth以避免树的深度增长

在下面的部分中,我将更详细地解释这些参数。

lambda_l1

Lambda_l1(和lambda_l2)控制l1/l2,以及min_gain_to_split用于防止过拟合。我强烈建议您使用参数调优(在后面的小节中讨论)来确定这些参数的最佳值。

num_leaves

num_leaves无疑是控制模型复杂性的最重要参数之一。通过它,您可以设置每个弱学习者拥有的叶子的最大数量。较大的num_leaves增加了训练集的精确度,也增加了因过度拟合而受伤的几率。根据文档,一个简单的方法是num_leaves = 2^(max_depth)但是,考虑到在lightgbm中叶状树比层次树更深,你需要小心过度拟合!因此,必须同时使用max_depth调优num_leaves。

640.png

子采样

通过子样例(或bagging_fraction),您可以指定每个树构建迭代使用的行数百分比。这意味着将随机选择一些行来匹配每个学习者(树)。这不仅提高了泛化能力,也提高了训练速度。

640.png

我建议对基线模型使用更小的子样本值,然后在完成其他实验(不同的特征选择,不同的树结构)时增加这个值。

feature_fraction

特征分数或子特征处理列采样,LightGBM将在每次迭代(树)上随机选择特征子集。例如,如果将其设置为0.6,LightGBM将在训练每棵树之前选择60%的特性。

这个功能有两种用法:

  1. 可以用来加速训练吗
  2. 可以用来处理过拟合吗

640.png

max_depth

该参数控制每棵经过训练的树的最大深度,将对:

  • num_leaves参数的最佳值
  • 模型的性能
  • 训练时间

注意,如果您使用较大的max_depth值,那么您的模型可能会对于训练集过拟合。

max_bin

装箱是一种用离散视图(直方图)表示数据的技术。Lightgbm在创建弱学习者时,使用基于直方图的算法来寻找最优分割点。因此,每个连续的数字特性(例如视频的视图数)应该被分割成离散的容器。

640.png

此外,在这个GitHub repo(huanzhang12/lightgbm-gpu)中,你可以找到一些全面的实验,完全解释了改变max_bin对CPU和GPU的影响。

640.png

如果你定义max_bin 255,这意味着我们可以有255个唯一的值每个特性。那么,较小的max_bin会导致更快的速度,较大的值会提高准确性。

目录
相关文章
|
算法 测试技术 API
LightGBM的参数详解以及如何调优(下)
LightGBM的参数详解以及如何调优
837 1
LightGBM的参数详解以及如何调优(下)
|
1月前
|
机器学习/深度学习 Python
使用Python实现超参数调优
使用Python实现超参数调优
26 0
|
1月前
|
机器学习/深度学习 算法 Python
CatBoost中级教程:超参数调优与模型选择
CatBoost中级教程:超参数调优与模型选择【2月更文挑战第12天】
203 2
|
1月前
|
机器学习/深度学习 算法 Python
探索XGBoost:参数调优与模型解释
探索XGBoost:参数调优与模型解释
172 2
|
1月前
|
Swift
ModelScope这个怎么使用本地的调优前的模型文件
ModelScope这个怎么使用本地的调优前的模型文件【1月更文挑战第4天】【1月更文挑战第16篇】
82 1
|
API
XGBoost超参数调优指南
本文将详细解释XGBoost中十个最常用超参数的介绍,功能和值范围,及如何使用Optuna进行超参数调优。
332 1
|
机器学习/深度学习 存储 数据采集
机器学习之PyTorch和Scikit-Learn第6章 学习模型评估和超参数调优的最佳实践Part 1
在前面的章节中,我们学习了用于分类的基本机器学习算法以及如何在喂给这些算法前处理好数据。下面该学习通过调优算法和评估模型表现来构建良好机器学习模型的最佳实践了。本章中,我们将学习如下内容: 评估机器学习模型表现 诊断机器学习算法常见问题 调优机器学习模型 使用不同的性能指标评估预测模型 通过管道流程化工作流
227 0
机器学习之PyTorch和Scikit-Learn第6章 学习模型评估和超参数调优的最佳实践Part 1
|
机器学习/深度学习 算法 数据可视化
使用Optuna进行PyTorch模型的超参数调优
Optuna是一个开源的超参数优化框架,Optuna与框架无关,可以在任何机器学习或深度学习框架中使用它。本文将以表格数据为例,使用Optuna对PyTorch模型进行超参数调优。
160 0
|
机器学习/深度学习 并行计算 数据可视化
PyTorch自定义CUDA算子教程与运行时间分析
PyTorch自定义CUDA算子教程与运行时间分析
240 0
|
机器学习/深度学习 数据可视化 算法
使用TensorBoard进行超参数优化
使用TensorBoard进行超参数优化
262 0
使用TensorBoard进行超参数优化