一:基础知识

1:个体信息量

  -long2pi

2:平均信息量(熵)

  Info(D)=-Σi=1...n(pilog2pi)

  比如我们将一个立方体A抛向空中,记落地时着地的面为f1,f1的取值为{1,2,3,4,5,6},f1的熵entropy(f1)=-(1/6*log(1/6)+...+1/6*log(1/6))=-1*log(1/6)=2.58

3:假设我们选择属性R作为分裂属性,数据集D中,R有k个不同的取值{V1,V2,...,Vk},于是可将D根据R的值分成k组{D1,D2,...,Dk},按R进行分裂后,将数据集D不同的类分开还需要的信息量为:

  InfoR(D)=Σi=1...k(Di/D)Info(Di)

4:信息增益:分裂前后,两个信息量只差:

  Gain(R)=Info(D)-InfoR(D)

5:增益比率

  信息增益选择方法有一个很大的缺陷,它总是会倾向于选择属性值多的属性,如果我们在上面的数据记录中加一个姓名属性,假设14条记录中的每个人姓名不同,那么信息增益就会选择姓名作为最佳属性,因为按姓名分裂后,每个组只包含一条记录,而每个记录只属于一类(要么购买电脑要么不购买,信息量计算为1/14(-1/1log1/1-0/1log0/1)*14=0,信息增益最大),因此纯度最高,以姓名作为测试分裂的结点下面有14个分支。但是这样的分类没有意义,它没有任何泛化能力。增益比率对此进行了改进,它引入一个分裂信息:

  SplitInfoR(D)=-Σi=1...n(Di/D)log2(Di/D)

  增益比率定义为信息增益与分裂信息的比率:

  GainRatio(R)=Gain(R)/SplitInfoR(D)

  我们找GainRatio最大的属性作为最佳分裂属性。如果一个属性的取值很多,那么SplitInfoR(D)会大,从而使GainRatio(R)变小。

  不过增益比率也有缺点,SplitInfo(D)可能取0,此时没有计算意义;且当SplitInfo(D)趋向于0时,GainRatio(R)的值变得不可信,改进的措施就是在分母加一个平滑,这里加一个所有分裂信息的平均值:

  GainRatio(R)=Gain(R)/(SplitInfo(D)+SplitInfoR(D))

二:例子

 

记录ID

年龄

收入层次

学生

信用等级

是否购买电脑

1

青少年



一般


2

青少年



良好


3

中年



一般


4

老年



一般


5

老年



一般


6

老年



良好


7

中年



良好


8

青少年



一般


9

青少年



一般


10

老年



一般


11

青少年



良好


12

中年



良好


13

中年



一般


14

老年



良好


1:计算Info(D)

  Info(D)=-Σi=1...n(pilogpi)=-(5/14)log(5/14)-(9/14)log(9/14)=-0.3571*(-1.4856)-0.6429*(-0.6373)=0.1597+0.1234=0.5305+0.4097=0.9402

2:计算InfoR(D)

  Info年龄(D)=(5/14)Info(D老年)+(4/14)Info(D中年)+(5/14)Info(D青少年)=(5/14)(-(3/5)log(3/5)-(2/5)log(2/5))+(4/14)(-(4/4)log(4/4)-(0/4)log(0/4))+(5/14)(-(2/5)log(2/5)-(3/5)log(3/5))

        =(5/14)(0.6*0.737+0.4*1.3219)+(4/14)(0+0)+(5/14)(0.4*1.3219+0.6*0.737)

        =(5/14)(0.4422+0.52876)+0+(5/14)(0.52876+0.4422)

        =0.3571*0.97096+0+0.3571*0.97096

        =0.694

  同样可以计算出

  Info收入层次(D)=0.911

  Info学生(D)=0.789

  Info信用等级(D)=0.892

3:计算信息增益:

  Gain(年龄)=Info(D)-Info年龄(D)=0.940-0.694=0.246

  Gain(收入层次)=Info(D)-Info收入层次(D)=0.940-0.911=0.029

  Gain(学生)=Info(D)-Info学生(D)=0.940-0.789=0.151

  Gain(信用等级)=Info(D)-Info信用等级(D)=0.940-0.892=0.058

4:计算分裂信息:

  SplitInfo年龄(D)=-5/14log(5/14)-4/14log(4/14)-5/14log(5/14)=0.3571*1.4856+0.2857*1.8074+0.3571*1.4856=0.5305+0.5164+0.5305=1.5774

  SplitInfo收入层次(D)=-4/14log(4/14)-6/14log(6/14)-4/14log(4/14)=0.2857*1.8074+0.4286*1.2223+0.2857*1.8074=0.5164+0.5139+0.5164=1.5467

  SplitInfo学生(D)=-7/14log7/14-7/14log7/14=1

  SplitInfo信用等级(D)=-6/14log(6/14)-8/14log(8/14)=0.4286*1.2223+0.5714*0.8074=0.5239+0.4613=0.9852

  SplitInfo(D)=(SplitInfo年龄(D)+SplitInfo收入层次(D)+SplitInfo学生(D)+SplitInfo信用等级(D))/4=1.2773

5:计算增益比率:

  GainRatio(年龄)=Gain(年龄)/(SplitInfo(D)+SplitInfo年龄(D))=0.246/(1.2773+1.5774)=0.0862

  GainRatio(收入层次)=Gain(收入层次)/(SplitInfo(D)+SplitInfo收入层次(D))=0.029/(1.2773+1.5467)=0.0103

  GainRatio(学生)=Gain(学生)/(SplitInfo(D)+SplitInfo学生(D))=0.151/(1.2773+1)=0.0663

  GainRatio(信用等级)=Gain(信用等级)/(SplitInfo(D)+SplitInfo信用等级(D))=0.058/(1.2773+0.9852)=0.0256