提升树GBDT 详解
参考资料及博客:
李航《统计学习方法》
Gradient Boosting wiki
GBDT理解二三事
GBDT(MART) 迭代决策树入门教程 | 简介
前言
For Xgboost:
在前几篇笔记中以及详细介绍了决策树及提升方法的相关原理知识,本文是提升树与梯度提升方法的学习笔记,同时阅读了网络上的一些关于GBDT的博文,加强理解。为了能好好理解Xgboost,一步步把决策树以及提升学习方法相关的算法知识都梳理了一遍,感觉还是很有收获的,趁周末基本看完了GBDT的内容(文中还有许多理解不清晰和疑惑,希望路过大神帮忙指正),下一步就是鼎鼎大名的Xgboost了,迫不及待!哈哈,先附上陈天奇大神的论文XGBoost: A Scalable Tree Boosting System。
提升树(boosting tree)
从提升方法学习中就可以知道提升方法采用加法模型(基函数的线性组合)与前向分步算法,以决策树为基函数的提升方法成为提升树。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树(分类树与回归树详细介绍见决策树学习笔记)。
提升树模型可以表示为决策树的加法模型:
提升树算法采用前向分步算法(详细介绍见提升方法学习笔记),首先确定出初始提升树f0(x)=0,第m步的模型是:
其中,fm-1(x)为当前模型,通过经验风险极小化确定下一棵决策树的参数:
不同问题的提升树学习方法使用的损失函数不同,回归问题一般用平方误差损失函数,分类问题一般用指数损失函数,以及其它一般决策问题的一般损失函数。
注意:GDBT中所的DT(Decision Tree)树都是回归树而不是分类树,所以GDBT也叫MART(Multiple Additive Regression Tree)、GBRT(Gradient Boost Regression Tree)。下面主要叙述回归问题的提升树。
已知一个训练数据集T={(x1,y1),(x2,y2),…,(xN,yN)},X为输入空间,Y为输出空间。如果将输入空间X划分为J个不相交的区域R1,R2…,RJ,并且在每个区域上确定输出的常量cj,那么树可以表示为:
其中,参数:表示树的区域划分和各个区域上的常数,J是回归树的复杂度即叶结点个数。
回归问题的前向分步算法:
在前向分步算法的第m步,给定当前模型fm-1(x),需求解
得到第m棵数的参数。
当采用平方平方误差损失函数时,
其损失变为:
其中:
是当前模型的残差(residual),所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。
**注意:这里的拟合残差指根据回归树的生成算法步骤,用平方误差最小化准则求解每个单元上的最优输出值时,本来应该取输出变量Y与预测值的平方差,在提升树使用前向分步算法到下一个决策树学习的时候,可以把当前模型拟合数据的残差作为下一个模型学习的输出变量Y’,通过学习每一轮的学习误差(残差),到下一轮拟合的误差会越来越小,最后将模型输出累加起来,就可以得到最优的输出结果。
引用其他博客的一段描述,更有助于理解:**
GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。这就是Gradient Boosting在GBDT中的意义。
看这些推导和解释可能还会有点懵,下面按书上的算法步骤和例子梳理一遍会清晰很多:
回归树问题的提升树算法步骤
算法实例:
梯度提升/迭代(Gradient Boosting)
提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步的优化是简单的(在案例8.2中,平方损失误差)。但对于一般的损失函数,每一步的优化并不是那么容易,针对这一问题,Freidman提出了梯度提升(gradient boosting)算法。这是利用最速下降法的近似方法,关键在于利用损失函数的负梯度在当前模型的值
作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
梯度提升算法步骤:
GBDT总结
**总结:《统计学习方法》一书主要讲解了GBDT的提升原理,并没有提及其它的特点,以下总结主要来自我对Gradient Boosting wiki
以及网上一些大神的GBDT相关博客的学习。**
1.Gradient Boosting:每一次的计算是为了减少上一次的残差(residual),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boost中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少(当然也可以变向理解成每个新建的模型都给予上一模型的误差给了更多的关注),与传统Boost对正确、错误的样本进行直接加权还是有区别的。
2.Size of trees(J):模型叶结点的数量J需要根据现有数据调整,它控制着模型变量之间的相互作用,例如上一章案例中采用的仅仅两个叶结点(树桩),那么变量之间就没有什么相互作用了。一般情况下都选择J的大小在4到8之间,J=2一般不能满足需要,J>10的情况也不太可能需要。—字面翻译过来的
这一部分理解还不太明白,路过大神帮忙解答,这里说的变量之间相互作用具体指什么?我的初步理解是控制了叶结点的数目其实也就控制了树的深度(层数),每一个分层结点都是选择了一个最优特征来划分,这样如果有多层结点,子结点与父结点的划分特征之间必然会有相互作用。
3.Shrinkage(缩减):在《统计》一书中并未提及,在wiki中介绍是正则化部分,防止过拟合。
引用一段博主帛逸TB的解释
Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。用方程来看更清晰,即没用Shrinkage时:(yi表示第i棵树上y的预测值, y(1~i)表示前i棵树y的综合预测值)
y(i+1) = 残差(y1~yi), 其中: 残差(y1~yi) = y真实值 - y(1 ~ i)
y(1 ~ i) = SUM(y1, …, yi)
Shrinkage不改变第一个方程,只把第二个方程改为:
y(1 ~ i) = y(1 ~ i-1) + step * yi即Shrinkage仍然以残差作为学习目标,但对于残差学习出来的结果,只累加一小部分(step*残差)逐步逼近目标,step一般都比较小,如0.01~0.001(注意该step非gradient的step),导致各个树的残差是渐变的而不是陡变的。直觉上这也很好理解,不像直接用残差一步修复误差,而是只修复一点点,其实就是把大步切成了很多小步。本质上,Shrinkage为每棵树设置了一个weight,累加时要乘以这个weight,但和Gradient并没有关系。这个weight就是step。就像Adaboost一样,Shrinkage能减少过拟合发生也是经验证明的,目前还没有看到从理论的证明。
4.适用范围:该版本GBDT几乎可用于所有回归问题(线性/非线性),相对logistic regression仅能用于线性回归,GBDT的适用面非常广。亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)。
5.并行化实现:由于GBDT是迭代的学习方法,且下一模型的学习是在前一模型的基础上,因而只能在训练样本的层面上进行并行化处理。关于并行化相关内容等结合Xgboost学习再详细了解。
GBDT 是一个加性回归模型,通过 boosting 迭代的构造一组弱学习器,相对LR的优势如不需要做特征的归一化,自动进行特征选择,模型可解释性较好,可以适应多种损失函数如 SquareLoss,LogLoss 等等。但作为非线性模型,其相对线性模型的缺点也是显然的:boosting 是个串行的过程,不能并行化,计算复杂度较高,同时其不太适合高维稀疏特征,通常采用稠密的数值特征如点击率预估中的 COEC。—引自xgboost导读与实战
暂时了解到这么多了,文中肯定有许多描述不恰当、理解不到位的地方,希望大神们拍正。另外文中一些段落是在引用了一些其它博文的话的基础上的理解,如有侵犯,请指正。