主要内容:


4 集成学习(下)

4.1决策树

    4.1.1  CART模型(见上讲)  

    4.1.2  特征选择

    4.1.3  树的生成

    4.1.4  模型选择

4.2 随机森林

    4.2.1 Randomized Decision Trees

    4.2.2 Random Forests

    4.2.3 Extremely Randomized trees

    4.2.4 Ferns


本讲知识体系图

随机森林和决策树曲线 决策树随机森林和adaboost_信息增益


4 集成学习(下)

4.1决策树  

4.1.1  CART模型(见上讲)

 

分类与回归的区别:分类构建的决策树的叶子结点是一个类别,叶子结点中哪个类别的训练样本数量最多,叶子结点的类别就取这个类别(由于剪枝早停等优化,叶子结点不一定纯,该方法即最大后验概率[MAP])。而回归的叶子结点是一个值,与目标取值集合是类别的分类问题不同的是,回归的目标取值集合是一个数值区间,对于一个叶子结点有一个相对训练样本固定的输出值,这个值通常取叶子结点中包含的所有训练样本的均值。特别的,回归在树划分的时候选取的准则是特有的方差度量。

 

4.1.2  特征选择

 

上一讲通过讲解CART框架介绍了决策树的一般结构(除了CART外,还有ID3,C4.5,C5.0等经典决策树算法),即{ if -then } 询问式分支结构,通过这样一层一层的条件约束,最终可以将满足相同或类似条件的目标划为一类(回归问题类似)。因此,当我们用已知类别的数据分析挖掘得到这样的一个模型结构后,理所当然地就可以用这个模型来预测一个未知对象的类别。事实上只要训练集数据不自相矛盾,决策树可以做到100%的将训练集划分正确,但是这样生成的一棵决策树过于复杂,不仅仅不利于实现使用,还有过拟合的问题。如何构造一颗优美简洁的决策树呢?按照常理,决策树每次划分使得划分出来的类越纯就越容易几下划分完,自然构造出的决策树越好,因此,特征选择,即每一步划分时选择哪个属性进行划分,选择的依据是什么正是解决这个问题的关键。

定义每个阶段的划分纯不纯,从上个阶段到以某个属性划分后的下个阶段纯度增加得多还是少,这里列举三种常用准则(另外还有卡方检验等):信息增益/信息增益率(分类),基尼增益(分类),方差度量(回归)。

 

(1)信息增益/信息增益率

该准则基于熵,熵的定义为

随机森林和决策树曲线 决策树随机森林和adaboost_随机森林和决策树曲线_02

 

其中,N为一个集合中类别总数, Pi为第i类在该集合中所占有的概率。

对于一个样本数量为D,类别总数量为N的集合D,该集合的熵定义为

随机森林和决策树曲线 决策树随机森林和adaboost_结点_03

此时若将该集合以某个属性A划分一次,得到两个样本数量分别为 C1和 C2的集合,则划分后的总熵为

随机森林和决策树曲线 决策树随机森林和adaboost_信息增益_04

即两个集合各自求本集合的熵,再计算加权平均和作为整个的熵,对于多分类,也是同理进行加权平均。那么,信息增益定义如下

随机森林和决策树曲线 决策树随机森林和adaboost_随机森林和决策树曲线_05

由于熵随着分支的进行应该越来越小,因此以某个属性进行划分,其信息增益越大代表该属性的划分能力越强。但是用信息增益的方式选择,存在偏向于选择取值比较多的特征的问题,因此便出现了信息增益率来作为一种补偿方案。

信息增益率的定义为

随机森林和决策树曲线 决策树随机森林和adaboost_随机森林和决策树曲线_06

其中分母是D集合针对每个划分的熵,而不是每个划分针对类别的熵的加权平均。对于上述划分后分为两个集合的情况,K取2即可。很明显,划分的集合越少,划分熵即分母就越小,这样信息增益率就越大,这样选择属性就倾向属性值比较少的了。

注意,使用熵准则的都是多叉树,故有必要考虑属性值的取值多少,而使用的是二叉树,并且采用的准则是下面要说的基尼指数的CART框架,就不再需要考虑这样的问题了。

(2) 基尼(Gini)增益

该准则基于基尼指数,基尼指数定义为

随机森林和决策树曲线 决策树随机森林和adaboost_结点_07

其中,N为一个集合中类别总数, Pi为第i类在该集合中所占有的概率。

对于一个样本数量为D,类别总数量为N的集合D,该集合的熵定义为

随机森林和决策树曲线 决策树随机森林和adaboost_信息增益_08

此时若将该集合以某个属性A划分一次,得到两个样本数量分别为 C1和 C2的集合,则划分后的总基尼指数为

随机森林和决策树曲线 决策树随机森林和adaboost_决策树_09

基尼增益的计算以及多分类的处理方式和信息增益类似,不再一一细说。

(3) 方差

利用方差定义数据之间的关系时显然有,方差越小,数据之间的关系越紧密,即这些数据之间相似度高。方差度量准则表达式为

随机森林和决策树曲线 决策树随机森林和adaboost_结点_10

即每次划分要使划分的两类的均方差各自达到最小且两者的和也要最小。

 

【补充】:交叉熵,联合熵,条件熵,相对熵,互信息

以下皆为离散变量表达式,对于连续变量表达式,可用离散表示式推导出期望表达方法(将log作为函数,利用函数的分布知识,易推),由于期望表达式可以展开为连加形式的离散变量期望,那么将期望表达式类似地展开为积分形式的连续变量期望,就可得到连续变量如下一些相应的公式。

 

(1)上面已经给出熵的定义,对于p分布,有

随机森林和决策树曲线 决策树随机森林和adaboost_决策树_11

当变量为单变量X时,该式亦写为H(X),此时 Pi为变量X各个取值的概率,N写为 Nx。

(2)对于p,q两个分布, 交叉熵的定义为

随机森林和决策树曲线 决策树随机森林和adaboost_信息增益_12

(3)联合熵的定义为

随机森林和决策树曲线 决策树随机森林和adaboost_结点_13

(4)条件熵的定义为

随机森林和决策树曲线 决策树随机森林和adaboost_结点_14

即Y各个取值下对X的边缘概率的熵的加权平均。

对于联合熵和条件熵有如下关系

随机森林和决策树曲线 决策树随机森林和adaboost_信息增益_15

(5)相对熵(Kullack-Leibler距离,也叫KL散度),用来度量两个分布之间的距离,它的定义为

随机森林和决策树曲线 决策树随机森林和adaboost_决策树_16

相对熵是度量分布而不是变量之间的关系。

相对熵和交叉熵有如下关系

随机森林和决策树曲线 决策树随机森林和adaboost_随机森林和决策树曲线_17

(6)互信息的定义为

随机森林和决策树曲线 决策树随机森林和adaboost_信息增益_18

可以看到,当X和Y相互独立时,log后的分数值为1,则互信息为0。实际应用中,对于数据的各个维度之间,希望相互独立,即去除相关性,即要让维度之间的互信息尽量小。对于模型的输入输出之间,输出值是什么取决于输入本身是一个模型得以建立的前提,因此模型要好,输出值与输入值之间的互信息要大。

 

互信息和熵有如下关系

随机森林和决策树曲线 决策树随机森林和adaboost_随机森林和决策树曲线_19

4.1.3  树的生成

特征选择可以使树更简洁,自然是树的生成中必不可少的一环。那么还有哪些其他值得考虑的因素?

 

(1)选择二叉树还是多叉树?

 

最常见的决策树模型ID3是多叉树,即属性有几类取值就分为几叉,但二叉树更简单,CART模型就是采用的二叉树,实际上任何多叉树都可以转化为二叉树,即对于多余两个取值的属性,通过yes/no询问,一次只划分出某类和非某类两类,然后继续对非某类进行更细致的划分。

随机森林和决策树曲线 决策树随机森林和adaboost_结点_20

(2)属性具体怎么选择?

 

不纯度准则选择上,分类和回归各有特有准则,由于回归通常就用方差度量,这里对比一下分类问题使用的熵、基尼指数和基本的误分类不纯度(分类误差率)之间的关系。

