对GBDT, Xgboost 和 LightGbm 的理解
对于机器学习问题,我们寻找函数 使得如下损失最小,
其中,
Boosting方法假设 为一系列基模型的加权和,
其中 为基模型, 为参数。采用向前迭代演算法求解 ,
从而得到第 步的模型:
1、GBDT
下面假设基模型为决策树(Decision Tree),并使用梯度下降法求解最优参数,这样的模型叫做Gradient Boosting Decision Tree(GBDT)。
让 达到最小,只需让每一个样本的损失 最小,于是沿著梯度方向搜索最优步长即可。从而得到:
由于 的取值乘以一个常数不影响决策树叶子对应的区域(但影响取值),不妨认为
这样我们得到了第 个基模型 在 个样本上的取值, 由于模型要适用于未知数据,因此 需要有一个参数化的表达。我们需要求解参数 ,对于决策树,参数就是叶子节点对应的区域和取值,这并不是一个困难的问题。
刚刚提到了叶子节点对应的取值并不准确,因此还需要进一步求解这个值。对于每一个叶子节点上的样本,通过最小化节点上的样本的损失得到最优值。设第 个基模型的第 个叶子对应的区域为 ,则这个区域上的取值 可以通过极小化下式得到:
这样就得到了第 个基模型。在现实使用中,为了避免过拟合,通常可以乘以一个收缩系数,即:
2、Xgboost 和 LightGbm
使用梯度下降法只得到了原损失函数的一阶近似,类似于梯度下降和牛顿法的关系,我们可以将损失函数进行二阶泰勒展开:
其中C不影响 。
Xgboost同时考虑了如下正则项:
其中 为叶子节点上的取值, 为叶子节点的数量。于是优化目标为:
假设叶子节点的区域已经确定了,那么各个区域上的取值该怎么计算呢?(对于一个特定的区域, 为常数)对于第j个区域,
且第 个区域上的最小损失为:
总的损失为,
定义L的相反数为得分S,接下来最大化S。
然而现在的问题是,我们不知道每个区域长什么样。怎么办?办法是从头开始分裂。分裂前的得分为:
是所有样本的一阶导数, 是所有样本的二阶导数。给定一个特征和阈值,分裂后的得分为:
表示左边样本的一阶导数,其它同理。记录使得 最大的特征和阈值,如果 ,则完成这次分裂,继续寻找下次分裂,否则停止分裂。
3、最佳分裂点
搜索最佳分裂点时一个特别耗时的过程。
对于连续特征,可以只搜索特定分位点,但这样并不是一种高效而稳健的方法。
对(1)配方,可以得到:
可以看作样本损失的权重。于是,Xgboost的论文中以样本的二阶导数作为样本权重,提出了weigthed Quantile 方法,重新寻找分位点。 依赖于最新的模型,需要多次计算。
LightGbm则采用了直方图加速办法。先将特征离散为区间(bins),然后计算每个区间上的样本的一阶导数和二阶导数,最后搜索次数为区间数量,大大减小时间复杂度和空间复杂度。
对于类别变数,可以用Label对应的正样本的比例作为数值,对label进行排序。比如,颜色这个特征下有红、橙、黄、绿、青、蓝、紫7个取值,每个值对应的正样本的比例为红(0.7)、橙(0.2)、黄(0.8)、绿(0.3)、青(0.5)、蓝(0.4)、紫(0.6)。可以将颜色排序为黄、红、紫、青、蓝、绿、橙,这样只需要分裂6次,大大降低复杂度(原来需要分裂 次),有文献证明这样的排序能达到cross entropy或 gini index的最优值。
推荐阅读: