4.3 分治法:创建决策树
我们使用的纯度量度称为信息量(information),量度单位是bit。纯度量度与树的一个节点相关联,代表了一个期望信息总量,用于说明到达这个节点的新实例将被分到yes还是no类所需的信息总量。
a节点上yes和no的实例数量分别是[2,3],[4,0][3,2],这些节点上的信息值为
info([2,3])=0.971位
info([4,0])=0.0位
info([3,2])=0.971位
计算它们的平均信息值,并考虑到达每个分支的实例的数量,
info([2,3],[4,0],[3,2])=(5/14)0.971+0(5/14)+(5/14)*0.971=0.693位
这个平均值代表了期望的信息总量,是由指定给定a的树结构,对一个新实例的类别进行说明锁必须的信息量。
在任何初始树创建之前,处于根节点的训练样本由9个yes和5个no组成,与之对应的信息值是
info([9,5])=0.940位
因此图a所获的信息增益为
gain(outlook)=info([9,5])-info([2,3],[4,0],[3,2])=0.940-0.693=0.247位
以outlook作为分割点,再计算别的属性的信息增益
4.3.1 计算信息量
一个给定的样本例达到某个含有一定数量的yes实例和no实例的节点,在考察对这个样本进行分类所需的信息总量计算公式之前,首先考虑一下我们期望这个量值所拥有的属性:
1)当yes或者no的实例数量为0时,信息量为0
2)当yes和no的实例数量相同时,信息量达到最大
一个函数计算这个值,称为信息值或者熵:
使用负号是因为分数p1,p2….pn的对数值为负,因此熵实际是正数。一般对数的底数取2,以位为单位。p1+p2+…pn=1
info([2,3,4])=entropy(2/9,3/9,4/9)=
-2/9*log2/9 -3/9*log3/9 -4/9*log4/9 =
[-2log2-3log3-4log4+9log9]/9
4.3.2 高度分支属性
当一个属性拥有的可能值数量很大,从而使分支的路径增加,产生出很多子节点时,计算信息增益就会出现一个问题。 用一个标志码属性
标志码属性能够区别每个实例,所以它能确定类别,而不会出现任何模棱两可的情况,如表所示,所以这个属性增益就是在根节点上的信息量,即info([9,5])=0.940位。它比在其他任何属性上获得的信息增益值要大,毫无疑问标志码将被选为分裂属性,但是在标志码属性上的分支对预测未知实例没有任何帮助,也没有能描述有关决策的结构,而这两点正是机器学习的双重目标。
由此可见,采用度量信息增益的方法会倾向于选择拥有较多可能属性值的属性,一个称为增益率(gain ratio)的量度修正被广泛采用。增益率的获得考虑了属性分裂数据集后所产生的子节点的数量和规模,而忽略任何有关类别的信息。
图4-5:分裂后的信息值
info([1,1,1,1,1])=-1/14*log1/14*14
log14 或者3.807位,是一个非常高的信息值,因为分裂后所产生的信息值是指要确定各个实例应该被分配到哪个分支上所需要的位数,分支越多,这个信息值越大。增益率的计算方法是将原来的信息增益,除以这个属性的信息值0.940(根节点) 增益率: 0.247
属性阴晴将数据集分成3个子集,规模分别是5,4,5,因此一个内在的信息值是
info([5,4,5])=1.577
而上面的信息值计算是要考虑类别
info([2,3],[4,0],[3,2])=-p*logp
越是高度分支的属性,这个内在的信息值越大,信息增益可以通过将其除以内在的信息值,从而获得增益率的方法来进行修正。
增益率计算
(1) 计算信息量 总的 info([9,5])=0.940
(2) 计算这个属性的信息量:info([3,2],[4,0],[2,3])=0.693
(3) 计算增益: 0.940-0.693=0.247
(4) 计算分裂信息量: info([5,4,5])=1.577
(5) 计算增益率: 0.247/1.577 = 0.157