LightGBM原理及调参

最近的比赛使用LightGBM的越来越多,而且LightGBM效果确实挺好的,但是每次使用时看到一堆参数就头疼,所以做了一下总结。
一、LightGBM介绍 LightGBM 是微软开发的一款快速、分布式、高性能的基于决策树的梯度 Boosting 框架。主要有以下优势:

  • 更快的训练效率
  • 低内存使用
  • 更好的准确率
  • 支持并行学习
  • 可处理大规模数据
二、lightGBM优化 2.1、lightGBM直方图优化 直方图优化其实是优化处理节点分裂的时候的优化,在寻找最佳分裂节点可以通过对特征采用预排序的方式来快速得到最佳分裂特征值。那么在处理连续变量时,将连续变量离散化成k个整数,然后进行装箱处理,构造成一个宽度为k的直方图,在遍历数据时,根据离散化后的值作为索引在直方图中累积统计变量,当便利一次数据后,直方图累积需要的统计量,根据直方图的离散值,遍历寻找最优的分割点。这样在寻找最佳分裂特征值的时候节约很多时间。
装箱处理:LightGBM原理及调参
文章图片

Histogram optimization
LightGBM原理及调参
文章图片

第一个for循环:在当前模型下对所有叶子节点处理,(每一个模型)
第二个for循环:遍历所有特征,需要最佳分类特征值。使用分箱操作建立直方图。
第三个for循环:遍历所有的样本,根据LightGBM原理及调参
文章图片
:计算bin中样本梯度之和,LightGBM原理及调参
文章图片
:对bin样本计数。
第四个for循环:遍历所有bin,找到最佳bin。LightGBM原理及调参
文章图片
为当前bin左边所有bin的梯度和,LightGBM原理及调参
文章图片
为当前bin左边所有bin的数量,LightGBM原理及调参
文章图片
LightGBM原理及调参
文章图片
为父亲样本的总梯度和和总数量,LightGBM原理及调参
文章图片
为当前bin右边所有bin的梯度和和样本数量,直接由父节点减去左边得到。所仅仅建立一个叶节点的直方图就可以了。
loss衡量分裂的好坏,最小的loss特征作为最佳分裂节点。
好处:1、装箱处理成k个离散值后,每个离散值使用8为整形存储,降低内存1/8
2、预排序每次遍历都需要计算一次分裂增益,分箱后计算k次就可以了。
最关键的一点:直方图是比较粗糙的分割节点的方法,但是对最后的结果影响并不是很大,主要是由于决策树是弱模型,分割精度不重要。此外,较粗的分割节点也有正则化的效果,防止过拟合。
2.2、带深度限制的Leaf-wise叶子生长策略优化 Level-wise过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,好控制模型复杂度,不易过拟合,但是效率太低。
leaf-wise则为高效的策略,每次从当前叶子中找到分了增益最大的一个叶子,然后分裂,循环。在与level-wise分裂相同的情况下,leaf-wise可以降低更多的误差,缺点:可能会长出较深的决策树,产生过拟合。
leaf-wise和level-wise的区别:
LightGBM原理及调参
文章图片

LightGBM原理及调参
文章图片

2.3、类别特征的最优划分 通常我们在处理类别特征的时候将其转化为one-hot编码,但是对于学习数来说这不是个好的方案,对于基数大的类别特征会造成学习树的不平衡生长,并且需要很深的深度才能达到最好的结果。最好的方案就是将类别特征划分为两个子集,共有LightGBM原理及调参
文章图片
种划分,对于回归树来说寻找最优的划分大约LightGBM原理及调参
文章图片
,根据累加值对类别直方图排序,寻找最优的分割点。
三、LightGBM参数及调参 3.1、LightGBM参数介绍
控制参数 含义 用法
max_depth 数的最大深度 过拟合时降低max_depth,模型仍然会通过leaf-wise生长。0:无限制
min_data_in_leaf,
min_child_samples
一个叶子上数据的最小数量 默认20,可用来处理过拟合,设置较大可以避免生成一个较深的树,数据集较大是设置几百或几千就够了
min_sum_hessian_in_leaf,
min_child_weight
一个叶子上最小hessian和 默认1e-3,处理过拟合
feature_fraction 随机进行特征子抽样 默认1.0,防止过拟合,加速训练
bagging_fraction+bagging_freq 不进行重采样每次迭代随机选取部分数据 防止过拟合,加快训练。
bagging_freq默认0,k:每k轮迭代进行一次bagging
early_stopping_round
early_stopping_rounds
【LightGBM原理及调参】early_stopping
如果一次验证数据的一个度量在最近的early_stopping_round 回合中没有提高,模型将停止训练 加速分析,减少过多迭代
lambda
lambda_l1
lambda_l2
正则化 L1--L2
0~1
min_split_gain,
min_gain_to_split
分裂的最小gain 默认0控制树的有用分裂
cat_smooth 限制分类特征的最大阈值 用于分类特征
max_cat_group 在group边界上找到分割点 当类别数量较多时,找分割点容易过拟合
核心参数 含义 用法
task 数据的用途 默认train,选择train,test,predict
application 模型的用途 默认regression,binary,multiclass:多分类,cross_entropy:交叉熵
boosting/boost/
boosting_type
要用的算法 gbdt,rf(random forest),dart(Dropouts meet Multiple Additive Regression Trees),goss(Gradient-based One-Side Sampling)
num_boost_round 迭代次数 默认100,通常100+
learning_rate 如果一次验证数据的一个度量在最近的 early_stopping_round回合中没有提高,模型将停止训练 通常为0.1,0.01,0.001....
num_leaves 一棵树上的叶子数 默认31,num_leaves = 2^(max_depth),但是它的值的设置应该小于 2^(max_depth),否则可能过拟合
device 设备 cpu 或者 gpu
metric mae: mean absolute error , mse: mean squared error , binary_logloss: loss for binary classification , multi_logloss: loss for multi classification
num_threads LightGBM的线程数 加快速度,CPU=2*线程
IO参数 含义 用法
max_bin 表示feature将存入bin的最大数量 默认255,工具箱的最大数特征值决定容量,最小数特征值影响准确性。
categorical_feature 指定分类特征,用数字做索引 默认“”,categorical_feature=0,1,2表示column_1,~_1,~_2为分类特征
ignore_column 忽略某几个列 默认“”, ignore_column=0,1,2,忽略0,1,2列
save_binary 将数据集保存为二进制文件,下次读取更快 默认False,
3.2、调参方法:
最优的leaf-wise 最快的训练速度 最好的准确率 处理过拟合
max_depth、num_num_leaves、min_data_in_leaf bagging_fraction+baggingbagging_freq、feature_fraction、
小的max_bin、
save_binary
大的max_bin、
小的learning_rate、
大的num_leaves、
大的max_bin、
尝试dart
小的max_bin、
小的num_leaves、
使用min_data_in_leaf和min_sum_hessian_in_leaf,
设置feature_fraction,
设置bagging_fraction和bagging_freq、
使用lambda
使用min_gain_splitmin_gain_to_split、ax_depth
参考链接:
https://www.imooc.com/article/43784?block_id=tuijian_wz
https://www.jianshu.com/p/b4ac0596e5ef
http://lightgbm.apachecn.org/

    推荐阅读