随机森林和决策树曲线 决策树随机森林和adaboost_结点_21

不纯度比较图(引用 参考文献[1])

其中,误分类不纯度的定义为

随机森林和决策树曲线 决策树随机森林和adaboost_随机森林和决策树曲线_22

熵不纯度的一半的定义为

随机森林和决策树曲线 决策树随机森林和adaboost_结点_23

基尼指数不纯度定义为

随机森林和决策树曲线 决策树随机森林和adaboost_决策树_24

对于上图中所画,取了j=2,即只有两类。可以看到,熵之半和基尼指数两个不纯度的曲线差不多,而基尼指数相比熵可以省去比较耗费计算时间的log对数,以此达到一种优化。另外熵更倾向于处理离散属性,而基尼指数更倾向于处理连续属性。

 

属性值为标称时,即固定的几个类别,则只需要遍历所有属性值,就知道该属性的所有类别。示例中年龄有三个类别,一目了然。

 

随机森林和决策树曲线 决策树随机森林和adaboost_结点_25

属性值为实数值时,对于该属性的类别,并不明显,此时一种解决方法是,先对该属性已经出现的值进行排序,然后在标签发生变化的地方进行切分。示例中体重是实数值,将训练样本中的体重值排序,注意该示例中目标分类(标签)为蓝色和红色两类,因此对排序序列从左向右看,在目标分类发生变化处切分,使同类的直接切到一个判断区间,这样在针对该属性进行划分时能尽可能的减少分支。

 

随机森林和决策树曲线 决策树随机森林和adaboost_结点_26

 

采用单属性还是多属性进行划分,即每次划分时判断是只考虑一个属性,还是同时考虑多个属性。对于如下图所示的训练数据分布,左边为单属性划分,右边为双属性划分,显然,双属性更加自然合理。但是多属性同时考虑效率并不高,现在换个角度看数据分布,有这样的分布,说明其x,y两个维度直接存在纠缠关系,一次仅仅用一个属性(直线y=k,或x=k)根本分不开,此时如果旋转坐标系(斜着看)去相关性,又可以通过单属性进行划分了。也就说,需要用多属性同时进行划分的,可以对数据进行一定的映射变换去相关性,再用单属性进行划分,但是不管是去相关性还是直接多属性划分,没有绝对的谁更容易。

 

随机森林和决策树曲线 决策树随机森林和adaboost_信息增益_27

(3)怎么处理叶子结点?

 

由于噪声的影响,把所有的数据都分类正确的树不一定是一棵好树,如下图所示,随着决策树越来越复杂,对训练集是越来越准确,但是泛化能力又变差了。

 

随机森林和决策树曲线 决策树随机森林和adaboost_结点_28

解决这样的问题,可以加入树分裂停止准则和剪枝进行优化。前者即预剪枝,后者即后剪枝。

 

预剪枝:树分裂时就实施措施。

    1 当树的深度达到预先设定的阈值停止当前分支的分裂;

    2 当分完之后,支持的数据变少。

 

后剪枝:树建好以后,删除掉一些无用的分支,即删除该分支有或无对测试结果没太大的影响的分支。

    1 降低错误剪枝 REP(Reduced Error Pruning);

    2 悲观错误剪枝 PEP(Pessimistic  Error Pruning);

    3 基于错误剪枝 EBP(Error-based Pruning);

    4 代价-复杂度剪枝 CCP(Cost-complexity Pruning);

    5 最小错误剪枝  MEP(Minimum Error Pruning)。

 

(4)怎么处理属性值丢失结点?

随便法:缺失了就不看,或者随机取一个值代替缺失值。

代理结点法:缺失的属性在测试阶段用其他的属性代替。

 

随机森林和决策树曲线 决策树随机森林和adaboost_结点_29

4.1.4  模型选择

  有四种经典算法模型:

(1)CART:支持分类和回归,分类采用基尼指数,回归使用方差度量,二叉树,支持连续值处理,支持缺失值处理,利用独立的验证数据集进行剪枝。

(2)ID3:仅分类,采用信息增益准则,多叉树,其他不支持。

