阅读笔记-机器学习-第3章-决策树学习

1. 问题举例
    继续使用第2章中的例子,即Aldo有时会去进行水上运动,天气情况对于Aldo选择是否去水上运动有很大的作用,可以想象,如果天气好,很可能Aldo就会去,如果天气恶劣,Aldo就不会去。现在已知若干天的天气情况,和Aldo是否去参与了水上运动的记录,根据新的一天的天气情况来预测Aldo是否会去进行水上运动。 

 

2. 决策树的一般形式
    
    通常决策树代表实例属性值约束的合取得析取式。从树根到树叶的每一条路径对应一组属性测试的合取,树本身对应这些合取的析取。
    上面的决策树对应的合取析取式为: (Outlook=Sunny Λ Humidity=Normal) V (Outlook=Overcast) V (Outlook=Rain) 

3. 基本的决策树学习算法  
    基本的ID3算法通过自顶向下构造决策树来进行学习。构造过程是从“哪一个属性将在树的根结点被测试?”这个问题开始的。每次选取分类能力最好的结点(即具有最高信息增益的结点)。
    算法代码如下:   

ID3(Example, Target_attribute, Attributes)
    Examples即训练样例集。Target_attribute是这棵树要测试的目标属性。Attributes是除目标属性外供学习到的决策树测试的属性列表。返回一颗能挣钱分类给定Examples的决策树
·创建树的Root结点
·如果Examples都为正,那么返回label=+的单结点树Root
·如果Examples都为反,那么返回label=-的单结点树Root
·如果Attributes为空,那么返回单结点树Root,label=Examples中最普遍的Target_attribute值
·否则开始
    ·a<-Attributes中分类Examples能力最好的属性
    ·Root的决策属性<-A
    ·对于A的每个可能只vi
        ·在Root下加一个新的分支对应测试A=Vi
        ·令Examples_vi为Examples中满足A属性值为vi的子集
        ·如果Examples_vi为空
            ·在这个分支下加一个叶子结点,结点的label=Examples中最普遍的Target_attribute值
            ·否则在这个新分支下加一个子树ID3(Examples_vi, Target_attribute, Attributes-{A})
·结束
·返回Root

4. 度量属性的分类能力

    在构造决策树的过程中,需要不断的度量当前属性在剩余样本中的分类能力,选择分类能力最大的属性作为新的结点。度量属性分类能力的方法来自于信息论的熵。
    熵是信息论中广泛使用的一个度量标注,它刻画了任意样例集得纯度。给定关于某个概念的正反例的样本集S,那么S相对于这个布尔型分类的熵为:
    Entropy(S)= -p1 * log(p1) -p2 *log(p2),其中,p1为S中正例的比例,P2为S中负例的比例,在计算中,定义0log0为0。该函数的图像为:
    
    图像画的不是很准确,但是走势基本正确,当正例负例数量对等的时候熵是最大的。分类能力强的属性,应该是经过该属性分类后,样本集合的不确定性下降的最大的,即使用该属性后,熵下降最大的那个属性。这里的不确定性下降的度量被称为信息增益。准确的说,一个属性A相对于样例集合S的信息增益Gain(S,A)被定义为

第一项是原集合S的熵,第二项是用A分类后每个子集的熵的加权和。

5. 决策树学习对噪声敏感度
    ID3算法在搜索的每一步都是用当前的所有训练样例,以统计的为基础决定怎样精化当前的假设。这与那些基于单独的训练样例递增作出决定的方法(例如,Find-S和候选消除算法)不同。
    使用样例的统计属性(这里是信息增益),大大降低了对个别训练数据错误的敏感性。因此,通过修改ID3算法的终止准则接受不完全拟合训练数据的假设,它可以被很容易地扩展到处理含有噪声的训练数据。

