学习GBDT的过程记录
先提出一些问题
之前读一些博客了解到GBDT的主要原理是去学习上一次学到的树的残差,那么小朋友你是否有许多问号??????首先,残差的具体定义是什么?其次,为什么要去学残差,而不是其他的?最后,学残差效果就会更好吗?为什么会更好呢?先带着这些问题,学几天再来记录下自己是如何找到这些问题的答案的。
XGBoot到底改进了什么?
一、算法层面的改进
1、树的剪枝
树的剪枝是通过替换无用的节点来减少回归树的大小,这些被替换的节点无助于改善叶子的分类。 修剪回归树的想法是为了防止训练数据过拟合。 进行剪枝的最有效方法是“成本复杂性”或“最弱连接剪枝”,该方法使用了均方误差,k倍交叉验证和学习率。 XGBoost会创建最大达到指定的max_depth的节点(也称为拆分),并从后开始修剪直到损失低于阈值。 考虑一个损失为-3的拆分,随后的节点损失为+ 7,XGBoost不会仅通过查看负损失来删除该拆分。 它将计算总损失(-3 + 7
= +4),如果结果为正,则两者都保留。
2、稀疏感知拆分
我们收集的数据为稀疏的(很多缺失或空值)或在执行特征工程后变得稀疏是很常见的。 要了解数据中的稀疏模式,默认方向是将其分配给每棵树。 XGBoost通过将丢失的数据分配给默认方向并找到最佳插补值,以使训练损失最小。 这里的优化是仅访问缺少的值,这些值使算法的运行速度比单纯的方法快50倍。