第五章:决策树与随机森林
参考资料:李航博士的统计学习方法
Tutorial Slides by Andrew Moore https://www.autonlab.org/_media/tutorials/dtree18.pdf https://www.autonlab.org/tutorials/infogain.html
个人学习笔记,禁止转载
一、简介决策树
用决策树分类,从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点,这时,每一个子结点对应着该特征的一个取值,如此递归的对实例进行测试并分配,直到到达叶子结点,最后将实例分到叶子结点的类中。
决策树特点:1、流行的数据挖掘(data mining)工具 容易理解、实现简单、使用简单、计算量少
2、容易过拟合(剪枝:先剪枝、后剪枝)
3、进行分类:从离散输入(categorical:离散,绝对的,分类的。本身不具有数值意义,如颜色的红绿黄蓝,人为标定的离散值,即符号属性)或者实值输入(real input:连续实数,具有数值意义,如长度),来预测一个分类输出(离散输出)。
决策树与if-then规则:可以将决策树看成一个if-then规则的集合,其过程如下:由决策树的根结点到叶子结点的每一条路径构建一条规则,路径上内部结点的特征对应着规则的条件,而叶子结点的类对应着规则的结论。而叶子结点的类对应着规则的结论,决策树或者对应if-then规则集合具有一个重要的性质:互斥并且完备。也就是说每一个实例都被一条路径或者一条规则所覆盖,而且只被一条路径或者一条规则所覆盖,这里所谓的覆盖是指实例特征与路径上的特征一致或者实例满足规则的条件。
决策树与条件概率分布:决策树也可以表示给定特征条件下类的条件概率分布。
该条件概率分布定义在特征空间的一个划分上,将特征空间划分为互不相交的单元或者区域,并在每一个单元定义一个类的概率分布就构成了一个条件概率分布,决策树的每一条路径对应划分中的一个单元。决策树所表示的条件概率分布由各个单元给定条件下类别的条件概率分布组成。假设X为特征的随机变量,Y表示类别的类别的随机变量,这个条件概率分布可以表示为P(Y|X),X取值域给定划分下单元的集合,Y取值与于类的集合。各叶子结点(单元)上的条件概率往往偏向于某一个类,即属于某一类的概率较大,决策树分类时,将该结点的实例强行分到条件概率大的那一类去。
(即根据从前具备这样的特征,其类别是什么,现在具备的这些特征则最有可能为该类别。给定X条件下,得到最大可能的Y)
补充数据挖掘
数据挖掘(data mining)——维基百科
数据挖掘是一个跨学科的计算机科学分支,是用人工智能、机器学习、统计学和数据库的交叉方法在相对较大型的数据集中发现模式的计算过程。其目标是从大量数据中提取模式和知识,以进一步使用,而不是(挖掘)数据本身。数据挖掘实际工作是对大规模数据进行自动或者半自动的分析(哪些是我们所感兴趣的模式,有哪些仅仅只是一些错觉,如何去发现这些模式),以提取过去的有价值的潜在信息,例如数据的分组(通过聚类分析)、数据的的异常记录(通过异常检测)和数据之间的关系(通过关联式规则挖掘)。
分类
- 一种主要的数据挖掘的操作
- 给出测试样本的一些属性(特征),根据以前掌握的样本属性与类别的关系,对测试样本进行预测
- 应用于分类输出(categorical output)
二、 学习决策树——本质上是从训练数据集中归纳出一组分类规则。
- 决策树是一个测试属性集合的树形结构描述,来预测输出。
类似于流程图的树结构(并不要求是二叉树),由结点(node)和有向边(directed edge)组成。
结点包括1、内部结点(internal node) 表示在一个属性上的测试。
2、叶子结点(leaf node) 代表类或者类分布
有向边即分支,代表一个属性的输出
- 决策树的建立,主要是判定测试属性的先后顺序,应该先测试哪些属性能够更快、更准确的得到分类。(即选择影响类别的决定性属性,则能得到更准确的分类,选择具有良好分类效果的属性,则能更快的达到分类结果。假如选择某一个特征进行分类与随机分类的结果没有很大差别,这样的特征则没有分类能力,即抛弃这样的特征)
- 递归选择最优属性(最优属性的判定法则是什么?不同的法则对应不同的算法)
依据特征对训练数据进行分割,使得各个子数据集有一个最好的分类过程,对应着特征空间的划分,也对应着决策树的构建。最后每一个自己都被分到叶子结点上,即都有明确的类,则生成一棵决策树。
学习决策树的三个步骤(在我看来1和2是在一起的,生成即意味着选择特征)
1、特征选择
2、决策树生成
3、决策树修剪
学习的目标是根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。假设给定训练集D={(x1,y1),……,(xN,yN)}。xi=(x1(1),……xi(n))T为输入实例(特征向量),n为特征数,yi为类别标记,有k个取值,i有N个取值,N表示样本容量。
输入属性的类别:可以是离散的,也可以是连续的
输入为离散时,可以有多个不同的分类,如红绿蓝,也可以为某一个离散属性的判别,是叶子吗?是/否。
输入为连续值时,设法找到一个分离的阈值,把集合分为小于等于和大于两个不相交的部分,正如前面提到的互斥并且完备,此过程也可以看成连续属性离散化。
决策树学习的目标函数(判别决策树的好坏)
我们在通过对训练集进行构造决策树时,可能得到多个决策树,也可能得不到一颗决策树。当得到多颗决策树的时候,选择那一颗呢?我们希望得到的决策树能够适用于训练数据集,同时具备较好的泛化能力,能够对未知数据有很好的预测。
决策树学习的策略是以损失函数为目标函数的最小化。损失函数通常是正则化的极大似然函数。损失函数(记为L(Y,f(X)))度量模型的好坏:用损失函数(loss function)或者代价函数(cost function)度量预测错误的程度。风险函数(期望损失)度量平均意义下模型的好坏。正则化是结构风险最小化策略的实现,是经验风险加上一个正则化项或者罚项。
在确定损失函数之后,学习问题就变为在损失函数意义下选择最优决策树的问题,在所有可能的决策树中选择最后是一个NP完全问题,所以现实中决策树学习算法通常采用启发式方法,近似求解这一最优化问题,这样得到的决策树是次最优的。即通常决策树的算法为递归地选择最优特征,如上面提到的那样。
如果特征数量很多,则在决策树开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征。
由于决策树表示一个条件概率分布,所以深浅不同的决策树对应着不同复杂度的概率模型,决策树的生成对应于模型的局部选择,决策树剪枝(为避免过拟合现象,即只对训练数据有很好的的分类能力,但是对未知数据不太适用。这个时候就需要剪枝,将树变得简单,从而具有更好的泛化能力)对应于模型的全局最优,决策树生成只考了局部最优,相对地,决策树剪枝则考虑全局最优。
三、特征(属性)选择的度量方式
特征选择是决定用哪个特征来划分特征空间,先后不同的特征判定顺序得到不同的决策树。究竟按什么样的特征(属性)顺序能够具有更好的分类能力?
熵(entropy):表示随机变量不确定性的度量(为什么不是确定性的度量呢?熵最好理解为不确定性的量度而不是确定性的量度,因为越随机的信源的熵越大。我还是不太懂??)。熵越大,信息的不确定性就越大(要搞清楚一件非常不确定的事情,或者一无所知的事情,需要了解大量的信息,比较不可能发生的事情,当它发生了,会提供更多的信息)。
另一种理解如下
X为独立随机样本的集合,有若干个不同取值符号,其取值概率pi可能相等,可能不等,其概率分布为P(X=xi)=pi,i取值从1到m,在传送X分布的一系列符号的过程中,平均来说,每一个符号最少使用的位数是多少?
熵越大,分布越接近于等可能,即所有的情况均可能发生,没有办法确定(尽可能大的概率)是什么情况。
熵越小,分布越趋于极端(概率大小差距很大),此时即存在偏向性,即概率大的更可能发生,更容易预测。
条件熵
条件熵表示由于X的存在,类别Y不确定性。
信息增益(information gain):表示得知特征X的信息而使类Y的信息的不确定性减少的程度(同类与特征的互信息)。
特征A对对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差。即g(D,A)=H(D)-H(D|A)。
当熵和条件熵的概率由数据估计,尤其是极大似然估计(给定含有未知参数的模型和样本集的情况下,用来估计模型参数的方法,其思想是找到最佳模型参数,使得模型实现对样本的最大程度拟合,也就是使样本集出现的可能性最大)得到时,所对应的熵与条件熵分别为经验熵和经验条件熵。
决策树学习应用信息增益准侧选择特征,给定训练数据集D和特征A,信息增益表示由于特征A从而使得对数据集D分类的不确定性减少的程度。(换言之,是不是就是由于A的存在,是对D进行分类确定性增加的程度?)显然,对于数据集D来说,信息增益依赖于特征,不同的特征往往具有不同的信息增益,信息增益大的特征具有更强大的分类能力。
信息增益比(information gain ratio)
以信息增益作为划分训练数据集的特征,存在偏向于选择值较多的特征的问题,使用信息增益比可以对这一问题进行校正,这是特征选择的另一个准侧。
特征A对于训练数据集D的信息增益比gR(D,A) 定义为其信息增益g(D,A)与训练数据集D对于特征A的值的熵HA(D)之比:gR(D,A)=g(D,A)/HA(D),
其中,n为特征A取值的个数。
基尼指数
分类问题中,假设有K个类,样本点属于第k类的概率为pk,则概率分布的基尼指数定义为
如果样本D根据特征A是否取某一可能值a被分割成D1和D2两部分,即
则在特征A的条件下,集合D的基尼指数定义为
基尼指数Gini(D)表示集合D不确定性,基尼指数Gini(D,A)表示经A=a,分割后集合D的不确定性,基尼指数数值越大,样本集合的不确定性也就越大,这一点与熵类似。
四、构造决策树的基本算法与对应的剪枝
ID3算法:核心是在决策树各个节点应用信息增益准则选择特征额,递归构建决策树
输入:训练数据集D,特征集A,阈值ε;
输出:决策树T
(1)若D中所有实例属于同一类Ck,则T为单结点树,并且将类Ck作为该结点的类别标记,返回T。
(2)若A=ø,则T为单结点树,并且将D中实例数中最大的类Ck作为该结点的类别标记,返回T。
(3)否则计算A中各特征对D的信息增益,选择信息增益最大的特征Ag。
(4)如果Ag的信息增益小于阈值ε,则置T为单结点树,并将D中实例数量最大的类Ck作为该结点的类标记,返回T。
(5)否则,对Ag的每一可能值ai,根据ai将D分割为若干非空子集Di,将 Di中实例数最大的类作为标记,构建子节点,由结点及子结点构成树T,返回T。
(6)对第i个子结点,以Di为训练集,以A-{Ag}为特征集,递归的调用步骤(1)到步骤(5),得到子树Ti,返回Ti。
信息增益(信息获取量)作为树构造时,选择特征(属性)判断结点的准则,每一次选择最大信息增益属性作为结点,在每一个属性输出后,对于新的分布,重新计算信息增益(所有已经考虑过的属性均不会再出现在后代中),选择属性结点,直到只有一种目标类出现时或者停止条件满足停止。
停止条件:(1)结点上所有赝本属于同一类
(2)没有剩余属性可以用来划分样本,此时,使用多数表决(样本的多数类别来标记)
ID3算法只有树生成过程,所以该算法生成树容易产生过拟合。
C4.5算法
C4.5与ID3算法相似,其在ID3(存在偏向多值属性)上改进,使用信息增益比来选择特征。
输入:训练数据集D,特征集A,阈值ε;
输出:决策树T
(1)若D中所有实例属于同一类Ck,则T为单结点树,并且将类Ck作为该结点的类别标记,返回T。
(2)若A=ø,则T为单结点树,并且将D中实例数中最大的类Ck作为该结点的类别标记,返回T。
(3)否则计算A中各特征对D的信息增益比,选择信息增益比最大的特征Ag。
(4)如果Ag的信息增益比小于阈值ε,则置T为单结点树,并将D中实例数量最大的类Ck作为该结点的类标记,返回T。
(5)否则,对Ag的每一可能值ai,根据ai将D分割为若干非空子集Di,将 Di中实例数最大的类作为标记,构建子节点,由结点及子结点构成树T,返回T。
(6)对第i个子结点,以Di为训练集,以A-{Ag}为特征集,递归的调用步骤(1)到步骤(5),得到子树Ti,返回Ti。
决策树剪枝:过拟合的原因在于学习时,过多的考虑如何提高训练数据的正确分类,从而构建出过于复杂的树,解决这个问题办法是考虑决策树的复杂度,从已生成的决策树进行简化。决策树学习中,将已生成的树,进行简化的过程,称为剪枝(pruning)。
决策树的剪枝往往通过极小化决策树整体的损失函数(loss function)或者代价函数(cost function)来实现,定义损失函数体现模型对训练数据的预测误差,即模型于训练数据的拟合程度,以及模型复杂度两个部分组成,损失函数来调节两者的平衡关系,如何实现剪枝?递归的从树的叶子结点向上回缩,在叶子结点回缩前后,树对应的损失函数,假使失去该结点之后的损失函数更小,则说明剪枝可取,即进行剪枝,使父结点变成新的叶子结点。直到不能继续为止。
CART算法
分类与回归树(classification and regression tree,CART)即可以用于分类也可以用于回归。CART假设决策树是二叉树,内部结点特征取值为“是”和“否”,左分支为“是”,右分支取值为“否”,这样的决策树等价于递归二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是输入给定的情况下输出的条件概率分布。
思想:递归地构建二叉树的过程,对回归树(选择最优的切分变量与切分点)用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选择,生成二叉树。
- CART决策树生成算法
输入:训练数据集D,停止计算条件
输出:CART树
根据训练数据集,递归的对每个结点进行以下操作,构造决策树
(1)设结点的训练数据集为D,计算现有特征对该数据集的基尼指数,,此时,对每一特征A,对其可能取值为a,计算样本点对A=a的测试为“是”或者“否”将D分割为D1和D2两部分,计算A=a的基尼指数。
(2)在所有可能的特征A以及他们所有可能的切分点a中,选择基尼指数最小的特征,以及对应的切分点作为最优特征和最优切分点,依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集分配到两个子结点中去
(3)对两个子结点递归调用(1)(2),直到满足停止条件
(4)生成CART决策树
- CART决策树剪枝算法
输入:CART算法生成的决策树T0
输出:最优决策树Tα
思想:两部分组成,首先从生成的算法产生决策树T0底端开始不断剪枝,知道T0的根结点,形成一个子树序列{T0,……,Tn},然后通过交叉验证法在独立的验证数据集上面对子序列进行测试,从中选择最优子树。
五、随机森林 (Random Forest)(参见维基百科)
随机森林是一个包含多个决策树的分类器,并且输出的类别是由个别树输出的类别的众数决定。
随机森林的优点有:
- 对于很多种资料,它可以产生高准确度的分类器。
- 它可以处理大量的输入变数。
- 它可以在决定类别时,评估变数的重要性。
- 在建造森林时,它可以在内部对于一般化后的误差产生不偏差的估计。
- 它包含一个好方法可以估计遗失的资料,并且,如果有很大一部分的资料遗失,仍可以维持准确度。
- 它提供一个实验方法,可以去侦测variable interactions。
- 对于不平衡的分类资料集来说,它可以平衡误差。
- 它计算各例中的亲近度,对于数据挖掘、侦测离群点(outlier)和将资料视觉化非常有用。
- 使用上述。它可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类。也可侦测偏离者和观看资料。
- 学习过程是很快速的。
以下部分转载来源于http://wsdminglan.lofter.com/post/1cc5c160_3d9471a
当可以生成好决策树后,就比较容易生成随机森林了。下面是随机森林的构造过程:
1. 假如有N个样本,则有放回的随机选择N个样本(每次随机选择一个样本,然后返回继续选择)。这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。
2. 当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
3. 决策树形成过程中每个节点都要按照步骤2来分裂(很容易理解,如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
4. 按照步骤1~3建立大量的决策树,这样就构成了随机森林了。
在建立每一棵决策树的过程中,有两点需要注意 - 采样与完全分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。然后进行列采样,从M个feature中,选择m个(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都一个重要的步骤 - 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。
随机森林有2个参数需要人为控制,一个是森林中树的数量,一般建议取很大。另一个是m的大小,推荐m的值为M的均方根。
随机森林中的树之间是没有关联的。当测试数据进入随机森林时,其实就是让每一颗决策树进行分类,最后取所有决策树中分类结果最多的那类为最终的结果。因此随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。随机森林可以既可以处理属性为离散值的量,比如ID3算法,也可以处理属性为连续值的量,比如C4.5算法。另外,随机森林还可以用来进行无监督学习聚类和异常点检测。