LightGBM原理及调参

最近的比赛使用LightGBM的越来越多,而且LightGBM效果确实挺好的,但是每次使用时看到一堆参数就头疼,所以做了一下总结。

一、LightGBM介绍

LightGBM 是微软开发的一款快速、分布式、高性能的基于决策树的梯度 Boosting 框架。主要有以下优势:

  • 更快的训练效率
  • 低内存使用
  • 更好的准确率
  • 支持并行学习
  • 可处理大规模数据

二、lightGBM优化

2.1、lightGBM直方图优化

       直方图优化其实是优化处理节点分裂的时候的优化,在寻找最佳分裂节点可以通过对特征采用预排序的方式来快速得到最佳分裂特征值。那么在处理连续变量时,将连续变量离散化成k个整数,然后进行装箱处理,构造成一个宽度为k的直方图,在遍历数据时,根据离散化后的值作为索引在直方图中累积统计变量,当便利一次数据后,直方图累积需要的统计量,根据直方图的离散值,遍历寻找最优的分割点。这样在寻找最佳分裂特征值的时候节约很多时间。

装箱处理:[0, 0.5]-->0, [0.5, 1]-->1

Histogram optimization

  

第一个for循环:在当前模型下对所有叶子节点处理,(每一个模型)

第二个for循环:遍历所有特征,需要最佳分类特征值。使用分箱操作建立直方图。

第三个for循环:遍历所有的样本,根据H[f.bins[i]].g += g{_i}:计算bin中样本梯度之和,H[f.bins[i]].n += 1:对bin样本计数。

第四个for循环:遍历所有bin,找到最佳bin。S{_L}为当前bin左边所有bin的梯度和,n{_L}为当前bin左边所有bin的数量, 为父亲样本的总梯度和和总数量,S{_R}, n{_R} 为当前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的区别:

  

  

2.3、类别特征的最优划分

通常我们在处理类别特征的时候将其转化为one-hot编码,但是对于学习数来说这不是个好的方案,对于基数大的类别特征会造成学习树的不平衡生长,并且需要很深的深度才能达到最好的结果。最好的方案就是将类别特征划分为两个子集,共有2^{k-1} -1种划分,对于回归树来说寻找最优的划分大约k*log(k),根据累加值对类别直方图排序,寻找最优的分割点。

三、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

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_threadsLightGBM的线程数加快速度,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/

  • 0
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值