决策树介绍一

来源:互联网 发布:零基础学java pdf 编辑:程序博客网 时间:2024/06/08 07:04

决策树(Decision tree)是一种基本的分类与回归方法,尤其是在各大竞赛中,很多最后胜出的算法都是树模型组合起来的.决策树的学习通常分为三部分:特征选择,决策树的生成和决策树的剪枝.本文主要介绍决策树学习的ID3,C4.5算法,C5.0算法和CART 树.为了更好的理解本文,请先阅读信息论基础.


1 例子

决策树可以理解成是很多ifthenif−then的规则组合.下图就是一棵典型的决策树:

这棵决策树根据天气情况分类“星期六上午是否适合打网球”,根节点到叶节点的每一条路径构成了一条规则,路径上的内部节点对应规则的条件,叶节点的类对应着规则的结论.

  • 规则1:如果晴天,湿度很高就不去打网球
  • 规则2:如果晴天,湿度一般就去打网球
  • 规则3:如果是阴天,就去打网球
  • 规则4:如果是雨天,而且大风,就不去打网球
  • 规则5:如果是雨天,但是微风,就去打网球

再比如,某位母亲给自己闺女物色了个男朋友,于有了下面这段对话:

  • 女儿:多大年纪了?
  • 母亲:26.
  • 女儿:长得帅不帅?
  • 母亲:挺帅的.
  • 女儿:收入高不?
  • 母亲:不算特别高,中等情况吧.
  • 女儿:是不是公务员?
  • 母亲:是,在税务局上班.
  • 女儿:那好,见个面吧.

这个女孩的决策过程就是典型的分类决策过程.相当于通过年龄,长相,收入和是否是公务员将男人分成两类:见和不见.假设这个女孩对男人的要求是:30岁以下,长相中等,高收入或者中等收入的公务员,那么可以用下图来表示女孩的决策逻辑:

下面就以一个例子来说明决策树学习的各种算法.
我们希望能够学习出一个贷款申请的决策树,当新的客户提出申请贷款时,根据申请人的特征利用决策树决定是否批准申请贷款.

ID年龄有工作有自己的房子信贷情况类别1青年否否一般否2青年否否好否3青年是否好是4青年是是一般是5青年否否一般否6中年否否一般否7中年否否好否8中年是是好是9中年否是非常好是10中年否是非常好是11老年否是非常好是12老年否是好是13老年是否好是14老年是否非常好是15老年否否一般否

这个例子中,我们有年龄,工作,房子,信贷情况等特征:

年龄青年,中年,老年工作是,否房子是,否信贷情况一般,好,非常好

如果我们根据这些条件逐步去构建决策树的话,如何选择每个节点呢? 比如我们的根节点是选年龄好还是选工作好? 不同的算法选择的标准不一样.在了解这些算法之前,请先阅读信息论基础这篇文章,确保理解了里面介绍到的概念.

2 ID3

ID3由Ross Quinlan于1986年提出.

它根据信息增益(Information gain)来选取Feature作为决策树分裂的节点.特征AA对训练数据集DD的信息增益定义为集合D的经验熵(所谓经验熵,指的是熵是有某个数据集合估计得到的)H(D)H(D)与特征AA给定条件下DD的经验条件熵 H(DA)H(D∣A) 之差,记为 g(D,A)g(D,A).

g(D,A)=H(D)H(D|A)g(D,A)=H(D)−H(D|A)

实际上就是特征AADD的互信息.分别以A1,A2,A3,A4A1,A2,A3,A4 来表示年龄,工作,房子和信贷情况4个特征,下面来计算每个特征的信息增益.上面的例子,按照类别整理成表格如下:

类别ID数量是3,4,8,9,10,11,12,13,149否1,2,5,6,7,156

所以:

H(D)=915log915615log615=0.971H(D)=−915log⁡915−615log⁡615=0.971

A1=A1=青年时:

类别,年龄青年数量是3,42否1,2,53
H(D|A1=)=25log2535log35=0.971H(D|A1=青年)=−25log⁡25−35log⁡35=0.971

A1=A1=中年时:

类别,年龄中年数量是8,9,103否6,72
H(D|A1=)=35log3525log25=0.971H(D|A1=中年)=−35log⁡35−25log⁡25=0.971

A1=A1=老年时:

类别,年龄老年数量是7,8,9,104否151
H(D|A1=)=45log4515log15=0.722H(D|A1=老年)=−45log⁡45−15log⁡15=0.722

所以:

H(D|A1)=515H(D|A1=)+515H(D|A1=)+515H(D|A1=)=515×0.971+515×0.971+515×0.722=0.888H(D|A1)=515H(D|A1=青年)+515H(D|A1=中年)+515H(D|A1=老年)=515×0.971+515×0.971+515×0.722=0.888

由此可以计算出:

g(D,A1)=H(D)H(D|A1)=0.9710.888=0.083g(D,A2)=0.324g(D,A3)=0.420g(D,A4)=0.363g(D,A1)=H(D)−H(D|A1)=0.971−0.888=0.083g(D,A2)=0.324g(D,A3)=0.420g(D,A4)=0.363

