从决策树到RF,以及boosting Adaboost到GBDT算感悟

来源:互联网 发布:c 数据加密 不可复制 编辑:程序博客网 时间:2024/06/15 15:08
一、原因:

准备学习一下机器学习中基于树模型的分类与回归算法,变看了很多的算法介绍与论文,同时也找了一些现有的库去运行。最后又设计到级联式回归,自从看了GBDT后才发现其实就是GBDT的一种变种算法。因此一路下来看了不少算法,明白了它们之间的基本关系与算法的简单原理。在此记录一下,以后也方便的查看。

二、决策树大类算法:

1.决策树:决策树是一种常见的分类与回归模型,主要呈树结构,每一个节点代表一个集合,一条边代表一种属性,而叶子节点则表示对应的类别或值。根据节点分裂规则的不同,主要分为三种方法。

ID3算法:ID3算法采用的是选择一个特征使得分裂前后样本集合的不确定性降低最大,也就是信息增益最大。

信息增益的计算方式:g(D,A)=H(D)-H(D|A)。H(D)表示分裂前对应样本集合的经验熵,而H(D|A)表示在A特征划分下的样本经验熵,也就是由特征A进行子集划分后的经验熵之

和。而H(D)=,pi为集合中i类的概率。,|D|为节点中样本个数,|Di|为i类对应的个数。

ID3算法采用信息增益最大的方式,对于一个节点而言,其对应的样本集合如果所有的类别不是一类,且样本集合不为空,逐个选择特征计算信息增益,选择最大的信息增益,如果其信息增益大于阈值,则按照对应的特征进行样本划分(分裂),然后对每个子节点和样本,循环上述的方法,否则停止。

 C4.5算法:C4.5算法是ID3算法的改进,由于ID3计算方式会导致选择特征时倾向于选择值较多的特征,C4.5引入了信息增益比的方式。即当前特征下计算的信息增益除以此特征对应的经验熵,,Ha(D)为由A特征将样本划分下对应的熵。

基于C4.5的决策树的生产方式与上述类似。

对于决策树,较深的树能够使得训练误差更小,但是往往会陷入过拟合,使得泛化误差很大,因此需要进行剪枝。

剪枝规则:剪枝的思想就是比较当前节点的下对应的整棵决策树的损失函数,与返回到其父节点上对应的损失函数,当父节点下对应的损失函数比子节点下的损失函数更小时,可以进行剪枝,将父节点变为叶子节点,去掉其子节点。至于决策树的损失函数,是各个叶子节点上的经验熵与节点样本数之积的总和,加上a*T,T为叶子节点数。其中前半部分用于表征决策树的训练误差,而a*T则代表了决策树的复杂程度。根据剃刀准则,只有在训练误差足够下的同时,模型也足够简单,这样的模型才是最好的,能够防止过拟合。

2.CART:CART算法也是对分裂规则进行改进,可以用来进行分类与回归,能够处理连续的数据。

分类时的分裂规则:基于权值的Gini系数.   ,实际计算中,一个样本集合的基尼系数为

因此CART分类规则是选择特征A,使得划分前后基尼系数比的降低最大,也就是划分后左右节点的基尼系数之和最小,为

回归时的分裂规则:在使用CART树进行回归时,可以采用基于方差的形式,由于回归时标签都是连续值,因此使用方差较为合适。即分别挑选一个特征,基于此特征下,逐个遍历特征值,将样本划分为左右子集(2层循环,第一层为特征数,第二层为某个特征对应的取值),计算左右子集的方差之和,找到所有的特征下特征值对应的方差最小的那个特征和特征值,作为划分特征和阈值,进行节点的分裂。CART树的生成方式是二叉树的形式,与上述两种方法有些微不同。但是大体的步骤相同。

剪枝规则:采用的是分别记录由根节点到各个节点下对应的决策树的损失函数序列,找到在设定值a下决策树对训练数据的预测误差最小对应的树结构。


3.Random Forests (又名Random Trees)

随机森林类似bagging思想,对样本进行多次采用,并以此生成多颗决策树,通过投票获得判别结果。

随机森林中的每棵树与决策树的区别:主要包括3点:

1).样本随机采样:n=2/3*N;就是说对训练样本而言,每棵树从样本集中采用大约2/3的样本进行决策树的训练;

2).特征随机抽取:k<<K;对于样本集中的特征,不是逐个遍历所有的特征进行划分,而是在所有的特征中随机选择k个特征,从这k个特征中找到最优的划分特征,以此对节点的样本进行划分,因此用过的特征可能还会出现。

3).无剪枝:由于随机森林在进行训练样本选择时是随机抽样的,选择划分特征时也是随机的,因此不需要进行剪枝。

OBB无偏估计:一般对于所有的训练样本,抽取2/3的样本数进行决策树的训练,那么大约有1/3的样本没有被抽取到,由limN-∞ (1-1/N)^N求得。这些样本成为袋外样本,利用这些样本对随机森林中的决策树进行预测误差的估计,称为obb无偏估计。

5.Hough Forests:

hough forest是2009年的Juergen Gail提出的,主要用来进行目标检测,也有人用来进行头部姿态估计。它与随机森林相比,往往还需要每个样本到目标中心的距离值,作为额外的输入。

对于分裂规则:对于样本集合,包括特征、标签以及中心距离,首先生成二值测试特征集,对于当前节点的样本集,选择一个二值测试特征集中的一个特征,将样本集划分为两个子集{0,1},对于0、1子集,分别随机选择类别不确定规则与位置不确定规则(可进行分类或回归,CART规则)计算总误差。遍历所有的二值测试集中的特征,找到最小的总误差对应的二值测试特征,将当前节点的样本集进行左右划分。此外当达到停止条件时就停止分裂。

三、Boosting大类算法:

1.boosting的起源:

boosting算法的思想受到bootstraping思想和bagging想的启发而产生,大致原理是通过训练多个分类器作为一个模型,提升决策能力。

(1)boosttraping :是一种样本抽样方式,对一个样本集N,只采样其中的一部分子样本m个,放入模型中去学习,一般是有放回的抽样。跟随机森林中的样本随机选取一样。

(2)bagging:其思想是指对一个样本集N,分别抽样m个子集合,每个子集分别对应一个模型进行训练。最后的输出结果为各个模型的结果投票。即对分类问题,各个类别结果相加取最大,对于回归问题,各模型输出的平均值。

boosting根据上述方法,提出了分别训练多个弱分类器组合成强分类器的思想,但是并没有实质性的算法,随后学术界大牛提出了adaboost算法,算是真正意义上能用的boosting算法模型。

2.Adaboost:能够进行实际应用的boosting算法。

adaboost算法主要步骤:

a.初始化样本的权值为1/n。

b.基于样本与权值训练弱分类器;这里的弱分类器就是个二分类器。

c.根据分类器对样本进行判别,如果判别正确,此样本的权值降低,判别错误,降低样本的权值,同时根据识别率计算出此分类器的权值;

样本权值更新与分类器权值都有计算公式,懒得贴了。

d.利用改变权值的样本训练下一个分类器;

e.循环得到N个分类器与其对应的权值;

f.基于加权的分类器组合成为最终的模型。

adaboost算法模型简单,不容易过拟合,无需调参,优点挺多。但是其实也是需要根据样本类型来使用。

3.GBD: 误差函数的梯度。根据第一个模型可以写出对应的误差函数,通过最小化误差函数得到第一个模型的参数,此时再加入第二个模型,形成新的误差函数,此时模型一的参数已知了,通过最小化新的误差函数,得到第二个模型的参数。在每次得到的误差函数,对每个模型的参数的导数,为误差函数的梯度。

4.GBDT:基于梯度上升的决策树(其实是回归树),这个模型可以当做将adaboost模型中的所分类器改为回归决策树,每个决策树的权值一样,样本的权值也一样。同时将模型的误差函数定义为二范数形式,那么每个阶段误差函数最小,即样本期望值与当前实际输出值一致。y表示样本的标签,f(m)表示前m个模型的组合结果,f(m)=f(m-1)+T(m),T(m)为第m个模型,这里为决策树。那么在前m个模型的组合下的误差函数为(y-f(m))^2,求导,误差函数最小时

y=f(m),此时的f(m)=f(m-1)+T(m),则y=f(m-1)+T(m),T(m)=y-f(m-1),即第m个决策时为前m-1个决策树组合下输出的残差(输出与真实的差值)。由于每次是当前模型m与前m-1个模型输出之和,因此多用于连续值,模型也就是回归树。也可以将决策树换为更强的回归随机森林来组合模型。


四、库与代码

 标准库:

opencv :决策树CART基于分类树与回归树那篇经典文章实现。随机森林具有分类与回归功能,但是回归的标签只能是1维,代码相互之间依赖程度高,修改难度大。

随机森林的源码:

1,微软版Sherwood版本的代码库;有c++和c#接口版本;功能较全,修改难度大

2.Pierre Geurts 版的随机森林代码;基于matlab;

3.Steffen Kirchhoff and Bjoern Andres.等人,通过c++实现,只有分类功能,由于关于随机森林的具体实现文件就1个cpp,因此修改难度小。

霍夫随机森林代码:

1.Juergen Gall, BIWI, ETH Zurich等人,是基于霍夫随机森林进行目标检测CVPR09论文的源码,基于c++实现,但是代码补全,好像没有train这个功能

五。总结:




参考文献:

[1]统计学习方法

[2]http://blog.sina.com.cn/s/blog_69e222390100xyhj.html  一品带刀的新浪博客  boosting基本思想与算法

[3]http://blog.csdn.net/baiduforum/article/details/6721749  百度互联网技术的博客  从boosting到dadboost算法

[4]http://blog.csdn.net/w28971023/article/details/8240756  w28971023专栏 关于对GBDT的理解