需要注意是:引入的分割不一定会使得情况变好,因为在引入分割的同时也引入新叶子的惩罚项。所以通常需要设定一个阈值,如果引入的分割带来的增益小于一个阀值的时候,我们可以剪掉这个分割。此外在XGBoost的具体实践中,通常会设置树的深度来控制树的复杂度,避免单个树过于复杂带来的过拟合问题。
关于精确贪心算法和近似分割算法的小结
QA:为什么近似分割算法比精确贪心算法要快?
首先我们得捋一下这两个寻找最佳分裂点的时候都有哪些公共的时间开销
预排序:每个特征都是按照排序好的顺序存储的,这一部分在存储的时候就已经完成了
计算所有样本的一阶导G和二阶导L,这个过程只需要进行一次
对样本的G和L累加求和,这个过程也只需要进行一次,为了后续做差加速
精确贪心算法中是将所有样本G、L累加
近似分割算法中是按桶累加
算法中的两个for循环,第一个循环是遍历所有特征,这一步两个算法相同
不同的开销在于,两个算法中第二个for循环中:
精确贪心算法遍历的所有样本 O(#feature x # samples)
近似贪心算法遍历了所有桶 : O(#feature x # bins )
因为桶的数目远小于样本数,所以得以加速
转载:https://blog.csdn.net/dpengwang/article/details/87910480