1 速度和内存使用优化
许多 boost 工具使用基于预排序的算法(例如 xgboost 中的默认算法)进行决策树学习。这是一个简单的解决方案,但不容易优化。
LightGBM 使用基于直方图的算法,将连续的特征(属性)值分门别类。这加快了训练速度,减少了内存的使用。基于直方图的算法的优势包括以下几点:
-
减少了计算每个分支增益的消耗
基于预排序的算法具有时间复杂度 O(#data)计算直方图的时间复杂度为 O(#data),但这只涉及到快速求和操作。一旦构建了直方图,基于直方图的算法的时间复杂度为 O(#bins),而 #bins 远远小于 #data。
-
使用直方图减法来进一步提速
要得到二叉树中一片叶子的直方图,可以使用它的父叶和邻叶的直方图做减法。所以它只需要构造一个叶子的直方图(其 #data 比其邻居小),然后它可以用小成本 O(#bins) 通过直方图减法得到其邻居的直方图。
-
减少内存使用量
用离散 bins 代替连续值。如果 #bins 很小,可以使用小数据类型,如 uint8_t,来存储训练数据。
无需为预排序特征值存储额外信息
-
降低并行学习的通信成本
2 稀疏优化
只需要 O(2 * #非零数据) 来构建稀疏特征的直方图。
3 准确度优化
Leaf-wise (Best-