本文为本人另两篇博客机器学习/计算机视觉(cv)实习面试资料整理(附字节、阿里、腾讯、美团面经)、机器学习知识点整理以及集成树知识点概括下的子内容,有需要的朋友按需自取~
另:本文只是知识点的整理概括,更为详细的可以参考我每个部分给出的链接~
详细介绍参考LightGBM算法总结
概述
- LightGBM(Light Gradient Boosting Machine) 提出的主要原因就是为了解决 GBDT 在海量数据遇到的问题,让 GBDT 可以更好更快地用于工业实践;
- 基于决策树算法的分布式梯度提升框架;
- 通过部分样本计算信息增益:
1)LGB选择梯度大的样本来计算信息增益;
2)在保留大梯度样本的同时,随机地保留一些小梯度样本,同时放大了小梯度样本带来的信息增益;
3)首先把样本按照梯度排序,选出梯度最大的a%个样本,然后在剩下小梯度数据中随机选取b%个样本,在计算信息增益的时候,将选出来b%个小梯度样本的信息增益扩大 1 - a / b 倍。这样就会避免对于数据分布的改变; - 内置了特征降维技术:
1)合并那些冲突小的稀疏特征;
2)提出了一个贪心的策略,按照有权度来为图中所有的点排序,然后把特征合并到度小于某个阈值的社团中或单独创建一个社团; - LGB是一个实现 GBDT 算法的框架,支持高效率的并行训练,并且具有以下优点:
1)更快的训练速度;
2)更低的内存消耗;
3)更好的准确率;
4)分布式支持,可以快速处理海量数据;
LightGBM 优化
- 基于 Histogram 的决策树算法;
- 带深度限制的 Leaf-wise 的叶子生长策略;
- 直方图做差加速;
- 直接支持类别特征(Categorical Feature);
- Cache 命中率优化;
- 基于直方图的稀疏特征优化;
- 多线程优化;
直方图
内存消耗可以降低为原来的1/8;计算上的代价也大幅降低,时间复杂度从O(#data*#feature)优化到O(k*#features);
- 基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图:
在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点; - 离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点:
原因是决策树本来就是弱模型,分割点是不是精确并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响;
带深度限制的 Leaf-wise 的叶子生长策略
- Level-wise 过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合,但效率低下;
- Leaf-wise 则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环;
- Leaf-wise 可以降低更多的误差,得到更好的精度;
- Leaf-wise 的缺点是可能会长出比较深的决策树,产生过拟合。因此 LightGBM 在 Leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合;
直方图加速
- 一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到;
- 直方图做差仅需遍历直方图的k个桶;
直接支持类别特征
- 可以直接输入类别特征,不需要额外的0/1 展开;
- 并在决策树算法上增加了类别特征的决策规则;
LightGBM并行优化
- LightGBM 原生支持并行学习,目前支持特征并行和数据并行的两种;
- 特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点;
- 数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点;
- 在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;
- 在数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。基于投票的数据并行则进一步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时候,使用投票并行可以得到非常好的加速效果;
LightGBM和XGBoost区别
精度更高,速度更快;
- XGB虽然每次只需要遍历几个可能的分裂节点,然后比较每个分裂节点的信息增益,选择最大的那个进行分割,但比较时需要考虑所有样本带来的信息增益。而LGB只需采用少量的样本计算信息增益,所以速度会快很多;
- 至于LGB为什么比XGB的精度高这一点,我的理解是选择梯度大(残差大)样本来进行特征分裂生成的树,借鉴了Adaboost的更改样本权重的思想。每棵树针对某些特定训练样本有着较好的划分能力,导致每棵树之间的异质性较大,对于效果近似但异质性大的模型加权往往会带来更大的提升;
注:这部分引用于某篇博客,但是找不到出处了,如果有疑问请联系我~
本人关于树的其他文章: