- XGB和LGB区别:
1、直方图优化,对连续特征进行分桶,在损失了一定精度的情况下大大提升了运行速度,并且在gbm的框架下,基学习器的“不精确”分箱反而增强了整体的泛化性能;
(XGB也提出了类似的近似分位数算法,对特征进行分桶,即找到l个划分点,将位于相邻分位点之间的样本分在一个桶中。在遍历该特征的时候,只需要遍历各个分位点,从而计算最优划分。从算法伪代码中该流程还可以分为两种,全局的近似是在新生成一棵树之前就对各个特征计算分位点并划分样本,之后在每次分裂过程中都采用近似划分,而局部近似就是在具体的某一次分裂节点的过程中采用近似算法。重要的思想是:近似方法通过特征的分布,按照百分比(三分位数)确定一组候选分裂点,通过遍历所有的候选分裂点(遍历的范围缩小了)来找到最佳的分裂点。)
2、goss 树的引入;
3、efb,对稀疏特征做了“捆绑”的优化功能;
4、直接支持对于类别特征进行训练(实际上内部是对类别特征做了类似编码的操作了)
5、树的生长方式由level-wise变成leaf-wise;
- XGB和GBDT的区别
1、算法层面:
(1)损失函数的二阶泰勒展开;(具体的二阶泰勒展开的阐述下面那点会详细描述)
(2)树的正则化概念的引入,对叶节点数量和叶子节点输出进行了约束,方式是将二者形成的约束项加入损失函数中;
(3)二阶泰勒展开与树正则化推出了新的叶子节点输出的计算公式而不是原始gbdt那样的简单平均;
(4)a、对于基础学习器的改进,
分裂的时候自动根据是否产生正增益指导是否进行分裂,因为引入了正则项的概念,分裂的时候这个预剪枝更加严苛;
b、对于缺失值的处理,xgboost根据左右子节点的增益大小将缺失值分到增益大的节点中,而sklearn中的gbdt是无法处理缺失值的,因为sklearn中的gbdt是以sklearn中的cart为基学习器的,而sklearn中的cart也并没有实现对缺失值的处理功能。
(5)学习率,Shrinkage,对每一颗树都乘以小于1的学习率,来削弱每一颗树的影响,这样的结果就是会引入更多的树来处理使得基学习器得数量变多,从而降低过拟合,不过其实sklearn中的gbdt也实现了。。。不知道为什么这么多人把这一点也列为不同;
(6)、引入了随机森林使用的列采样功能,便于降低过拟合;
(7)、引入了许多近似直方图之类的优化算法来进一步提高树的训练速度与抗过拟合的能力