CART&GBDT&XGBoost&LightGBM
CART
当CART是分类树时,采用GINI值作为节点分裂的依据;
当CART是回归树时,采用样本的最小方差作为节点分裂的依据;
DART
1 2 |
DART树,是引入dropout防止过拟合。 在计算第m+1颗树时,并不完全使用前面m颗树的总体,而是选取一部分,假设drop掉了k颗树。后面的树的影响会很小,所以可以假设每一颗树补救了真是值的区间为a,那么k颗树就是ka,所以新树在拟合时具有较大的损失与差距,这个差距大概是ka。如果直接加入,那么m+1颗树会造成远远偏离真实结果。所以,对于新树的权重除以k。那么假设m颗树已经拟合非常近了,这白白的增加了一个a的误差。所以期望没有多出来这个a,做一个修正,即,drop的k颗树,和第m+1颗树其叶子权重再乘以 k/(k+1)。 |
GBDT
1 2 3 4 5 6 7 8 9 10 11 |
GBDT常说拟合的是负梯度或残差,在此做个解释: 负梯度,因为在梯度下降中,每次更新w是减去α*梯度。而GBDT树是个累加模型,所以需要加上一个负梯度。 至于残差,是在损失函数为均方损失时,其梯度为( f(x) -y )^2 的一阶导,即为 1/2 *( f(x) - y ),常数项归入α省略,其负梯度即为y-f(x),即为残差。 为了使提升的速度最快,沿着梯度的方向最快。 梯度下降找最小值,对于均方误差,计算损失时,当该维度 预测值大于真实值时,其梯度为正,更新减去该梯度,可反向靠拢真实值。 如果该维度 预测值小于真实值,则其偏导为负,也就是还没走到正确位置,减去该梯度,靠拢真实值。 梯度的方向是函数在这点增长最快的方向.因此,我们可以得到如下结论:函数在某点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值. 多元函数,梯度就是各方向上的偏导。因为对于单一维度,其导数也就是切线方向。 |
1 2 3 4 |
GBDT分类树: 1、虽然是分类树,但是每个子树都是回归树,损失使用平方损失选择分裂节点。 2、对于子树叶子节点值的确定,是对损失的线性搜索,使用牛顿法近似求得。其实,还是二阶。 3、最终的分类是对回归增加一层sigmod。 |
XGBoost
1 2 3 4 5 |
https://www.jianshu.com/p/7467e616f227 https://xgboost.readthedocs.io/en/latest/tutorials/model.html https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf xgboost. |
1 |
xgboost is并不是计算的真实的损失,而是损失的二阶泰勒近似 |
1 2 3 4 5 6 |
Xgboost: 一颗树的停止有多个参数。 1、最大深度默认是6 2、gamma默认为0, Minimum loss reduction required to make a further partition on a leaf node of the tree . 如果gamma大于0,则表示,如果本次分裂,损失不能获得gamma的提升,则不进行分裂。 3、min_child_weight [default=1] 。 If the tree partition step results in a leaf node with the sum of instance weight less than min_child_weight, then the building process will give up further partitioning. The larger min_child_weight is, the more conservative the algorithm will be. 在分裂阶段,如果该叶子节点下所有节点的weight的和不大于min_child_weight,则不再进行分裂。 4、还有比如,叶子节点instance低于一定数量时也不进行分裂。 因为做了很多建树时候防止过拟合的操作,所以不需要剪枝。 |
1 2 |
如何理解 Gradient boosting 与 Gradient Descent . 他们的核心区别是什么? 每一次的提升树,与每一轮的梯度下降优化。 区别是什么 |
LightGBM
1 2 3 4 5 |
https://blog.csdn.net/shine19930820/article/details/79123216 https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf http://lightgbm.apachecn.org/cn/latest/Features.html lightGBM |
1 |
Gradient boosting machines (GBM) |
Gradient- based One-Side Sampling (GOSS) 基于梯度的one-side采样
优化点: 在进行梯度提升的时,样本的梯度是不一样的,每次对大量足够小梯度的样本进行决策点寻找造成效率不高。
方法: 对梯度小的样本进行降采样。
具体:
对于每一次树的迭代,对样本梯度的绝对值进行倒序,前a*100%为梯度较高的样本。对剩余的(1-a)*%进行采样,假设采样样本占比为全体样本的 b*100%。
在计算information gain时对该类样本进行 (1-a)/b 倍的调整,以保持整体的稳定。
评价: 整体提升效果比较好。不是非常好的原因是每次迭代需要进行额外的计算。
Exclusive Feature Bundling (EFB) 互斥特征绑定
优化点:大量的稀疏特征,特征下非常少的非0元素,如果每次增益计算都进行则占用许多计算量。
方法:把互斥的特征合并在一起,降低特征的维度。
具体:把features => bundles。 找到最优的即把特征合并到最低维度是NP-hard问题,即多项式时间无法解决。
两个方法
a. 构建features Graph,其中边的权重是两个特征冲突数量的个数,然后对节点根据degrees进行倒排。
对features进行合并,直到达到冲突阈值γ,建立新的bundle。
这种方法需要在训练前进行预处理,需要花费O(sqare(#feature)) 的时间。 当特征数量不是很多的时候是可以接受的。
b. 认为非零元素多的特征越容易产生冲突。直接对特征进行非零元素个数进行排序。然后进行合并。
bundles特征值:
多个feature合并到一个bundle后存在特征值问题。解决方法是,进行数据偏移。因为树模型不是基于距离的。
比如:bundle中包含a、b两个特征。a特征范围是[0,10),b特征范围是[0,20),那么把b特征值改为[10,30),即10+原来的b。
评价:EFB有巨大的提升。
LightGBM使用了直方图方法,但不能算作他的特产。
从XGB到LGB:美团外卖树模型的迭代之路
一是针对 Loss 做了二阶泰勒展开,收敛速度更加快。
二是引入正侧项,进一步防止过拟合。
三是按叶子加和。
四是极小值解析解。