RF跟GBDT的区别

原文来自:https://blog.csdn.net/u010398493/article/details/77587749

https://blog.csdn.net/zhangbaoanhadoop/article/details/79561085

GBDT和RF简介

GBDT(Gradient Boosting Decision Tree)

DT + Boosting = GBDT

GBDT是一种boosting算法。boosting工作机制:先从初始训练集训练处一个基学习器,然后在根据基学习器的表现对训练样本分布进行调整,使得先前的基学习器做错的训练样本在后续获得更多关注(增加错误样本权重),然后基于调整后的样本分布训练下一个基学习器,如此重复,直到基学习器达到指定的T时,最终将T个基学习器进行加权结合,得出预测。

RF(Random Forest)

DT + Bagging = RF

随机森林是bagging的一种扩展,在k个数据集选择的时候后,引入了随机属性选择。加入所有属性个数为d,k是随机选择的属性个数。那么k=d的时候,就没有改变。那么k=1的时候后,随机选择一个属性用于计算。推荐的k=log2d.
随机森林的基学习器一般是决策树算法-主要,也有神经网络。 
随机森林是对bagging算法的一点改动,但是根能提现样本集之间的差异性。会提高最终预测结果的泛化能力。

GBDT和随机森林的相同点

1、都是由多棵树组成
2、最终的结果都是由多棵树一起决定

GBDT和随机森林的不同点

1、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
2、组成随机森林的树可以并行生成;而GBDT只能是串行生成
3、对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
4、随机森林对异常值不敏感,GBDT对异常值非常敏感
5、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
6、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能

参考文献

周志华《机器学习》

http://blog.csdn.net/wangqi880/article/details/70208101

http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/random-forest-and-gbdt.html

------------------------------------------------------------------------------------------------------------

首先,GBDT和RF都是集成方法中的经典模型,我们需要弄清楚下面几个问题: 
1、GBDT是采用boosing方法,RF采用的是baggging方法 
2、bias和variance是解释模型泛化性能的,其实还有噪声

然后,理解GBDT和RF执行原理,其中GBDT中的核心是通过用分类器(如CART、RF)拟合损失函数梯度,而损失函数的定义就决定了在子区域内各个步长,其中就是期望输出与分类器预测输出的查,即bias;而RF的核心就是自采样(样本随机)和属性随机(所有样本中随机选择K个子样本选择最优属性来划分),样本数相同下的不同训练集产生的各个分类器,即数据的扰动导致模型学习性能的变化,即variance。

详细的讲解:

Gradient boosting(GB) 
机器学习中的学习算法的目标是为了优化或者说最小化loss Function, Gradient boosting的思想是迭代生多个(M个)弱的模型,然后将每个弱模型的预测结果相加,后面的模型Fm+1(x)基于前面学习模型的Fm(x)的效果生成的。

Gradient boosting Decision Tree(GBDT) 
  GB算法中最典型的基学习器是决策树,尤其是CART,正如名字的含义,GBDT是GB和DT的结合。要注意的是这里的决策树是回归树,GBDT中的决策树是个弱模型,深度较小一般不会超过5,叶子节点的数量也不会超过10,对于生成的每棵决策树乘上比较小的缩减系数(学习率<0.1),有些GBDT的实现加入了随机抽样(subsample 0.5<=f <=0.8)提高模型的泛化能力。通过交叉验证的方法选择最优的参数。

Xgboost 
  Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)。 
  (1). xgboost在目标函数中显示的加上了正则化项,基学习为CART时,正则化项与树的叶子节点的数量T和叶子节点的值有关。 
  (2). GB中使用Loss Function对f(x)的一阶导数计算出伪残差用于学习生成fm(x),xgboost不仅使用到了一阶导数,还使用二阶导数。 
  (3). 上面提到CART回归树中寻找最佳分割点的衡量标准是最小化均方差,xgboost寻找分割点的标准是最大化,lamda,gama与正则化项相关。

xgboost算法的步骤和GB基本相同,都是首先初始化为一个常数,gb是根据一阶导数ri,xgboost是根据一阶导数gi和二阶导数hi,迭代生成基学习器,相加更新学习器。 
xgboost与gdbt除了上述三点的不同,xgboost在实现时还做了许多优化:

1、在寻找最佳分割点时,考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。 
2、xgboost**考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率**,paper提到50倍。 
特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行。 
按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的buffer,然后再计算,提高算法的效率。 
3、xgboost 还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。

Random Forest:

bagging (你懂得,原本叫Bootstrap aggregating) 
bagging 的关键是重复的对经过bootstrapped采样来的观测集子集进行拟合。然后求平均。。。一个bagged tree充分利用近2/3的样本集。。。所以就有了OOB预估(outof bag estimation)

GBDT和随机森林的相同点: 
1、都是由多棵树组成 
2、最终的结果都是由多棵树一起决定

GBDT和随机森林的不同点: 
1、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成 
2、组成随机森林的树可以并行生成;而GBDT只能是串行生成 
3、对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来 
4、随机森林对异常值不敏感,GBDT对异常值非常敏感 
5、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成 
6、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能

RF 
学习随机森林模型前,一定要先了解决策树模型。树越深,模型越复杂。 
决策树模型的优点如下。 
1、容易理解和解释,树可以被可视化。 
2、不需要太多的数据预处理工作,即不需要进行数据归一化,创造哑变量等操作。 
3、隐含地创造了多个联合特征,并能够解决非线性问题。 
决策树模型最大的缺点是容易过拟合。 
随机森林由很多棵不同的决策树构成,对于一个给定的预测对象,每棵决策树都输出一个label,最后采取“投票”的方式,选择得票最多的label作为最终结果。随机森林是一种集成方法,也被认为是最近邻预测器的一种。集成方法是将一组弱分类器以一定的方式组合起来,形成一个强分类器。 
**构建单棵树的步骤: 
1、有放回的随机采样,样本数占总数的2 / 3。 
2、对于每一个结点,随机选择m个特征,从中选择能提供最好划分的特征和划分点,在下一个结点重复前两个步骤直到所有训练样例都属于同一类。** 
随机森林的错误率依赖两件事。 
1、树之间的相关性越大,整体错误率越高。 
2、单棵树的错误率越高,整体错误率越高。 
随机森林的优点: 
**1、容易理解和解释,树可以被可视化。 
2、不需要太多的数据预处理工作,即不需要进行数据归一化,创造哑变量等操作。 
3、隐含地创造了多个联合特征,并能够解决非线性问题。 
4、和决策树模型,GBDT模型相比,随机森林模型不容易过拟合。 
5、自带out-of-bag (oob)错误评估功能。 
6、易于并行化。** 
随机森林的缺点: 
1、不适合小样本,只适合大样本。 
2、大多数情况下,RF模型的精度略低于GBDT模型的精度。 
3、适合决策边界是矩形的,不适合对角线型的。

树的剪枝 
(1)前剪枝( Pre-Pruning) 
通过提前停止树的构造来对决策树进行剪枝,一旦停止该节点下树的继续构造,该节点就成了叶节点。一般树的前剪枝原则有: 
a.节点达到完全纯度 
b.树的深度达到用户所要的深度 
c.节点中样本个数少于用户指定个数 
d.不纯度指标下降的最大幅度小于用户指定的幅度 
(2)后剪枝( Post-Pruning) 
首先构造完整的决策树,允许决策树过度拟合训练数据,然后对那些置信度不够的结点的子树用叶结点来替代。CART 采用Cost-Complexity Pruning(代价-复杂度剪枝法),代价(cost) :主要指样本错分率;复杂度(complexity) :主要指树t的叶节点数,(Breiman…)定义树t的代价复杂度(cost-complexity):

信息熵H(X) 
信息增益=H(D)-H(Y|X) 
信息增益率=gain(x)/H(x) 
Gini系数=1-sum(pk^2) 
基尼系数就是熵在x=1的地方一阶泰勒展开得到f(x)=1-x 
所以gini=sum[x(1-x)]=1-sum(x^2)

xgb比gbdt好的地方: 
二阶泰勒展开 
节点分数惩罚 
增益计算不同,gbdt是gini,xgb是优化推导公式

猜你喜欢

转载自blog.csdn.net/lj6052317/article/details/86156643