总结一下上面的计算过程,假设训练数据集为 DD,D∣D∣表示其大小.设有 KK 个分类 C1,C2,,CkC1,C2,…,Ck,Ck∣Ck∣为类 CkCk 的大小,即样本个数, Kk=1Ck=D∑k=1K∣Ck∣=∣D∣ .设特征 AA 有 nn 个不同的取值 {a1,a2,,an}{a1,a2,…,an},根据特征 AA 的取值将 DD 划分成 nn 个子集 D1,D2,,DnD1,D2,…,Dn,Di∣Di∣ 为 DiDi 的大小, ni=1Di∑i=1n∣Di∣ .记子集 DiDi中属于类 CkCk的样本集合为 DikDikDik∣Dik∣ 为 DikDik 的大小.于是信息增益的算法如下:

  • 计算数据集 DD 的经验熵 H(D)
H(D)=k=1K|Ck|Dlog|Ck|DH(D)=−∑k=1K|Ck|Dlog⁡|Ck|D
  • 计算特征AA对数据集 DD 的经验条件熵
H(D|A)=i=1nDiDH(Di)=i=1nk=1K|Dik|Dilog|Dik|DiH(D|A)=∑i=1nDiDH(Di)=−∑i=1n∑k=1K|Dik|Dilog⁡|Dik|Di

ID3从根节点开始,计算所有可能特征的信息增益,取信息增益最大的特征作为节点的特征,然后由特征的不同取值,建立子节点,再对子节点递归调用以上方法,知道所有特征的信息增益都很小或者没有特征选择为止.

具体为:

  1. DD中所有实例都属于同一类 CkCk,则 TT 为单节点树,并将类 CkCk作为该节点的类标记,返回TT.
  2. A=ΦA=Φ,则TT为单节点树,并将DD中实例最大的类CkCk作为该节点的类标记,返回TT.
  3. 否则,按照信息增益的算法,计算每个特征对DD的信息增益,取信息增益最大的特征 AgAg.
  4. 如果 Ag<εAg<ε,则置 TT 为单节点树,并将DD中实例最大的类CkCk作为该节点的类标记,返回TT.
  5. 否则,对AgAg的每一可能值 aiai,依Ag=aiAg=aiDD分成若干非空子集DiDi,将DiDi中实例最大的类作为标记,构建子节点,由节点和子节点构成树TT,返回TT.
  6. 对第 ii 个子节点,以DiDi为训练集,以A{Ag}A−{Ag} 为特征集,递归地调用步骤1到步骤5,得到子树 TiTi,返回TiTi.

3 C4.5

C4.5由Ross Quinlan于1993年提出.ID3采用的信息增益度量存在一个内在偏置,它优先选择有较多属性值的Feature,因为属性值多的Feature会有相对较大的信息增益?(信息增益反映的给定一个条件以后不确定性减少的程度,必然是分得越细的数据集确定性更高,也就是条件熵越小,信息增益越大).避免这个不足的一个度量就是不用信息增益来选择Feature,而是用信息增益比率(gain ratio),增益比率通过引入一个被称作分裂信息(Split information)的项来惩罚取值较多的Feature,分裂信息用来衡量Feature分裂数据的广度和均匀性:

SplitInformation(D,A)=i=1n|Di||D|log|Di||D|SplitInformation(D,A)=−∑i=1n|Di||D|log⁡|Di||D|
GainRatio(D,A)=g(D,A)SplitInformation(D,A)GainRatio(D,A)=g(D,A)SplitInformation(D,A)

但是当某个DiDi的大小跟DD的大小接近的时候,SplitInformation(D,A)0,GainRatio(D,A)SplitInformation(D,A)→0,GainRatio(D,A)→∞,为了避免这样的属性,可以采用启发式的思路,只对那些信息增益比较高的属性才应用信息增益比率.

相比ID3,C4.5还能处理连续属性值,具体步骤为:

  • 把需要处理的样本(对应根节点)或样本子集(对应子树)按照连续变量的大小从小到大进行排序.
  • 假设该属性对应的不同的属性值一共有NN个,那么总共有N1N−1个可能的候选分割阈值点,每个候选的分割阈值点的值为上述排序后的属性值中两两前后连续元素的中点,根据这个分割点把原来连续的属性分成bool属性.实际上可以不用检查所有N1N−1个分割点,具体请看下面的例子.
  • 用信息增益比率选择最佳划分.

假设上面关于贷款的例子还有个属性是收入情况,对应的数据如下(已经排好序):

收入(百)404860728090类别否否是是是否

可以证明这时候的切分点,只能出现在目标分类不同的相邻实例之间,即出现在(48,60)和(80,90)之间,这时候选取切分点 s1=(48+60)/2=54s1=(48+60)/2=54 和 s2=(80+90)/2=85s2=(80+90)/2=85.利用s1=54s1=54就可以将收入分成小于54和大于54两类.连续属性值比较多的时候,由于需要排序和扫描,会使C4.5的性能有所下降.

C4.5还能对缺失值进行处理,处理的方式通常有三种:

  • 赋上该属性最常见的值
  • 根据节点的样例上该属性值出现的情况赋一个概率,比如该节点上有10个样本,其中属性A的取值有6个为是,4个为否.那么对改节点上缺失的属性A,以0.6的概率设为是,0.4的概率设为否.
  • 丢弃有缺失值的样本
0 0
原创粉丝点击