6. 决策树学习的归纳偏置
    ID3的搜索策略是:(a)优先选择较短的树而不是较长的;(b)选择那些信息增益高的属性离根结点较近的树。
    ID3的归纳偏置:较短的树比较长的树优先。那些信息增益搞的属性更靠近根结点的树优先。
    ID3的假设空间是完整的,但是它不彻底搜索这个空间,因此其归纳偏置是由搜索策略导致的。而候选消除算法的假设空间是不完整的,假设目标函数是属性的析取式,但是彻底搜索这个空间,归纳偏置是有假设导致。前者往往被称为优选偏置(或者搜索偏置),后者常称为限定偏置(或者语言偏置)。
    熟知的线性SVM分类器,“线性”决定了限定偏置,“SVM的支持向量机”决定了优选偏置。

7. 决策树与过度拟合

    首先给出过度拟合的定义:在一个假设空间H,一个假设hÎH,如果存在其他的假设h'ÎH,使得在训练样例上h的错误率比h'小,但在整个实例分布上h'的错误率比h小,那么就说假设h过度拟合训练数据。书中给出一个例子,当决策树的结点超过25个后,对树的进一步精化,尽管会提高它在训练数据上的精度,却降低了它在测试样例上的精度。
    由于难以预测正确规模的树,因此直接停止树的增长不太可行,比较可行的是后剪法。
    一般将数据分为训练数据,验证数据和测试数据。首先使用训练数据得到完整的决策树,然后根据验证数据,得到修建后的决策树,最后在测试数据上使用决策树,进行预测。
    主要有两种修剪法:错误率降低修剪和规则后修剪。
    错误率降低修剪
  该方法是考虑树上的每一个结点作为修剪的候选对象。   

修剪一个结点的步骤:
·删除以此结点为根的子树,使它成为叶子结点,把和该结点关联的训练样例的最常见分类赋给它。
·仅当修剪后的树对于验证集合的性能不比原来的树差时才删除该结点。
反复修剪结点,每次总是选择那些删除后可以最大提高决策树在验证集合上的精度的结点。直到进一步的修剪是有害的为止(即降低了在验证集合上的精度)。

     错误率降低修剪的主要缺点是从训练数据中,分出了一部分作为验证数据。当训练数据不多时,训练数据损失不起。而规则后剪枝方法,在数据有限的许多实际情况下,还是很有效。
     规则后修剪    

·从训练集合推导出决策树,增长决策树直到尽可能好地模拟训练数据,允许过度拟合发生。
·将决策树转化为等价的规则集合,方法是从根结点到叶子结点的每一条路径创建一条规则。
·通过删除任何能导致估计精度提高的前件(precondition)来修剪(泛化)每一条规则。
·按照修剪过的规则的估计精度对它们进行排序,并按照这样的顺序应用这些规则来分类后来的实例。

    关于前件后件的解释
    前面图中的最左一条路径被转换为规则
             IF       (Outlook = Sunny) L (Humidity = High)
             THEN  PlayTennis = No
    其中的(Outlook=Sunny)和(Humidity = High)是这条规则的两个前件,PlayTennis = No是这条规则的后件。
    关于估计精度的解释
    错误率降低修剪中的验证集得方法是一种估计精度的方法,而规则后修剪使用的是基于训练集合本身评估性能,C4.5就是使用这种方法。
    具体来说,先计算规则在它应用的训练样例上的精度,然后假定此估计精度为二项分布(即以一定的概率预测正确任意一个样本),由于是假设了二项分布,期望=精度,方差也可以得到。
    对于一个给定的置信区间,采用下界估计作为规则性能的度量(例如:给定一个95%置信区间,可以根据期望和置信区间得到标准差,保守估计=观察精度-1.96*估计的标准差)。
    这样的效果是,对于大的数据集,保守预测非常接近观察精度(此时标准差很小),然而随着数据集的减小,它开始离观察精度越来越远。这种方法不是统计有效的,但是在实践中是有效的。
    “我晕,说了半天,估计精度这样做的动机我是没看懂,书中就给了句在实践中是有效的了事。”

8. 合并连续值属性

    ID3要求决策结点的属性和目标属性都是离散的,对于连续的决策结点属性,可以转化为离散属性,从而可以使用决策树学习。
    转化的过程就是通过设定阈值,通过阈值来把连续的属性值分到若干个类中。
    假设要把下例中的Temperature分为两类,一类是High Temperature,另一类是Low Temperature。
    Temperatures: 40   48   60     72     80     90 
    PlayTennis:      No   No   Yes   Yes    Yes    No
    阈值定多少合适呢?选择具有最大信息增益的阈值c。
    首先,把Temperature值排序,有证明表示c一定是位于目标属性不同的相邻实例,48-60之间,或者80-90之间。
    然后,得到两个候选阈值(48+60)/2=54, (80+90)/2=85,信息增益更大的是54这个阈值。
    另外,关于分为两个以上区间的方法,书中给出了相关的文献。

9. 属性选择的其他度量标准
    这部分主要是希望使树的宽度降低,举了个例子,说某个属性可能分类能力超强,但是会导致这一个属性基本就够用了,浪费了其他属性。怎么办呢?就是引入不用信息增益了,使用增益比率,即增益比率=信息增益/分类后的熵=(分类前得熵-分类后的熵)/分类后的熵。
    另外也有一些其他的度量。
    是否选择其他度量,就要看具体问题了,而且关键是如果超强分类的属性,对于测式数据效果也超好,那就没必要这么搞了,其实个人感觉应该是这样的,对训练数据好的属性,对测试数据应该也好,否则的话,就是训练数据与测试数据差异过大,或者是属性值设定太离散了,比如日期,一个日期就给一个值,过于离散也就说明这个属性本身含义不清楚,作用不大,能够很好拟合训练数据,仅仅是因为起到了记忆的作用,那么这样的话,选择其他度量也是不得已而为之,更好的做法是,取得更加合理的属性,这才是解决根本问题的方法。
10. 处理缺少属性值的训练样例
     一种方法是把该当前训练样例中该属性的最常见的值。这里“当前训练样例”指定就是在产生决策树的过程中,需要计算信息增益时的训练样例集合,而不是在构造决策树之前的训练样例集合。
     另一种方法是给每一个可能的值一个概率,通过概率的方法来计算信息增益。C4.5就是用的这种方法。
11. 处理不同代价的属性
     有的属性代价高,比如医疗检查,有的费用更高,这样用信息增益去除以代价就好了。书中的一些方法基本都是这个思路,形式上有些区别。这样就相当于在已有的优先选择较短的树和那些信息增益高的属性更靠近根结点的树优先,这两个搜索偏置上,再增加一个:选择有利于低代价的属性。

12. 工具版本
      ID3,C4.5,C5.0。
      C4.5是对ID3的优化版本。增加了对连续属性值的处理(最大信息增益的方法划分为离散值),增加了对缺少属性值的处理(概率的方法,信息增益),增加了后剪枝法(规则后修剪)。
      C5.0引入了Boost的思想。
      这里给出哈工大一个学生对决策树工具的调研PPT,个人感觉还不错。
      /Files/pangxiaodong/工具包/C4.5R8决策树工具的使用.pdf

13. 公式补充

      集合S的熵
    
      其中S表示某个集合,c表示集合中类别个数,p_i表示第i个类别的元素在所有类别的元素中所占比例。

       集合S对于属性A的信息增益
     
      
其中S表示某个集合,A表示某个属性,Values(A)表示属性A的属性值集合,v表示一个属性值,S_v表示集合S中,属性值为v的子集合,|x|表示集合x的元素个数。如果A能够完全将S分类,即每个S_v中只有一个类别,那么每个类别的熵都为0,此时信息增益最大。

      集合S对于属性A的信息增益比率
     

      其中SplitInformation(S,A)表示集合S对于属性A的分裂信息。

      集合S对于属性A的分裂信息
     

      这个分裂信息表示的是S关于属性A各个值的熵。看上去和信息增益公式中的第二项很近,实际上,信息增益计算公式的第二项是S关于属性A的各个值的熵的加权。如果一个含有n个样例的集合被属性A彻底分割,那么分类信息的熵为logn。相反,一个布尔属性B分割同样的n个实例,恰好平均分两半,那么分裂信息为1。即属性能够把集合分的越多,越平均,分裂信息越大。

posted @ 2011-05-11 15:34  xiaodongrush  阅读(3525)  评论(1编辑  收藏  举报