零、摘要
本文讨论决策树的构建、最佳划分的选择、剪枝处理以及缺失值处理。
主要参考资料:
- 《机器学习》周志华
- 《机器学习实战》 Peter Harrington
- 维基百科 C4.5_algorithm
- 维基百科 熵(信息论)
一、构建决策树
本文引用周志华《机器学习》中西瓜的例子。
假设你是河海大学大四老阿姨,有整整三的在教育超市的买西瓜经验,阅瓜无数,积累了一个数据集,包括买过的西瓜的各种特性(色泽、根蒂、敲声、纹理等等)以及吃瓜后这个瓜是否是好瓜的判断。
现在,你要教急缺买瓜经验的大一萌新陈德龙如何在超市选出好瓜。
作为前辈的你,是一个经验丰富的买瓜老手,挑瓜时有独到的套路:
比如说,首先看瓜的色泽,如果是青绿色的,就观察它的根蒂,如果根蒂是蜷缩着的,就轻敲西瓜听声音,如果是浊响,非常好,这是一个好瓜。
这就是决策树的基本思想。
但是显然在刚才的判断过程中,色泽不只有青绿色一种,其他颜色的瓜中也有好瓜的存在。另外一方面,对于一个瓜,怎样知道先判断色泽更好还是先判断根蒂更好呢?这就是寻找最优划分属性的问题。这一问题我们将在下一部分里讲述,而接下来,我们来试图用伪代码构建一棵决策树。
函数 生成决策树(训练集、属性集):
如果(训练集中的样本都属于同一类别):#比如:都是好瓜
则return 这一类别的标签;
如果(训练集中样本在属性集上的取值相同):#比如:属性集包含色泽和根蒂,训练集中的瓜色泽和根蒂都相同
则return 最多类别的标签; #比如:这些色泽和根蒂都相同的瓜里面好瓜占多数,则返回好瓜。
上面两个条件都不满足,则寻找最优化分属性a;# 比如:找到属性——敲声
根据属性a划分训练集,得到几个训练子集。
循环,对于a中每一个值ai: #比如:a1=浊响, a2=沉闷, a3=清脆
生成决策树(ai的训练子集、属性集/a)
上面,训练集相当于高维坐标中的点(x,y)。其中x是一个向量,分量xi是这个瓜在第i个属性上的取值,y代表是不是好瓜。属性集包括买瓜时要考虑的各个因素:色泽、根蒂、敲声、纹理等等。
我们看到,这是一个递归函数,他在前两个“如果”中各有一个停止条件,在最后一行递归地调用自己。
接下来,我们就要讨论,代码中部“寻找最优化分属性”这一步是如何进行的。
二、寻找最优划分属性
1.信息、信息熵和信息增益
首先,如果一件事情有i种可能的结果,每种结果 xi x i 发生的概率为 p(xi) p ( x i ) ,则要确定这件事的结果为 xi x i 所需的信息为 I(xi)=−log2p(xi) I ( x i ) = − l o g 2 p ( x i ) 。
我们来理解一下这个公式。针对抛硬币这个事件,一共有两个结果 x1 x 1 =正面 和 x2 x 2 =反面 。他们各自的概率 p(x1)=p(x2)=0.5 p ( x 1 ) = p ( x 2 ) = 0.5 。带入上面的公式中,得到:
确定抛硬币结果所需的信息 = I(xi)=−log2p(xi)=−log2(0.5)=1(bit) I ( x i ) = − l o g 2 p ( x i ) = − l o g 2 ( 0.5 ) = 1 ( b i t ) , 即,我们需要1比特的信息来知道抛硬币得到的是正面还是反面。我们知道,1比特代表1或0,所以这信息的定义也是符合我们的直观感受的。
之所以这里的信息单位为比特,是因为我们在上面的式子里用了以2为底取对数。如果是 logep(xi) l o g e p ( x i ) 即 lnp(xi) l n p ( x i ) ,那信息的单位就是nat;如果是以10为底的 lgp(xi) l g p ( x i ) ,那单位就是Hart。在本文中,我们使用以2为底取对数。
接下来我们要讨论信息熵的概念。在1948年,香农将热力学的熵(entropy)引入到信息论,因此信息熵又被称为香农熵。有趣的是,最开始当香农写完信息论时,实际上是冯诺依曼对香农建议用“熵”这个术语,因为大家都不知道香农说的是什么意思。
我们可以这样理解:信息熵是度量一个集合中,样本混乱度的一种指标。越复杂,信息熵的值越大。
信息熵的定义为