(3)C4.5:仅分类,采用信息增益率准则,多叉树,支持连续值处理,支持缺失值处理,利用基于错误剪枝方法进行剪枝。

(4)C5.0:在C4.5基础上加入了Boosting技术,速度更快,内存使用更加有效,能生成更小的决策树,但算法细节并没有公开太多,属于商业机密。


4.2 随机森林

随机森林最基本的思想为,在训练阶段树的生成过程中,指定随机部分,随机的生成一颗决策树,通过重复这样的过程,随机生成若干决策树组成森林,然后在预测的时候,综合所有决策树的判断结果得到最终预测结果。随机度越高,树的相关性越低,综合考虑结果的效果就越好。综合结果有加法模型和乘法模型,其中乘法模型有一个痛点就是如果其中某棵树预测值为0,那么整个结果就变为了0。以下几种随机森林粗略描述,细节见参考文献。

 

4.2.1 Randomized Decision Trees

 

每次随机为随机挑选几个属性。

特点:

1.不再寻找全局最优的分裂节点,随机分裂节点,训练更快,使用更简单的二值特征测试;

2.选择一个包含k个属性的集合,从中依据某个准则函数来挑选最优的分裂节点,比如,最大化信息增益;

3.随机树的效果不如决策树,通过构建多棵树来弥补;

4.各棵树的投票结果求平均。

应用:

1.OCR;

2.手写体识别;

3.人脸识别。

 

4.2.2 Random Forests

 

每次随机挑选样本,又随机挑选属性。随机性更大。

 

算法过程:

1. 有放回的随机选择N个样本;

2. 随机从M个属性中选取出m个属性 (m << M, m=sqrt(M) ), 依据某种策    略(比如说信息增益)来选择一个属性作为分裂节点;

3. 按照2,构建一颗决策 树 ;

4. 按照步骤1~3建立大量的决策树,组成 随机森林。

优点:

1.比较适合做多分类问题;

2.训练和预测速度快;能够有效地处理大的数据集;容易并行化。

3.数据集中有大比例的数据缺失时仍然可以保持精度不变;

4.能够检测到特征之间的相互影响以及重要性程度;

5.不易出现过度拟合。

应用:

1.Kinect上的姿态估计;

2.Hough Forest for object detection;

3.人脸关键点标定。

 

4.2.3 Extremely Randomized trees

 

算法过程:

1.随机选择k个属性值,计算出属性值的最小值和最大值

2.在[min,max]区间上随机生成k个切分点

3.选择score最好的切分点

与Random Forests的不同点:

1.无bootstrap,使用全部的训练样本;

2.在选择节点的分裂位置时,随机。

 

4.2.4 Ferns

算法:

ET上各层上的节点都一样

随机森林和决策树曲线 决策树随机森林和adaboost_决策树_30

每个节点想象为一个特征

其输出值为0或者1,表示该特征有无出现

在图像块中,可以比较两个象素点值的大小

随机森林和决策树曲线 决策树随机森林和adaboost_决策树_31

随机森林和决策树曲线 决策树随机森林和adaboost_决策树_32

应用:

1. 3D object detection

2.SLAM

 

Reference

[1]刘建平.决策树算法原理(下).

[2] Amit, Yali, and Donald Geman. "Shape quantization and recognition with randomized trees." Neural computation 9.7 (1997): 1545-1588.

[3] 李航. "统计学习方法." 清华大学出版社, 北京 (2012).

[4] Lepetit, Vincent, and Pascal Fua. "Keypoint recognition using randomized trees." IEEE transactions on pattern analysis and machine intelligence 28.9 (2006): 1465-1479.

[5] Breiman, Leo. "Random forests." Machine learning 45.1 (2001): 5-32.

[6] Ozuysal, Mustafa, et al. "Fast keypoint recognition using random ferns." IEEE transactions on pattern analysis and machine intelligence 32.3 (2010): 448-461.

[7] Wagner, Daniel, et al. "Pose tracking from natural features on mobile phones." Proceedings of the 7th IEEE/ACM International Symposium on Mixed and Augmented Reality. IEEE Computer Society, 2008.