CART, Bagging, Random Forest, Boosting

来源:互联网 发布:计算机专业课程知乎 编辑:程序博客网 时间:2024/04/19 23:30

转自 http://blog.csdn.net/abcjennifer/article/details/8164315

和 http://blog.csdn.net/tianguokaka/article/details/9018933

部分摘自其他博客,详见参考文献。

CART采用一种二分递归分割的方法 ,将当前样本集分为两个子样本集,使得生成的决策树的每个非叶子节点都有两个分支。

1.CART(Classification And Regression Tree)
      思想:递归地将输入空间分割成矩形
      优点:可以进行变量选择,可以克服missing data,可以处理混合预测
      缺点:不稳定,数据量小模型不准确

   如何以递归方式建立决策树?   

分类训练过程:

image image image image image image image image

      就这样不断分割之后可以建立如下这样的决策树,分类回归树是一棵二叉树,且每个非叶子节点都有两个孩子,所以对于第一棵子树其叶子节点数比非叶子节点数多1

image

 举个例子:

表1

名称体温表面覆盖胎生产蛋能飞水生有腿冬眠类标记人恒温毛发是否否否是否哺乳类巨蟒冷血鳞片否是否否否是爬行类鲑鱼冷血鳞片否是否是否否鱼类鲸恒温毛发是否否是否否哺乳类蛙冷血无否是否有时是是两栖类巨蜥冷血鳞片否是否否是否爬行类蝙蝠恒温毛发是否是否是否哺乳类猫恒温皮是否否否是否哺乳类豹纹鲨冷血鳞片是否否是否否鱼类海龟冷血鳞片否是否有时是否爬行类豪猪恒温刚毛是否否否是是哺乳类鳗冷血鳞片否是否是否否鱼类蝾螈冷血无否是否有时是是两栖类

上例是属性有8个,每个属性又有多少离散的值可取。在决策树的每一个节点上我们可以按任一个属性的任一个值进行划分。比如最开始我们按:

1)表面覆盖为毛发和非毛发

2)表面覆盖为鳞片和非鳞片

3)体温为恒温和非恒温

等等产生当前节点的左右两个孩子。按哪种划分最好呢?有3个标准可以用来衡量划分的好坏:GINI指数、双化指数、有序双化指数。下面我们只讲GINI指数,因为CART用的就是Gini指数。

GINI指数--度量节点的不纯度

总体内包含的类别越杂乱,GINI指数就越大(跟熵的概念很相似)。表示一个随机选取的样本在子集中被分错的可能性。比如体温为恒温时包含哺乳类5个、鸟类2个,则:

体温为非恒温时包含爬行类3个、鱼类3个、两栖类2个,则

所以如果按照“体温为恒温和非恒温”进行划分的话,我们得到GINI的增益(类比信息增益):

最好的划分就是使得GINI_Gain最小的划分。

终止条件

一个节点产生左右孩子后,递归地对左右孩子进行划分即可产生分类回归树。这里的终止条件是什么?什么时候节点就可以停止分裂了?直观的情况,当节点包含的数据记录都属于同一个类别时就可以终止分裂了。这只是一个特例,更一般的情况我们计算χ2值来判断分类条件和类别的相关程度,当χ2很小时说明分类条件和类别是独立的,即按照该分类条件进行分类是没有道理的,此时节点停止分裂。注意这里的“分类条件”是指按照GINI_Gain最小原则得到的“分类条件”。

假如在构造分类回归树的第一步我们得到的“分类条件”是:体温为恒温和非恒温。此时:

 哺乳类爬行类鱼类鸟类两栖类恒温50020非恒温03302

《独立性检验》中讲述了χ2的计算方法。当选定置信水平后查表可得“体温”与动物类别是否相互独立。

还有一种方式就是,如果某一分支覆盖的样本的个数如果小于一个阈值,那么也可产生叶子节点,从而终止Tree-Growth。

如何确定叶子节点的类?

前面提到Tree-Growth终止的方式有2种,对于第一种方式,叶子节点覆盖的样本都属于同一类,那么这种情况下叶子节点的类自然不必多言。对于第二种方式,叶子节点覆盖的样本未必属于同一类,直接一点的方法就是,该叶子节点所覆盖的样本哪个类占大多数,那么该叶子节点的类别就是那个占大多数的类。


剪枝

当分类回归树划分得太细时,会对噪声数据产生过拟合作用。因此我们要通过剪枝来解决。剪枝又分为前剪枝和后剪枝:前剪枝是指在构造树的过程中就知道哪些节点可以剪掉,于是干脆不对这些节点进行分裂,在N皇后问题和背包问题中用的都是前剪枝,上面的χ2方法也可以认为是一种前剪枝;后剪枝是指构造出完整的决策树之后再来考查哪些子树可以剪掉,自下而上逐层进行剪枝。

在分类回归树中可以使用的后剪枝方法有多种,比如:代价复杂性剪枝、最小误差剪枝、悲观误差剪枝等等。这里我们只介绍代价复杂性剪枝法。

对于分类回归树中的每一个非叶子节点计算它的表面误差率增益值α。

是子树中包含的叶子节点个数;

是节点t的误差代价,如果该节点被剪枝;

r(t)是节点t的误差率;

p(t)是节点t上的数据占所有数据的比例。

是子树Tt的误差代价,如果该节点不被剪枝。它等于子树Tt上所有叶子节点的误差代价之和。

比如有个非叶子节点t4如图所示:

已知所有的数据总共有60条,则节点t4的节点误差代价为:

子树误差代价为:

以t4为根节点的子树上叶子节点有3个,最终:

找到α值最小的非叶子节点,令其左右孩子为NULL。当多个非叶子节点的α值同时达到最小时,取最大的进行剪枝。


2.Bagging (Breiman1996): 也称bootstrap aggregation
      Bagging的策略:
      – 从样本集中用Bootstrap采样选出n个样本
      – 在所有属性上,对这n个样本建立分类器(CART or SVM or …)
      – 重复以上两步m次,i.e.build m个分类器(CART or SVM or …)
      – 将数据放在这m个分类器上跑,最后vote看到底分到哪一类
      Fit many large trees to bootstrap resampled versions of the training data, and classify by majority vote.
      下图是Bagging的选择策略,每次从N个数据中采样n次得到n个数据的一个bag,总共选择B次得到B个bags,也就是B个bootstrap samples.

      流程图如下:

image

3.随机森林:

       随机森林,指的是利用多棵树对样本进行训练并预测的一种分类器。该分类器最早由Leo Breiman和Adele Cutler提出,并被注册成了商标。简单来说,随机森林就是由多棵CART(Classification And Regression Tree)构成的。对于每棵树,它们使用的训练集是从总的训练集中有放回采样出来的,这意味着,总的训练集中的有些样本可能多次出现在一棵树的训练集中,也可能从未出现在一棵树的训练集中。在训练每棵树的节点时,使用的特征是从所有特征中按照一定比例随机地无放回的抽取的,根据Leo Breiman的建议,假设总的特征数量为M,这个比例可以是sqrt(M),1/2sqrt(M),2sqrt(M)。

      因此,随机森林的训练过程可以总结如下:

        (1)给定训练集S,测试集T,特征维数F。确定参数:使用到的CART的数量t,每棵树的深度d,每个节点使用到的特征数量f,终止条件:节点上最少样本数s,节点上最少的信息增益m

       对于第1-t棵树,i=1-t:

       (2)从S中有放回的抽取大小和S一样的训练集S(i),作为根节点的样本,从根节点开始训练

       (3)如果当前节点上达到终止条件,则设置当前节点为叶子节点,如果是分类问题,该叶子节点的预测输出为当前节点样本集合中数量最多的那一类c(j),概率p为c(j)占当前样本集的比例;如果是回归问题,预测输出为当前节点样本集各个样本值的平均值。然后继续训练其他节点。如果当前节点没有达到终止条件,则从F维特征中无放回的随机选取f维特征。利用这f维特征,寻找分类效果最好的一维特征k及其阈值th,当前节点上样本第k维特征小于th的样本被划分到左节点,其余的被划分到右节点。继续训练其他节点。有关分类效果的评判标准在后面会讲。

       (4)重复(2)(3)直到所有节点都训练过了或者被标记为叶子节点。

       (5)重复(2),(3),(4)直到所有CART都被训练过。

       利用随机森林的预测过程如下:

       对于第1-t棵树,i=1-t:

       (1)从当前树的根节点开始,根据当前节点的阈值th,判断是进入左节点(<th)还是进入右节点(>=th),直到到达,某个叶子节点,并输出预测值。

       (2)重复执行(1)直到所有t棵树都输出了预测值。如果是分类问题,则输出为所有树中预测概率总和最大的那一个类,即对每个c(j)的p进行累计;如果是回归问题,则输出为所有树的输出的平均值。

      注:有关分类效果的评判标准,因为使用的是CART,因此使用的也是CART的平板标准,和C3.0,C4.5都不相同。

       对于分类问题(将某个样本划分到某一类),也就是离散变量问题,CART使用Gini值作为评判标准。定义为Gini=1-∑(P(i)*P(i)),P(i)为当前节点上数据集中第i类样本的比例。例如:分为2类,当前节点上有100个样本,属于第一类的样本有70个,属于第二类的样本有30个,则Gini=1-0.7×07-0.3×03=0.42,可以看出,类别分布越平均,Gini值越大,类分布越不均匀,Gini值越小。在寻找最佳的分类特征和阈值时,评判标准为:argmax(Gini-GiniLeft-GiniRight),即寻找最佳的特征f和阈值th,使得当前节点的Gini值减去左子节点的Gini和右子节点的Gini值最大。

       对于回归问题,相对更加简单,直接使用argmax(Var-VarLeft-VarRight)作为评判标准,即当前节点训练集的方差Var减去减去左子节点的方差VarLeft和右子节点的方差VarRight值最大。

       Random Forest与Bagging的区别在于:Bagging每次生成决策树的时候从全部的属性Attributes里面选择,而Random Forest是随机从全部Attributes的集合里面生成一个大小固定的子集,相对而言需要的计算量更小一些。

4.Boosting(Freund & Schapire 1996):
        boosting在选择hyperspace的时候给样本加了一个权值,使得loss function尽量考虑那些分错类的样本(i.e.分错类的样本weight大)。
怎么做的呢?
       – boosting重采样的不是样本,而是样本的分布,对于分类正确的样本权值低,分类错误的样本权值高(通常是边界附近的样本),最后的分类器是很多弱分类器的线性叠加(加权组合),分类器相当简单。

      结构如图:

image

        AdaBoost和RealBoost是Boosting的两种实现方法。general的说,Adaboost较好用,RealBoost较准确。由于Boosting算法在解决实际问题时有一个重大的缺陷,即他们都要求事先知道弱分类算法分类正确率的下限,这在实际问题中很难做到。后来 Freund 和 Schapire提出了 AdaBoost 算法,该算法的效率与 Freund 方法的效率几乎一样,却可以非常容易地应用到实际问题中。AdaBoost 是Boosting 算法家族中代表算法,AdaBoost 主要是在整个训练集上维护一个分布权值向量 D( x) t ,用赋予权重的训练集通过弱分类算法产生分类假设 Ht ( x) ,即基分类器,然后计算他的错误率,用得到的错误率去更新分布权值向量 D( x) t ,对错误分类的样本分配更大的权值,正确分类的样本赋予更小的权值。每次更新后用相同的弱分类算法产生新的分类假设,这些分类假设的序列构成多分类器。对这些多分类器用加权的方法进行联合,最后得到决策结果。这种方法不要求产生的单个分类器有高的识别率,即不要求寻找识别率很高的基分类算法,只要产生的基分类器的识别率大于 015 ,就可作为该多分类器序列中的一员。
        寻找多个识别率不是很高的弱分类算法比寻找一个识别率很高的强分类算法要容易得多,AdaBoost 算法的任务就是完成将容易找到的识别率不高的弱分类算法提升为识别率很高的强分类算法,这也是 AdaBoost 算法的核心指导思想所在

        如果算法完成了这个任务,那么在分类时,只要找到一个比随机猜测略好的弱分类算法,就可以将其提升为强分类算法,而不必直接去找通常情况下很难获得的强分类算法。通过产生多分类器最后联合的方法提升弱分类算法,让他变为强的分类算法,也就是给定一个弱的学习算法和训练集,在训练集的不同子集上,多次调用弱学习算法,最终按加权方式联合多次弱学习算法的预测结果得到最终学习结果。包含以下2点:

样本的权重

        AdaBoost 通过对样本集的操作来训练产生不同的分类器,他是通过更新分布权值向量来改变样本权重的,也 就是提高分错样本的权重,重点对分错样本进行训练。
(1) 没有先验知识的情况下,初始的分布应为等概分布,也就是训练集如果有 n个样本,每个样本的分布概率为1/ n。(2) 每次循环后提高错误样本的分布概率,分错的样本在训练集中所占权重增大,使得下一次循环的基分类器能够集中力量对这些错误样本进行判断。

弱分类器的权重

        最后的强分类器是通过多个基分类器联合得到的,因此在最后联合时各个基分类器所起的作用对联合结果有很大的影响,因为不同基分类器的识别率不同,他的作用就应该不同,这里通过权值体现他的作用,因此识别率越高的基分类器权重越高,识别率越低的基分类器权重越低。权值计算如下: 基分类器的错误率: e = ∑( ht ( x i) ≠yi) Di (1) 基分类器的权重:W t = F( e) ,由基分类器的错误率计算他的权重。2.3 算法流程及伪码描述 算法流程描述 算法流程可用结构图 1 描述,如图 1 所示 AdaBoost重复调用弱学习算法(多轮调用产生多个分类器) ,首轮调用弱学习算法时,按均匀分布从样本集中选取子集作为该次训练集,以后每轮对前一轮训练失败的样本,赋予较大的分布权值( Di 为第i 轮各个样本在样本集中参与训练的概率) ,使其在这一轮训练出现的概率增加,即在后面的训练学习中集中对比较难训练的样本进行学习,从而得到 T个弱的基分类器, h1 , h2 , …, ht ,其中 ht 有相应的权值 w t ,并且其权值大小根据该分类器的效果而定。最后的分类器由生成的多个分类器加权联合产生。

ML相关算法参考

  • 决策树-参考:decision Tree(Python实现)
  • SVM支持向量机-参考:pluskid支持向量机三重境界
  • Adaboost-参考:组合算法-Adaboost
  • Random Forest-参考:随机森林算法
  • 朴素贝叶斯算法-参考:Naive Bayes算法实现
  • 人工神经网络-参考:http://www.cnblogs.com/luxiaoxun/archive/2012/12/10/2811309.html
  • Apriori算法-参考地址:Apriori关联分析
  • K最近邻算法-参考:KNN从原理到实现
  • 梯度树提升GTB算法-参考:Gradient Tree Boosting(或GBRT)
  • K-means聚类-参考:K-means cluster
  • 组合算法总结-参考:Ensemble算法总结
  • EM期望最大算法-参考:EM算法
  • Logistic回归-参考:逻辑回归
  • HMM隐马尔可夫模型,参考:HMM
  • 条件随机场,参考:CRF
  • 随机森林和GBDT,参考:决策树模型组合之随机森林与GBDT
  • 特征选择和特征提取,参考:特征提取与特征选择
  • 梯度下降法,参考:gradient descent
  • 牛顿法,参考:牛顿法
  • 线性判别分析,参考:线性判别
  • 深度学习-深度学习概述:从感知机到深度网络


0 0
原创粉丝点击