决策树算法.docx
《决策树算法.docx》由会员分享,可在线阅读,更多相关《决策树算法.docx(21页珍藏版)》请在冰豆网上搜索。
决策树算法
决策树算法
1、决策树算法概述
决策树学习是应用的最广的归纳推理算法之一。
它是一种逼近离散值函数的方法,对噪声有很好的健壮性且能够学习析取表达式。
决策树一般都是自上而下的来生成的,并用了贪婪的搜索遍历方法进行遍历。
每个决策或事件(即自然状态)都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵树的枝干,故称决策树。
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。
也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
2、决策树表示法
决策树通过把实例从根节点排列到某个叶子节点来分类实例,叶子节点即为实例所属的分类,树上的每个节点指定了对实例的某个属性的测试,并且每个节点的每一个后继分支对应于该属性的一个可能的值。
分类实例的方法是从这棵树的根节点开始,测试这个节点指定的属性,然后按照给定实例的该属性值对应的树枝向下移动。
然后这个过程在以新的节点为根的子树上重复。
下面给出一棵典型的学习到的决策树。
这棵决策树根据天气情况分类“星期六上午是否适合打网球”。
例如下面的实例将被沿着这棵决策树的最左分支向下排列,因而被判定为反例(也就是这棵树预测这个实例PlayTennis=No)。
图1
通常决策树代表实例属性值约束的合取式(conjunction)的析取式(disjunction)。
从树根到树叶的每一条路径对应一条属性测试的合取,树本身对应这些合取的析取。
如上图表示的决策树对应于以下表达式:
(Outlook=Sunny
Humidity=Normal)
(Outlook=Overcast)
(Outlook=Rain
Wind=Weak)
3、决策树学习的适用问题
决策树学习适用于具有以下特征的问题:
(1)实例是由“属性——值”对表示的:
实例是用一系列固定的属性和它们的值来描述的。
(2)目标函数具有离散的输出值:
如最后的结果是布尔函数的分类。
(3)可能需要析取的描述:
如上例所代表的析取式。
(4)训练数据可以包含错误。
(5)训练数据可以包含缺少属性值的实例。
现实中有很多的实例都可以运用到决策树学习中。
对于这些问题,核心任务都是要把样例分类到各可能的离散值对应的类别(category)中,因此经常被称为分了问题(classificationproblem)。
4、基本的决策树学习算法
大多数以开发的决策树算法是一种核心算法的变体。
该算法采用自顶向下的贪婪搜索遍历可能的决策树空间。
这种方法是ID3(Quinlan1986)和后继的C4.5算法(Quinlan1993)的基础,也是我们应该掌握的重点。
基本的ID3算法通过自顶向下构造决策树来进行学习。
构造过程是从“哪一个属性将在根结点被测试?
”这个问题开始的。
为此我们可以使用统计测试来确定每一个实例属性单独分类训练样例的能力。
分类能力最好的属性被选作树的根节点的测试,然后为根节点属性的每个可能值产生一个分支,并把训练样例排列到适当的分支(也就是该属性值对应的分支)之下。
然后重复整个过程,用每个分支节点关联的训练样例来选取在该节点被测试的最佳属性。
这形成了对合格决策树的贪婪搜索,也就是算法从不回溯重复考虑以前的选择。
下面给出该算法的一个简化版本——专门用来学习布尔值函数(即概念学习)。
ID3(Examples是,Target_attribute,Attributes)
Examples即训练样例集。
Target_attribute是这棵树要预测的目标属性。
Attributes是除目标属性外供学习到的决策树测试的属性列表。
返回一棵能正确分类给定Example的决策树。
·创建树的Root节点
·如果Examples都为正,那么返回label=+的单节点树Root
·如果Examples都为负,那么返回label=-的单节点树Root
·如果Attributes为空,那么返回单节点树Root,label=Examples中最普遍的Target_attribute值
·否则开始
·A<——Attributes中分类能力最好的属性
·Root的决策属性<——A
·对于A的每个可能值vi
·在Root下加一个新的分支对应测试A=vi
·令Examplesvi为Examples中满足A属性值为vi的子集
·如果Examplesvi为空
·在这个新的分支下加一个叶子及节点,节点的label=Examples中最普遍的arget_attribute值
·否则在这个新的分支下接一个子树ID3
(Examplesviarget_attributeAttributes-{A})
·结束
·返回
4.1哪个属性是最佳的分类属性
ID3算法的核心问题是选取在树的每个节点要测试的属性。
又希望选择的是最有助于分类实例的属性。
因而如何衡量属性的价值标准就需要有一个统一的规定。
这里我们定义一个统计属性,称为“信息增益”。
用来衡量给定的属性区分训练样例的能力。
ID3算法在增长树的每一步使用这个信息增益标准从候选属性中选择属性。
4.1.1.用熵度量样例的均一性
信息论中广泛使用的一个度量标准,这里我们可以用来定义信息增益,它就是熵(entrop),它刻画了任意样例集的纯度(purity)。
给定包含关于某个目标概念的正反样例的样例集S,那么S相对这个布尔函数的熵就可以用一个公式来计算:
Entrop(S)=-plog2p-p-log2p-
其中p是在S中的正例的比例,P-是S中反例的比例。
此外还有还定义0log0=0。
如果目标属性具有c个不同的值,那么s相对于c个状态(c-wise)的分类熵定义为:
Entrop(S)=
ilog2pi
其中pI是S中属于类别i的比例。
4.1.2.用信息增益度量期望的熵降低
有了熵作为衡量训练样例集合纯度的标准,就可以定义属性分类训练数据的能力的度量标准。
这个标准就是“信息增益”(informationgain)。
简单的说一个信息增益就是由于使用这个属性分割样例而导致的期望熵降低。
更精确的说,一个属性A相对训练样例集合S的信息增益Gain(S,A)被定义为:
Gain(S,A)=Entropy(S)-
其中Values(A)是属性A所有可能值的集合。
Sv是S中属性A的值为v的子集(也就是,Sv={s
S|A(s)=v})。
信息增益正式ID3算法增长树的每一步中选择最佳属性的度量标准。
4.2举例
为了演示ID3算法的具体操作,我们考虑以下表的训练数据所代表的学习任务。
目标属性PlayTennis对于不同的星期六上午具有yes和no两个值,我们将根据其他属性来预测这个目标属性值。
先考虑这个算法的第一步,创建决策树的最顶端结点。
ID3算法计算每一个候选属性的信息增益,然后选择信息增益最高的一个。
所有四个属性的信息增益为:
Gain(S,Outlook)=0.246
Gain(S,Humidity)=0.151
Gain(S,Wind)=0.048
Gain(S,Temperature)=0.029
S来自下表的训练样例的集合
目标概念PlayTennis的训练样例
DayOutlookTemperatureHumidityWindPlayTennis
D1SunnyHotHighWeakNo
D2SunnyHotHighStrongNo
D3OvercastHotHighWeakYes
D4RainMildHighWeakYes
D5RainCoolNormalWeakYes
D6RainCoolNormalStrongNo
D7OvercastCoolNormalStrongYes
D8SunnyMildHighWeakNo
D9SunnyCoolNormalWeakYes
D10RainMildNormalWeakYes
D11SunnyMildNormalStrongYes
D12OvercastMildHighStrongYes
D13OvercastHotNormalWeakYes
D14RainMildHighStrongNo
根据信息增益标准,Outlook被选作根结点的决策属性,并为它的每一个可能值在根结点下创建分支。
得到的部分决策树显示在下图中,同时还有被排列到每个新的后继结点的训练样例。
因为每一个Outlook=Overcast的样例也都是PlayTennis的正例,所以树的这个结点称为一个叶子结点,它对目标属性的分类是PlayTennis=Yes。
相反,对应Outlook=Sunny和Outlook=Rain的后继结点还有非0的熵,所以决策树还会在这些结点下进一步展开。
图2ID3算法第一步后形成的部分决策树
对于非终端的后继结点,再重复前面的过程选择一个新的属性来分割训练样例,这一次使用与这个结点关联的训练样例。
已经被树的较高结点测试的属性被排除在外,以便任何给定的属性在树的任意路径上最多仅出现一次。
对于每一个新的叶子结点继续这个过程,知道满足一下两个条件中的任意一个:
(1)所有的属性已经被这条路径包括;
(2)与这个结点关联的所有训练样例都具有相同的目标属性(也就是它们的熵为0)。
5、决策树学习中的假设空间搜索
ID3算法可以被描述为从一个假设空间中搜索一个拟合训练样例的假设,被ID3算法搜索的假设空间就是可能的决策树的集合。
ID3算法以一种从简单到复杂的爬山算法遍历这个假设空间,从空的树开始,然后逐步考虑更加复杂的假设,目的是搜索到一个正确分类训练数据的决策树。
引导这种爬山搜索的评估函数是信息增益度量。
下图描述了这种搜索。
图3ID3搜索的假设空间
通过观察ID3算法的搜索空间和搜索策略,我们可以深入认识这个算法的优势和不足。
(1)ID3算法中的假设空间包含所有的决策树,它是关于现有属性的有限离散值函数的一个完整空间。
因为每个有限离散值函数可被表示为某个决策树,所以ID3算法避免了搜索不完整假设空间的一个主要风险:
假设空间可能不包含目标函数。
(2)当遍历决策树空间的时候,ID3仅维护单一的当前假设,所以它失去了表示所以一致假设所带来的优势。
例如它不能判断有多少个其他的决策树也是与现有的训练数据一致,或者使用新的实例查询来最优地区分这些竞争假设。
(3)基本的ID3算法在搜索中不进行回溯。
每当在树的某一层次选择了一个属性进行测试,它不会再回溯重新考虑这个选择。
所以它易受无回溯的爬山搜索中的常见风险影响:
收敛到局部最优的答案,而不是全局最优的。
对于ID3算法,一个局部最优的答案对应着它在一条搜索路径上搜索的选择的决策树。
然而这个局部最优的答案可能不如沿着另一条分支搜索到的更令人满意。
(4)ID3算法在搜索的每一步都使用当前的所有训练样例,以统计为基础决定怎么样精化当前的假设。
这与那些基于单独的训练样例递增作出决定的方法不同。
使用所有样例的统计属性的一个优点是大大降低了对个别训练样例错误的敏感性,因此,通过修改ID3算法的终止准则以接受不完全拟合训练数据的假设,它可以被很容易地扩展到处理含有噪声的训练数据。
6、决策树学习的归纳偏置
首先对归纳偏置进行定义:
考虑对于实例集合X的概念学习算法L。
令c为X上定义的任一概念,并令Dc={}为c的任意训练样例集合。
令L(xi,Dc)表示经过数据DC的训练后L赋予实例xi的分类。
L的归纳偏置是最小集合B,它使任意目标概念c和相应的训练样例Dc满足:
(
xi
X)[(B
Dc
xi)L(xi,Dc)]
这里的记号yz表示z从y演绎派生(followdeductively,或z可以由y证明得出)。
如果给定一个训练样例的集合,那么通常有很多决策树与这些样例一致。
所以要描述ID3算法的归纳偏置,应该找到它从所以一致的假设中选择一个的根据。
ID3会选择在使用简单到复杂的爬山算法遍历可能的树空间遇到的第一个可接受的树。
概略的讲,ID3的搜索策略为:
(a)优先选择较短的树而不是较长的;(b)选择那些信息增益高的属性离根结点较劲的树。
在ID3中使用的选择属性的启发式规则和它遇到的特定训练样例之间存在着微妙的相互作用,由于这一点,很难准确的划出ID3的归纳偏置。
然而我们可以近似的把它的归纳偏置描述为一种对短的决策树的偏好。
近似的ID3算法归纳偏置:
较短的树比较长的树优先。
我们也可以想象一个类似于ID3的算法,它精确的具有这种归纳偏置:
它从一个空的树开始广度优先(breadthfirst)搜索逐渐复杂的树,先考虑所有深度为1的树,然后所有深度为2的树,......一旦它找到了一个与训练样例一致的决策树,它返回搜索深度最小的一致树(例如,具有最少结点的树)。
我们可以称这种广度优先(breadthfirst)算法为BFS-ID3。
BFS-ID3寻找最短的决策树,因此精确地具有“较短的树比较长的树优先”的偏置。
ID3可以被看作是BFS-ID3的一个有效近似,它使用一种贪婪的启发式搜索企图发现最短的树,而不是进行完整广度优先搜索来遍历假设空间。
因为ID3使用信息增益启发式规则和“爬山”策略,它包含比BFS-ID3更复杂的偏置。
尤其是,它并非总是找最短的一致树,而是倾向于那些信息增益高的属性更靠近根结点的树。
ID3归纳偏置更贴切近似:
较短的树比较长的树优先。
那些信息增益高的属性更靠近根结点的树优先。
7、决策树学习的常见问题
决策树学习的实际问题包括:
确定决策树增长的深度;处理连续值的属性;选择一个适当的属性筛选度量标准;处理不同代价的属性;提高计算效率。
7.1避免过度拟合数据
在前面我们给出的描述专门用来学习布尔值函数的算法增长树的每一个分支的深度,直到恰好能对训练样例完美地分类。
然而这个策略并非总行得通。
事实上,当数据中有噪声或训练样例的数量太少以至于不能产生目标函数的有代表性的采样时,这个策略便会遇到困难。
在以上任何一种情况发生时,这个简单的算法产生的树会过度拟合训练样例。
过度拟合定义:
给定一个假设空间H,一个假设h
H,如果存在其他的假设h'
H,使得在训练样例上h的错误率比h'小,但在整个实例分布上h'的错误率比h小,那么就说h过度拟合训练数据。
图4画出了在决策树学习的一个典型应用中过度拟合的影响。
在这个例子中,ID3算法用来学习哪个病人患有某种糖尿病。
这幅图的横轴表示在决策树创建过程中树的结点总数,纵轴表示决策树作出的预测的精度。
实线显示决策树在训练样例上的精度,虚线显示在一套独立的测试样例(没有被包括在训练样例中)上测量出的精度。
可以看到,随着树的增长,在训练样例上的精度是单调上升的。
然而,在独立的测试样例上测出的精度先上升后下降。
如图所示,当数超过大约25个结点时,对树的进一步精化尽管可以提高它在训练数据上的精度,却降低了它在测试样例上的精度。
图4决策树学习中的过度拟合
对于导致树h比h'更好的拟合训练样例,但对于后来的实例却表现更差的原因,一种可能的情况是训练样例中含有随机错误或噪声。
过度拟合对于决策树学习和其他很多学习算法是一个重要的实践难题。
例如,在一次关于ID3算法的实验研究中(Minger1989b),对于设计5种带有噪声和不确定数据的不同研究中,人们发现在多数问题中过度拟合使决策树的精度降低了10%~25%。
有几种途径可以用来避免决策树学习中的过度拟合。
它们可被分成两类:
(1)及时停止树增长,在ID3算法完美分类训练数据之前就停止树增长。
(2)后修剪法,即允许树过度拟合数据,然后对这个树进行后修剪。
第二种方法被证明在实践中更成功。
这是因为在第一种方法中精确地估计何时停止树增长很困难。
这两个方法的一个共同的关键问题是使用什么样的准则来确定最终正确树的规模。
解决这个问题的方法包括:
(1)使用与训练样例截然不同的一套分离的样例,来评估通过后修剪方法从树上修剪结点的效用。
(2)使用所有可用数据进行训练,但进行统计测试来估计扩展(或修剪)一个特定的结点是否有可能改善在训练集合外的实例上的性能。
(3)仅用一个明确的标准来衡量训练样例和决策树的复杂度,当这个编码的长度最小时停止增长。
这个方法基于一种启发式规则,被称为最小描述长度(MinimumDescriptionLength)的准则。
第一种方法是最普通的,它被称为训练和验证集(trainingandvalidationset)法。
现在我们讨论这种方法的两个主要变种。
这种方法中,可用的数据被分成两个样例集合:
一个训练集合用来形成学习到的假设,一个分离的验证集合用来评估这个假设在后续上的精度,确切的说是用来评估修剪这个假设的影响。
这个方法的动机是:
即使学习器可能会被训练集合中的随机错误和巧合规律性所误导,但验证集合不大可能表现出同样的随机波动。
所以验证集合可以用来对过度拟合训练集中的虚假特征提供防护检验。
当然很重要的一点是验证集合应该足够大,以便它本身可提供具有统计意义的实例样本。
一种常见的做法是取出可用样例的三分之一用作验证集合,用另外三分之二做训练集合。
7.1.1错误率降低修剪
使用验证集合来防止过度拟合的一个确切方法是一种称为“错误率降低修剪”(reducederrorpruning)的方法(quinlan1987)。
这种方法考虑将树上的每一个结点作为修剪的候选对象。
修剪一个结点由以下步骤组成:
删除以此结点为根的子树;使它成为叶子结点;把和该结点关联的训练样例的最常见分类赋给它。
仅当修剪后的树对于验证集合的性能不比原来的树差时才删除该结点。
这样便使因为训练集合的巧合规律性而加入的结点很可能被删除,因为同样的巧合不大会发生在验证集合中。
反复的修剪结点,每次总是选取那些删除后可以最大提高决策树在验证集合上的精度的结点。
继续修剪结点直到进一步的修剪时有害的为止(也就是降低了再验证集合上的精度)。
“错误率降低修剪“决策树精度的影响可以在图5中看到。
它和图4同样显示了在训练样例和测试样例上的决策树精度。
其中的另外一条线显示的是随着树的修剪,它在测试样例上的精度变化。
当修剪开始时,树的规模最大,并且它在测试样例上的精度最小。
随着修剪的进行,结点的数量下降,但在测试集合上的精度上升。
这里可供使用的数据已经被分成3个子集:
训练样例、供修剪树用的验证样例和一个测试样例的集合。
测试样例用来提供在未见实例上的精度的无偏估计。
图中显示了再训练集和测试集上的精度。
在用作修剪的验证集合上的精度没有画出来。
图5决策树学习中错误率降低修剪的效果
如果有大量的数据可供使用,那么使用分离的数据集合来引导修剪是一个有效的方法。
这个方法的主要缺点是当数据有限时,从中保留一部分用作验证集合进一步减少了训练可以使用的样例。
7.1.2规则后修剪
实践中,一种用来发现高精度假设的非常成功的方法为“规则后修剪”(rulepost-pruning)。
规则后修剪包括下面的步骤:
(1)从训练集合推导出决策树,增长决策树直到尽可能好的拟合训练数据,允许过度拟合发生。
(2)将决策树转化为等价的规则集合,方法是为从根结点到叶子结点的每一条路径创建一条规则。
(3)通过删除任何能导致估计精度提高的前件(preconditions)来修剪(泛化)每一条规则。
(4)按照修剪过的规则的估计精度对他们进行排序,并按这样的顺序应用这些规则来分类后来的实例。
为了演示以上过程,我们再来看图1中的决策树。
在“规则后修剪”算法中,为树中的每个叶子结点产生一条规则。
从根结点到叶子结点路径上的每一个属性的测试被称为一个规则的先行词(即前件),叶子结点的分类称为规则的结论(即后件)。
例如图1中树的最左一条路径被转换成规则:
IF(Outlook=Sunny)
(Humidity=High)
THENPlayTennis=No
接下来通过删除不会降低估计精度的先行词来修剪每一个规则。
例如对于上面的规则,规则后修剪算法会考虑删除先行词(Outlook=Sunny)和(Humidity=High)。
它会选择这些修剪步骤中使估计精度有最大提升的步骤,然后考虑修改第二个前件作为进一步的修剪步骤。
如果某个修剪步骤降低了估计精度,那么这个步骤不会被执行。
7.2合并连续值属性
我们最初的ID3定义被限制为取离散值的属性。
首先,学习到的决策树要预测的目标属性必须是离散的。
其次,树的决策结点的属性也必须是离散的。
可以简单地删除第二个限制,以便把连续值的决策属性加入到决策树中。
这可以通过动态的定义新的离散值属性来实现,即先把连续值属性的值域分割为离散的区间集合。
例如,对于连续值的属性A,算法可动态的创建一个新的布尔属性Ac,如果A唯一的问题是如何选取最佳的阈值c。
举例来说,假定我们希望在4.2中的表的学习任务中包含连续值的属性Temperature来描述训练样例。
对于与决策树的特定结点关联的训练样例,进一步假定其属性Temperature和目标属性PlayTennis的值如下:
Temperature:
404860728090
PlayTennis:
NoNoYesYesYesNo
对属性Temperature,应该定义什么样的基于阈值的布尔属性呢?
我们无疑会选择产生最大信息增益的阈值c。
首先按照连续属性A排序样例,然后确定目标分类不同的相邻实例,于是我们可以产生一组候选阈值,它们的值是相应的A值之间的中间值。
可以证明产生最大信息增益的c值必定位于这样的边界中(Fayyad1991)。
然后可以通过计算与每个候选阈值关联的信息增益评估这些候选值。
在当前的例子中,有两个候选阈值,它们对应于目标属性PlayTennis变化时属性Temperature的值:
(48+60)/2和(80+90)/2。
然后计算每一个候选属性——Temperature﹥54和Temperature﹥85的信息增益,并选择最好的(Temperature﹥54)。
现在这个动态创建的布尔属性便可以和其他候选的离散值属性一同“竞争”,以用于增长决策树。
Fayyad&Irani(1993)讨论了这种方法的一个扩展,即把连续的属性分割成多个区间,而不是基于单一阈值的两个区间。
Utgoff&Brodley(1991)和Murthyetal.(1994)讨论了通过对几个连续值属性的线性组合定义阈值参数的方法。
7.3属性选择的其他度量标准
信息增益量存在一个内在偏置,它偏袒具有较多值的属性。
举一个极端的例子,考虑属性Date,它有大量的可能值(例如,March4,1979)。
要是我们把这个属性加到表3-2的数据中,它在所有值中有最大的信息增益。
这是因为单独Date就可以完全预测训练数据的目标属性。
于是这个属性会被选做树的根结点的决策属性并形成一棵深度为一级但却非常宽的树,这棵树可以理想的分类训练数据。
当然,这个决策树对于后来数据的性能会相当差,因为尽管它完美的分割了训练数据,但它不是一个好的预测值(predictor)。
属性Date出了什么问题呢?
简单地讲,是因为太多的可能值必然把训练样例分割成非常差的目标函数预测器。
避免这