给出下面这个广泛使用 直方图优化算法的ppt,本文是对该张ppt的解释。
直方图优化算法需要在训练前预先把特征值转化为bin,也就是对每个特征的取值做个分段函数,将所有样本在该特征上的取值划分到某一段(bin)中。最终把特征取值从连续值转化成了离散值。
下面是训练过程中利用直方图寻找最佳分割点的算法。(不需要像预排序一样,把特征的所有取值进行排序)
首先,对于当前模型的每个叶子节点,需要遍历所有的特征,来找到增益最大的特征及其划分值,以此来分裂该叶子节点。
然后,(在第二个for循环中)
上面第三步中涉及到了lightgbm的一个优化——Histogram(直方图)做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM 可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。
下面是整理的直方图算法的优缺点(对比pre-sorted预排序)。
优点:
缺点:
最后一点是比较关键的一点,LightGBM为何使用直方图这种比较粗的分割节点方法,还能达到比较好的效果?
虽然分割的精度变差了,但是对最后结果的影响不是很大,主要由于决策树是弱模型, 分割点是不是精确并不是太重要 ;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。