最近的比赛使用LightGBM的越来越多,而且LightGBM效果确实挺好的,但是每次使用时看到一堆参数就头疼,所以做了一下总结。
一、LightGBM介绍 LightGBM 是微软开发的一款快速、分布式、高性能的基于决策树的梯度 Boosting 框架。主要有以下优势:
- 更快的训练效率
- 低内存使用
- 更好的准确率
- 支持并行学习
- 可处理大规模数据
装箱处理:

文章图片
Histogram optimization

文章图片
第一个for循环:在当前模型下对所有叶子节点处理,(每一个模型)
第二个for循环:遍历所有特征,需要最佳分类特征值。使用分箱操作建立直方图。
第三个for循环:遍历所有的样本,根据

文章图片
:计算bin中样本梯度之和,

文章图片
:对bin样本计数。
第四个for循环:遍历所有bin,找到最佳bin。

文章图片
为当前bin左边所有bin的梯度和,

文章图片
为当前bin左边所有bin的数量,

文章图片
,

文章图片
为父亲样本的总梯度和和总数量,

文章图片
为当前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编码,但是对于学习数来说这不是个好的方案,对于基数大的类别特征会造成学习树的不平衡生长,并且需要很深的深度才能达到最好的结果。最好的方案就是将类别特征划分为两个子集,共有

文章图片
种划分,对于回归树来说寻找最优的划分大约

文章图片
,根据累加值对类别直方图排序,寻找最优的分割点。
三、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, |
最优的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/