和XBGoost一样使用了二阶导数,LightGBM速度快,内存小,精度和XGBoost相当。
首先,列出LightGBM主要针对XGBoost哪两个方面进行了改进:
1)XGBoost使用了预排序,这样的好处是可以精确的找到split point,但是计算代价很大,内存很大,也可能造成过拟合
2)XGBoost使用Level-wise tree growth,便于并行,但是有些节点没必要进行分裂
LightGBM特点:
- 使用直方图简化计算
将连续特征离散化为k个整数,在遍历数据的时候,根据离散化后的值作为索引在直方图中累计统计量。根据直方图的离散值,寻找最优分割点。 - 使用leaf-wise代替level-wise
level-wise是同时分裂同一层的叶子节点,但是这样是很低效的,因为有些叶子的分裂增益较低,没有必要进行分裂。
leaf-wise是每次从当前所有叶子中,找到分裂增益最大的叶子,将其进行分裂。leaf-wise的缺点是可能会长出比较深的树,从而过拟合。因此增加了max-depth的限制。 - 支持类别特征
- 直方图做差加速
下面我们对类别特征多一点了解:
one-hot编码是无序类别特征的一种解决方法,但是在树模型里,并不合适,特别是特征维度特别高的时候,因为会面临下面两个问题:
问题一: 当特征维度很高的时候,one-vs-rest会造成one的那一边数据很少,可能无法在这个类别特征上进行切分。(直观来讲,不平衡的切分和不切分几乎没有区别)。