随机森林及GBDT

随机性主要体现在两个方面:(1)训练每棵树时,从全部训练样本(样本数为N)中选取一个可能有重复的大小同样为N的数据集进行训练(即bootstrap取样);(2)在每个节点,随机选取所有特征的一个子集,用来计算最佳分割方式。

优点

1、 在当前的很多数据集上,相对其他算法有着很大的优势,表现良好

2、它能够处理很高维度(feature很多)的数据,并且不用做特征选择

        PS:特征子集是随机选择的

3、在训练完后,它能够给出哪些feature比较重要

        PS:http://blog.csdn.net/keepreder/article/details/47277517

4、在创建随机森林的时候,对generlization error使用的是无偏估计,模型泛化能力强

5、训练速度快,容易做成并行化方法

       PS:训练时树与树之间是相互独立的

6、 在训练过程中,能够检测到feature间的互相影响

7、 实现比较简单

8、 对于不平衡的数据集来说,它可以平衡误差。

9、如果有很大一部分的特征遗失,仍可以维持准确度。


缺点:

1、随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟

2、对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。


和GBDT的异同点

GBDT和随机森林的相同点:

1、都是由多棵树组成

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


GBDT和随机森林的不同点:

1、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成

2、组成随机森林的树可以并行生成;而GBDT只能是串行生成

3、对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来

4、随机森林对异常值不敏感,GBDT对异常值非常敏感

5、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成

6、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能

首先gbdt 是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。

  •  gbdt的训练过程

        我们通过一张图片,图片来源来说明gbdt的训练过程: 

    

                      图 1:GBDT 的训练过程

        gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度,(此处是可以证明的)。

        弱分类器一般会选择为CART TREE(也就是分类回归树)。由于上述高偏差和简单的要求 每个分类回归树的深度不会很深。最终的总分类器 是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。

        模型最终可以描述为:

Fm(x)=m=1MT(x;θm)Fm(x)=∑m=1MT(x;θm)

        模型一共训练M轮,每轮产生一个弱分类器 T(x;θm)T(x;θm)弱分类器的损失函数

θ^m=argminθmi=1NL(yi,Fm1(xi)+T(xi;θm))θ^m=arg⁡minθm⁡∑i=1NL(yi,Fm−1(xi)+T(xi;θm))

        Fm1(x)Fm−1(x) 为当前的模型,gbdt 通过经验风险极小化来确定下一个弱分类器的参数。具体到损失函数本身的选择也就是L的选择,有平方损失函数,0-1损失函数,对数损失函数等等。如果我们选择平方损失函数,那么这个差值其实就是我们平常所说的残差

    • 但是其实我们真正关注的,1.是希望损失函数能够不断的减小,2.是希望损失函数能够尽可能快的减小。所以如何尽可能快的减小呢?
    • 让损失函数沿着梯度方向的下降。这个就是gbdt 的 gb的核心了。 利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值去拟合一个回归树。gbdt 每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度。
    • 这样每轮训练的时候都能够让损失函数尽可能快的减小,尽快的收敛达到局部最优解或者全局最优解。
  • gbdt如何选择特征?

        gbdt选择特征的细节其实是想问你CART Tree生成的过程。这里有一个前提,gbdt的弱分类器默认选择的是CART TREE。其实也可以选择其他弱分类器的,选择的前提是低方差和高偏差。框架服从boosting 框架即可。

        下面我们具体来说CART TREE(是一种二叉树) 如何生成。CART TREE 生成的过程其实就是一个选择特征的过程。假设我们目前总共有 M 个特征。第一步我们需要从中选择出一个特征 j,做为二叉树的第一个节点。然后对特征 j 的值选择一个切分点 m. 一个 样本的特征j的值 如果小于m,则分为一类,如果大于m,则分为另外一类。如此便构建了CART 树的一个节点。其他节点的生成过程和这个是一样的。现在的问题是在每轮迭代的时候,如何选择这个特征 j,以及如何选择特征 j 的切分点 m:

    • 原始的gbdt的做法非常的暴力,首先遍历每个特征,然后对每个特征遍历它所有可能的切分点,找到最优特征 m 的最优切分点 j。


猜你喜欢

转载自blog.csdn.net/sphinxrascal168/article/details/80277910