无痛看懂LightGBM原文

作为三大知名GBDT的实现之一,LightGBM的优点就是快的一逼的同时精度还高。最开始我还以为是框架出自大厂之手,工程上的实现比Xgboost要好很多,所以计算比较快,看了原文才知道这内有乾坤,而且都是很容易理解的道理。所以为了展现我的学识,咳咳,今天一定要来逼逼两句。


开门见山的说,LGB(LightGBM,下文均采用此缩写)不需要通过所有样本计算信息增益了,而且内置特征降维技术,所以更快。至于LGB精度高的原因,论文中并没有给出明确的答案,但我看完后心里却有了自己的答案,很想和诸位讨论一番。

这时有同学就说了,你在https://zhuanlan.zhihu.com/p/86816771这篇文章不是讲过,XGB采用了直方图加速,只需要遍历几个可能的分裂节点就好了!它也不需要计算所有样本吖!

这里的意思是,XGB虽然每次只需要遍历几个可能的分裂节点,然后比较每个分裂节点的信息增益,选择最大的那个进行分割,但比较时需要考虑所有样本带来的信息增益。而LGB只需采用少量的样本计算信息增益,所以速度会快很多。

那么问题就来了,如果选少量的样本算信息增益,该如何保证把信息损失降到最低呢?且听我慢慢道来。


LGB选择梯度大的样本来计算信息增益。原文给出的理由如下:

if an instance is associated with a small gradient, the training error for this instance is small and it is already well trained.

如果一个样本的梯度较小,证明这个样本训练的误差已经很小了,所以不需要计算了。我们在XGB的那篇文章中说过,GBDT的梯度算出来实际上就是残差,梯度小残差就小,所以该样本拟合较好,不需要去拟合他们了。

这听起来仿佛很有道理,但问题是丢掉他们会改变数据的分布,还是无法避免信息损失,进而导致精度下降,所以LGB提出了一个很朴实无华且枯燥的方法进行优化。


LGB的优化方法是,在保留大梯度样本的同时,随机地保留一些小梯度样本,同时放大了小梯度样本带来的信息增益。

这样说起来比较抽象,我们过一遍流程: 首先把样本按照梯度排序,选出梯度最大的a%个样本,然后在剩下小梯度数据中随机选取b%个样本,在计算信息增益的时候,将选出来b%个小梯度样本的信息增益扩大 1 - a / b 倍。这样就会避免对于数据分布的改变。

这给我的感觉就是一个公寓里本来住了十个人,感觉太挤了,赶走了六个人,但剩下的四个人要分摊他们六个人的房租。


除了通过部分样本计算信息增益以外,LGB还内置了特征降维技术,思想就是合并那些冲突小的稀疏特征。

举个例子,对于一列特征[1,nan,1,nan,1]和一列特征[nan,1,nan,1,nan],他们正好可以合并成一列特征[1,2,1,2,1]。LGB的目标就是在于找到这样的特征并且将他们合并在一起。

如果把特征抽象成图中的点,特征之间的冲突看作是图中的边,那么问题就转换为找出图中的社团并使图中的社团数量最少。LGB里提出了一个贪心的策略,按照有权度来为图中所有的点排序,然后把特征合并到度小于某个阈值的社团中或单独创建一个社团。

对于特征如何合并,一个重要的原则就是使合并的两个特征可以被顺利区分出来,LGB采取了一个更改阈值的方法。例如对于特征x∈(0, 10), 特征y∈(0, 20),就可以把特征y转换为y∈(10,30),然后再去合并x与y。

但是更多的情况,对于有数据科学经验的工程师,在使用前往往会避免在特征中掺杂大量稀疏属性。


至于LGB为什么比XGB的精度高这一点,我的理解是选择梯度大(残差大)样本来进行特征分裂生成的树,借鉴了Adaboost的更改样本权重的思想。每棵树针对某些特定训练样本有着较好的划分能力,导致每棵树之间的异质性较大,对于效果近似但异质性大的模型加权往往会带来更大的提升。不知道诸位有没有更好的观点~

猜你喜欢

转载自blog.csdn.net/qq_41371349/article/details/105160454