GBDT
GBDT,梯度提升决策树,是一种以决策树为base learner的集成方法,以串行的方式,不断的学习新的base learner,每次都朝目标前进一些,形成一系列base learner,最终由这一系列base learner进行线性组合得到最终的ensemble learner,表示如下:
,其中表示第t轮迭代的base learner,表示第t轮迭代的ensemble learner。
设损失函数为L,使用梯度下降法来更新F,有,其中为学习率或步长
可以看到第t轮迭代的base learner与(loss对之前的ensemble learner的)梯度成线性关系,所以这也是GBDT中gradient boosting部分的由来。
在GBDT中,base learner是用树模型来表示的,构造一棵决策树去逼近一阶梯度,
其中T表示决策树的叶子节点数目,叶子节点的取值等于属于该叶子节点的样本的一阶梯度的平均;
然后line search步长,,即可以使得当前迭代的loss最小的值便是;
得到第t轮迭代的base learner ;更新模型 。
XGB
xgb是GBDT框架的一种实现,还有其它的如lightGBM、catboost也是GBDT的一种。xgb的主要特点是使用了二阶泰勒展开式对loss进行了近似,使得整个求解框架可以适用于任意二阶可导的loss;具体如下:
,
往loss中添加正则,,其中第一部分约束叶子节点数量T,第二部分约束各叶子节点的取值,改写loss,
其中分布表示属于叶子节点i的样本的一阶梯度和、二阶梯度和
令L对的导数为0,可得
,相对于使用二阶的牛顿法进行优化、而非GBDT中的一阶梯度下降法,其中相当于对进行了平滑
,表示叶子节点i上的loss,
分裂节点i带来的增益为分裂前的loss-(分裂后两个新节点的loss和),即,
当增益小于一定阈值的时候可以停止分裂,相当于起了个预剪枝的作用。
由于无法知道树结构,只能采取贪心,每次选择一个增益最大的节点进行分裂生长,直至满足一定条件(深度、叶子数量或增益阈值)。
得到base learner后,一般需要对得到base learner 乘以一个系数,以进行shrinkage:
一方面,由于采用了二阶泰勒展开式对loss进行了近似,shrinkage可以减少近似的误差;
另一方面,由于base learner树是通过贪心得到的,并非最佳结构,shrinkage相当于对每个base learner进行了降权,且shrinkage后会增多迭代次数、即有更多的base learner,有助于减小过拟合。
另外,xgb还借鉴了随机森林的思想,支持行、列采样,采样可以加快计算速度、有助于减小过拟合。
分裂方法
精准模式:遍历所有特征的所有可能的分割点,计算gain值,选取值最大的(feature,value)去分割。
近似模式:对于每个特征,只考察分位点,减少计算复杂度,即计算在分位点处分割的增益,选择分裂。
- Global:学习每棵树前,提出候选切分点
- Local:每次分裂前,重新提出候选切分点
实际上XGB不是简单地按照样本个数进行分位,而是以二阶梯度值作为权重(Weighted Quantile Sketch)进行分位,比如:
为什么用二阶梯度h加权?把目标函数整理成以下形式,可以看出二阶梯度h有对loss加权的作用:
缺失值处理
左右两边,含有缺失的部分样本放哪边带来的增益更大就放哪边,即选择那边为默认方向。
树模型的优缺点
优点
- 节点分裂:天然支持缺失值(训练得到的分裂默认方向)、对异常值鲁棒、具有伸缩不变性(不用归一化特征)
- 路径:相对于进行了特征组合、具有特征选择的作用(经常出现在路径中的特征比较重要,基本不出现在路径中的特征不怎么重要)、可解释性强
缺点
- 通过路径的方式进行特征组合的效率太低,不适合处理高维数据、尤其是高维稀疏数据(太稀疏,特征有效值便太少,得到的分裂值容易不合理)
- 缺乏平滑性(回归预测时输出值只能输出有限的若干种数值)