机器学习算法之:决策树
作者:jmz (360电商技术)
1 概览
决策树学习是一种逼近离散值目标函数的方法,在这样的方法中学习到的函数被表示为一棵决策树:
1) 学习析取表达式,能再被表示为多个if-then的规则,以提高可读性。
2) 对噪声数据有非常好的适应性。--统计特性
3) 决策树学习方法搜索完整表示的如果空间(一个有效的观点是机器学习问题常常归结于搜索问题。即对非常大的如果空间进行搜索、已确定最佳拟合到观察到的数据),从而避免了受限如果空间的不足。决策树学习的归纳偏置(有兴趣參考“归纳偏置”,“奥坎姆剃刀问题”相关问题更详细的描写叙述)是优先选择较小的树。
2 决策树表示
决策树通过把实例从根结点排列(怎样选择排列次序是决策树算法的核心)到某个叶子结点来分类实例,叶子结点即为实例所属的分类。树上的每个结点指定了对实例的某个属性的測试。而且该结点的每个后继分支相应于该属性的一个可能值。
如。一颗依据天气情况推断是否參加打网球的决策树例如以下:
比如,下面的实例:<Outlook=Sunny,Temperature=Hot,Humidity=High,Wind=Strong>将被沿着这棵决策树的最左分支向下排列,因而被评定为反例(也就是这棵树预測PlayTennis=No) 。
通常决策树代表实例属性值约束的合取(conjunction)的析取式(disjunction)。从树根到树叶的每一条路径相应一组属性測试的合取,树本身相应这些合取的析取,该决策树相应于下面表达式:
(Outlook=Sunny ٨Humidity=Normal)
٧(Outlook=Overcast)
٧(Outlook=Rain٨ Wind=Weak)
3 适用场景
不同的决策树学习算法可能有这样或那样的不太一致的能力和要求。但依据以上分析描写叙述不难看出、决策树学习最适合具有下面特征的问题:
1) 实例是由“属性-值”对(pair)表示的。最简单的决策树学习中,每个属性取少数的分离的值(比如,Hot、Mild、Cold)。
2) 目标函数具有离散的输出值。
3) 可能须要析取的描写叙述,如上面指出的,决策树非常自然地代表了析取表达式。
4) 训练数据能够包括错误。决策树学习对错误有非常好的适应性,不管是训练例子所属的分类错误还是描写叙述这些例子的属性值错误。
5) 训练数据能够包括缺少属性值的实例。
已经发现非常多实际的问题符合这些特征,所以决策树学习已经被应用到非常多问题中。比如依据疾病分类患者;依据起因分类设备故障;依据拖欠支付的可能性分类贷款申请。对于这些问题,核心任务都是要把例子分类到各可能的离散值相应的类别中,因此常常被称为分类问题
4 主要的决策树学习算法
大多数决策树学习算法是一种核心算法的变体、该算法採用自顶向下的贪婪搜索遍历可能的决策树空间。决策树构造过程是从“哪一个属性将在树的根结点被測试?”这个问题開始的。
1) 使用统计測试来确定每分类能力最好的属性被选作树的根结点的測试。
2) 为根结点属性的每个可能值产生一个分支,并把训练例子排列到适当的分支(也就是,例子的该属性值相应的分支)之下。
3) 反复整个过程,用每个分支结点关联的训练例子来选取在该点被測试的最佳属性。
这形成了对决策树的贪婪搜索,也就是算法从不回溯又一次考虑曾经的选择。
下图描写叙述了该算法的一个简化版本号:
1. 哪个属性是最佳的分类属性?
ID3 算法的核心问题是选取在树的每个结点要測试的属性,我们希望选择的是最有助于分类实例的属性。
1) 用熵度量例子的纯度
为了精确地定义信息增益,我们先定义信息论中广泛使用的一个度量标准,称为熵(entropy),它刻画了随意例子集的纯度(purity)。
给定包括关于某个目标概念的正反例子的例子集S,那么S 相对这个布尔型分类的熵为:
Entropy(S) = -p⊕log2p⊕ -pΘlog2pΘ
当中p⊕是在S 中正例的比例,pΘ是在S 中负例的比例。
在有关熵的全部计算中我们定义0log0 为0。
举例说明,如果S 是一个关于某布尔概念的有14 个例子的集合,它包括9 个正例和5 个反例(我们採用记号[9+,5-]来概括这样的数据例子)。
那么S 相对于这个布尔分类的熵(Entropy)为:
Entropy ([9+, 5−]) = −(9 / 14) log 2 (9 /14) − (5 / 14) log 2(5 / 14) =0.940
注意,如果S 的全部成员属于同一类,那么S 的熵为0。比如,如果全部的成员是正的 ( p⊕=1 ) , 那么 pΘ 就是 0 , 于是 Entropy(S) =− 1 ⋅ log ( 1 ) − (0) ⋅log (0) = −1 ⋅ 0 − 0 ⋅ log 0 = 0 。
另外,当集合中正反例子的数量相等时熵为1。
如果集合中正反例的数量不等时,熵介于0 和1 之间。下图显示了关于某布尔分类的熵函数随着p⊕从0 到1 变化的曲线。
信息论中熵的一种解释是,熵确定了要编码集合S 中随意成员(即以均匀的概率随机抽出的一个成员)的分类所须要的最少二进制位数。举例来说,如果p ⊕ 是1,接收者知道抽出的例子必为正,所以不必发不论什么消息,此时的熵为0。还有一方面,如果是p⊕0.5,必须用一个二进制位来说明抽出的例子是正还是负。
如果p⊕ 是0.8,那么对所需的消息编码方法是赋给正例集合较短的编码,可能性较小的反例集合较长的编码,平均每条消息的编码少于1 个二进制位。
更一般的,如果目标属性具有c个不同的值,那么S 相对于c 个状态(c-wise)的分类的熵定义为:
2) 用信息增益度量期望的熵减少
已经有了熵作为衡量训练例子集合纯度的标准,如今能够定义属性分类训练数据的效力的度量标准。这个标准被称为“信息增益”。简单的说,一个属性的信息增益就是由于使用这个属性切割例子而导致的期望熵减少。
当中Values(A)是属性A 全部可能值的集合。
Sv是S 中属性A 的值为v 的子集(也就是,S v ={s∈S|A(s)=v})。
请注意,等式的第一项就是原来集合S 的熵,第二项是用A 分类S 后熵的期望值。这个第二项描写叙述的期望熵就是每个子集的熵的加权和。
|Sv |权值为属于Sv 的例子占原始例子S 的比例。
所以Gain(S,A)是由于知道属性A的|S |值而导致的期望熵减少。
换句话来讲,Gain(S,A)是由于给定属性A 的值而得到的关于目标函数值的信息。
当对S 的一个随意成员的目标值编码时,Gain(S,A)的值是在知道属性A 的值后能够节省的二进制位数。
信息增益正是ID3 算法增长树的每一步中选取最佳属性的度量标准。
下图概述了怎样使用信息增益来评估属性的分类能力。在这个图中,计算了两个不同属性:湿度(Humidity)和风力(Wind)的信息增益:
2. 算法演示例子
为了演示ID3 算法的详细操作,训练例子入下图。这里,目标属性PlayTennis 对于不同的星期六上午具有yes 和no两个值,我们将依据其它属性来预測这个目标属性值。
先考虑这个算法的第一步,创建决策树的最顶端结点。
哪一个属性该在树上第一个被測试呢?
ID3算法计算每个候选属性(也就是Outlook,Temperature,Humidity,和Wind)的信息增益,然后选择信息增益最高的一个。全部四个属性的信息增益为:
Gain(S,Outlook)=0.246
Gain(S,Humidity)=0.151
Gain(S,Wind)=0.048
Gain(S,Temperature)=0.029
当中S 表示来自下图的训练例子的集合。
依据信息增益标准,属性Outlook 在训练例子上提供了对目标属性PlayTennis 的最好预測。
所以,Outlook 被选作根结点的决策属性,并为它的每个可能值(也就是Sunny,Overcast 和Rain)在根结点下创建分支。
同一时候画出的还有被排列到每个新的后继结点的训练例子。注意到每个Outlook=Overcast 的例子也都是PlayTennis 的正例。所以,树的这个结点成为一个叶子结点,它对目标属性的分类是PlayTennis=Yes。相反,相应Outlook=Sunny 和Outlook=Rain 的后继结点还有非0的熵,所以决策树会在这些结点下进一步展开。
对于非终端的后继结点,再反复前面的过程选择一个新的属性来切割训练例子,这一次仅使用与这个结点关联的训练例子。已经被收编入树的较高结点的属性被排除在外,以便不论什么给定的属性在树的随意路径上最多仅出现一次。对于每个新的叶子结点继续这个过程,直到满足下面两个条件中的任一个:
1) 全部的属性已经被这条路径包括
2) 与这个结点关联的全部训练例子都具有相同的目标属性值(也就是它们的熵为0)
下图演示了算法的求解过程:
5 用搜索的观点看决策树学习
与其它的归纳学习算法一样,ID3算法能够被描写叙述为从一个如果空间中搜索一个拟合训练例子的如果。
被ID3 算法搜索的如果空间就是可能的决策树的集合。
ID3算法以一种从简单到复杂的爬山算法遍历这个如果空间。
从空的树開始,然后逐步考虑更加复杂的如果,目的是搜索到一个正确分类训练数据的决策树。
引导这样的爬山搜索的评估函数是信息增益度量。下图描写叙述了这样的搜索:
能够通过ID3算法的搜索空间和搜索策略深入认识这个算法的优势和不足。
1) ID3算法中的如果空间包括全部的决策树, 避免了搜索不完整如果空间(说明一下:有些算法是搜索不完整如果空间的、详细參考<<机器学习>>这本书)的一个主要风险:如果空间可能不包括目标函数。
2) 当遍历决策树空间时,ID3仅维护单一的当前如果。由于仅考虑单一的如果,ID3算法失去了表示全部一致如果所带来的优势。(说明一下:意思就是说它不能推断有没有其它的决策树也是与现有的训练数据一致的。或者使用新的实例查询来最优地区分这些竞争如果)
3) 在搜索中不进行回溯。
每当在树的某一层次选择了一个属性进行測试,它不会再回溯又一次考虑这个选择。所以,它易受无回溯的爬山搜索中常见风险影响:收敛到局部最优的答案,但不是全局最优的。
4) 搜索的每一步都使用当前的全部训练例子,以统计为基础决定怎样精化当前的如果。
这与那些基于单独的训练例子递增作出决定的方法不同。使用全部例子的统计属性(比如,信息增益)的一个长处是大大减小了对个别训练例子错误的敏感性。
6 决策树学习的归纳偏置(參见归纳偏置相关论述)
1从观測到的训练数据泛化以分类未见实例的策略是什么呢?
换句话说,它的归纳偏置是什么?
如果给定一个训练例子的集合,那么通常有非常多决策树与这些例子一致。
所以,要描写叙述ID3 算法的归纳偏置,应找到它从全部一致的如果中选择一个的依据。
ID3从这些决策树中选择哪一个呢?它选择在使用简单到复杂的爬山算法遍历可能的树空间时遇到的第一个可接受的树。
概略地讲,ID3的搜索策略为
a) 优先选择较短的树而不是较长的
b) 选择那些信息增益高的属性离根结点较近的树。
在ID3 中使用的选择属性的启示式规则和它遇到的特定训练例子之间存在着微妙的相互作用,由于这一点。非常难准确地刻划出ID3 的归纳偏置。然而我们能够近似地把它的归纳偏置描写叙述为一种对短的决策树的偏好。
近似的ID3 算法归纳偏置:较短的树比較长的优先
其实,我们能够想象一个相似于ID3的算法,它精确地具有这样的归纳偏置。考虑一种算法,它从一个空的树開始广度优先搜索逐渐复杂的树,先考虑全部深度为1 的树,然后全部深度为2的,......。
一旦它找到了一个与训练数据一致的决策树,它返回搜索深度的最小的一致树(比如,具有最少结点的树)。让我们称这样的广度优先搜索算法为BFS-ID3。
BFS-ID3寻找最短的决策树,因此精确地具有“较短的树比較长的得到优先”的偏置。ID3可被看作BFS-ID3的一个有效近似,它使用一种贪婪的启示式搜索企图发现最短的树,而不用进行完整的广度优先搜索来遍历如果空间。
由于ID3 使用信息增益启示式规则和“爬山”策略,它包括比BFS-ID3更复杂的偏置。尤其是,它并不是总是找最短的一致树,而是倾向于那些信息增益高的属性更靠近根结点的树。
ID3 归纳偏置的更贴切近似:
较短的树比較长的得到优先。那些信息增益高的属性更靠近根结点的树得到优先。
2. 为什么优先短的如果?
奥坎姆剃刀:优先选择拟合数据的最简单如果。
为什么应该优先选择较简单的如果呢?科学家们有时似乎也遵循这个归纳偏置。比如物理学家优先选择行星运动简单的解释,而不用复杂的解释。对这个问题并没有一个确定性的定论和证明、有兴趣的能够參考相关资料。
7 决策树常见问题
1. 避免过度拟合数据
对于一个如果,当存在其它的如果对训练例子的拟合比它差,但其实在实例的整个分布(也就是包括训练集合以外的实例)上表现的却更好时,我们说这个如果过度拟合训练例子。
这样的情况发生的一种可能原因是训练例子含有随机错误或噪声。
其实,当训练数据没有噪声时,过度拟合也有可能发生,这样的情况下,非常可能出现巧合的规律性。
有几种途径用来避免决策树学习中的过度拟合。
它们可被分为两类:
a) 及早停止增长树法,在ID3 算法完美分类训练数据之前停止增长树;
b) 后修剪法,即同意树过度拟合数据,然后对这个树后修剪。
一个常见的做法是错误率减少修剪:考虑将树上的每个结点作为修剪的候选对象。修剪一个结点由下面步骤组成:删除以此结点为根的子树;使它成为叶子结点;把和该结点关联的训练例子的最常见分类赋给它。
仅当修剪后的树对于验证集合的性能不差于原来的树时才删除该结点。这样便使由于训练集合的巧合规律性而增加的结点非常可能被删除,由于相同的巧合不大会发生在验证集合中。反复地修剪结点,每次总是选取它的删除能够最大提高决策树在验证集合上的精度的结点。继续修剪结点直到进一步的修剪是有害的。
2. 合并连续值属性
把连续值属性的值域切割为离散的区间集合。其实本质还是处理离散值、仅仅是将连续值划分为离散值。
3. 属性选择的其它度量标准
信息增益度量存在一个内在偏置,它偏袒具有较多值的属性。举一个极端的例子,考虑属性Date,它有大量的可能值(比如March 4,1979)。要是我们把这个属性加到数据中,它会在全部属性中有最大的信息增益。
这是由于单独Date就能够全然预測训练数据的目标属性。
于是这个属性会被选作树的根结点的决策属性并形成一棵深度为一级但却非常宽的树,这棵树能够理想地分类训练数据。当然,这个决策树对于后来数据的性能会相当差,由于虽然它完美地切割了训练数据,但它不是一个好的预測器(predicator)。
属性Date出了什么问题了呢?
简单地讲,是由于它太多的可能值必定把训练例子切割成非常小的空间。因此,相对训练例子,它会有非常高的信息增益,虽然对于未见实例它是一个非常差的目标函数预測器。
避免这个不足的一种方法是用其它度量,而不是信息增益,来选择决策属性。关于选取其它度量属性度量标准、參见參考资料。
4. 处理缺少属性值的训练例子
在某些情况下,可供使用的数据可能缺少某些属性的值。
比如,在医学领域我们希望依据多项化验指标预測患者的结果,然而可能仅有部分患者具有验血结果。在这样的情况下,常常须要依据此属性值已知的其它实例,来预计这个缺少的属性值。
处理缺少属性值的一种策略是赋给它结点n 的训练例子中该属性的最常见值。
还有一种策略是能够赋给它结点n 的被分类为c(x)的训练例子中该属性的最常见值。
5. 处理代价不同的属性
在某些学习任务中,实例的属性可能与代价相关。
比如,在学习分类疾病时我们可能以这些属性来描写叙述患者:体温、活组织切片检查、脉搏、血液化验结果等。这些属性在代价方面区别非常大,不论是所需的费用还是患者要承受的不适。对于这样的任务,我们将优先选择尽可能使用低代价属性的决策树,仅当须要产生可靠的分类时才依赖高代价属性。
考虑代价的相关算法參见參考资料。
參考资料:
1<<机器学习>> Tom M. Mitchell
2<<CS229--Machine Learning>> Andrew Ng
课程翻译:
http://v.163.com/special/opencourse/machinelearning.html
讲义下载:
http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=MachineLearning
<完>
-------------------------------------------------------------------------------------
黑夜路人。一个关注开源技术、乐于学习、喜欢分享的程序猿
博客:http://blog.csdn.net/heiyeshuwu
微博:http://weibo.com/heiyeluren
微信:heiyeluren2012
想获取很多其它IT开源技术相关信息,欢迎关注微信!
微信二维码扫描高速关注本号码: