文章目录
决策树 (Decision tree) 是一种基本的分类与回归方法。它是一个树形结构,对于指定特征空间上的数据点来说,总能顺着决策树的根节点一步步分配到子节点最终到达叶节点,而叶节点表示了该数据点所属的分类。在每一次分配到子节点的过程中可以看作是对数据点中特有的特征属性值进行的 if-then
判断。
决策树可以认为是 if-then
规则的集合,也可以认为时定义在特征空间与类空间上的条件概率分布。其主要优点是模型具有可读性,分类速度快。如何得到该决策树叫做决策树学习,决策树学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测试,对新的数据,利用决策树模型进行分类。
接下来按照周志华老师的《机器学习》第 4 章[1] 来梳理一下对决策树的学习:
1. 决策树学习
决策树学习的目的是为了生成一颗泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单而直观的 分而治之 (Divide and Conquer) 策略,如下图所示:
决策树的生成是一个自根结点一直到叶结点的递归生成过程。
在递归生成的伪代码表述中,可以看到,有三个地方导致递归返回:
- (行 3) 当前结点包含的样本全部属于同一个类别,无需划分;
- (行 6) 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分。在这种情况下,把当前结点标记为叶结点,并且将其类别设定为该结点所含样本最多的类别;
- (行 12) 当前结点包含的样本集和为空,不能划分,把当前结点标记为叶结点,但是将其类别设定为其父结点所含样本最多的类别,周志华老师的《机器学习》中在该条件下执行了
return
,但是按照我的理解由于这里处于for
循环中,虽然属性中的一个取值样本集合为空,但是其它取值情况下还有有可能有样本集合的,如果这里执行了return
,那么就跳过了其它取值判断的可能。
另外,其中第 14 行 A \ { a ∗ } A \backslash \lbrace a_\ast \rbrace A\{ a∗} 表示从 A A A 中去除 a ∗ a_\ast a∗ 属性。
2. 最优划分属性的选择
从递归生成伪代码图示中可以看出,(行 8)选择最优划分属性 a ∗ a_\ast a∗ 是最关键的一步。如何选择决定了决策树的效率与准确率。一般而言我们希望选择一个属性 a ∗ a_\ast a∗ 之后,其分支节点所包含的样本尽可能属于同一类别,即结点的 纯度 (Purity) 越来越高。
根据最优属性 a ∗ a_\ast a∗ 选择方法的不同,决策树大致分为了 ID3 [Quinlan, 1986]、C4.5 [Quinlan, 1993]、CART [Breiman et al., 1984]。
接下来分别介绍三种方法,在之前,先给出周志华老师《机器学习》中表 4.1 4.1 4.1 中的西瓜数据如下:
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
---|---|---|---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
8 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
2.1 信息增益 - ID3
2.1.1 什么是信息增益
按照周志华老师《机器学习》中第 4.2.1 4.2.1 4.2.1 小节中所述,假定离散属性 a a a 有 V V V 个可能的取值 { a 1 , a 2 , . . . , a V } \lbrace a_1,a_2,...,a_V \rbrace { a1,a2,...,aV},若使用 a a a 来对样本集 D D D 进行划分,会产生 V V V 个分支结点,其中第 v v v 个分支结点包含了 D D D 中所有在属性 a a a 上取值为 a v a_v av 的样本,记为 D v D_v Dv,其对应的信息熵为:
H ( D v ) = − ∑ k ∈ Y p ( k ∣ v ) log p ( k ∣ v ) = − ∑ k ∈ Y ∣ D v k ∣ ∣ D v ∣ log ∣ D v k ∣ ∣ D v ∣ H(D_v)=-\sum_{k \in \mathcal{Y}}p(k\mid v)\log p(k \mid v)=-\sum_{k \in \mathcal{Y}}\frac{|D_{vk}|}{|D_v|}\log \frac{|D_{vk}|}{|D_v|} H(Dv)=−k∈Y∑p(k∣v)logp(k∣v)=−k∈Y∑∣Dv∣∣Dvk∣log∣Dv∣∣Dvk∣
其中 D v k D_{vk} Dvk 表示 D v D_v Dv 中分类为 k k k 的样本。再考虑到不同的分支 v v v 结点所包含的样本数不同,给分支结点赋予权重 ∣ D v ∣ / ∣ D ∣ |D_v|/|D| ∣Dv∣/∣D∣,于是可以计算出属性 a a a 对样本集 D D D 进行划分所获得的 信息增益 (Information gain):
Gain ( D , a ) = H ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ H ( ∣ D v ∣ ) = H ( D ) − H ( D , a ) = I ( D , a ) \textrm{Gain}(D,a)=H(D)-\sum_{v=1}^V \frac{|D_v|}{|D|}H(|D_v|)=H(D)-H(D,a)=I(D,a) Gain(D,a)=H(D)−v=1∑V∣D∣∣Dv∣H(∣Dv∣)=H(D)−H(D,a)=I(D,a)
其实,信息增益就是训练数据集 D D D 中的类别与某一属性之间(或者两个属性之间的,因为最终决策树的目的是要进行分类,所以在决策树的每一个分支判断时都用类别与对应的属性进行信息增益比较)的互信息。我们知道,互信息表示了两事件发生所代表的信息之间的重复部分,当两事件信息重复的部分越大,那么采用一种事件为标准来划分另一种事件所能确定的部分也就越大,也就是说采用属性 a a a 来进行划分所获得的“纯度提升”越大。考虑极端情况,当属性 a a a 与类别完全没有关系时,其互信息为 0 0 0,这时候采用 a a a 属性作为划分标准对于数据集的类别确认完全没有帮助;当属性 a a a 的各属性分别与数据集的类别一一对应时,也就是其概率分布完全相同,那么根据互信息的计算公式,其互信息等于各自的熵,也就是说,如果我们采用 a a a 进行数据的划分,那么数据可以完全干净的划分出来,也就不再含有额外的不可知信息了。
当决策树中选择最优划分属性(行 8)按照信息增益最大来进行时,决策树属于 ID3 决策树。
2.1.2 ID3 树中最优划分属性计算举例
根据上节给出的西瓜数据集,我们学习一个对瓜好坏判断的决策树。在这个例子中分类个数为 2 2 2 (是好瓜、不是好瓜),即 Y = 2 \mathcal{Y}=2 Y=2。在决策树学习开始时,根结点包含 D D D 中所有样例,正例占 p 1 = 8 17 p_1=\frac{8}{17} p1=178,反例占 p 2 = 9 17 p_2=\frac{9}{17} p2=179。根结点的信息熵(下面我们都以比特为单位计算)为:
H ( D ) = − ∑ k = 1 2 p ( k ) log 2 p ( k ) = − ( 8 17 log 2 8 17 + 9 17 log 2 9 17 ) = 0.998 H(D)=-\sum_{k=1}^2p(k)\log_2 p(k)=-\left(\frac{8}{17}\log_2\frac{8}{17}+\frac{9}{17}\log_2\frac{9}{17}\right)=0.998 H(D)=−k=1∑2p(k)log2p(k)=−(178log2178+179log2179)=0.998
然后我们要计算出与当前属性集合 {色泽、根蒂、敲声、纹理、脐部、触感}中每个属性的信息增益,也就是对应的互信息。以属性“色泽”为例,它有 3 3 3 个可能取值:{青绿、乌黑、浅白}。以该属性对数据集进行划分,可以得到 3 3 3 个子集,分别为: D 1 D_1 D1(色泽=青绿)、 D 2 D_2 D2(色泽=乌黑)、 D 3 D_3 D3(色泽=浅白)。
对子集 D 1 D_1 D1 来说,包含了编号为 { 1 , 4 , 6 , 10 , 13 , 17 } \lbrace1,4,6,10,13,17\rbrace { 1,4,6,10,13,17} 的 6 6 6 个样例,其中正例为 { 1 , 4 , 6 } \lbrace1,4,6\rbrace { 1,4,6},占 p 1 = 3 6 p_1=\frac{3}{6} p1=63 ;反例为 { 10 , 13 , 17 } \lbrace10,13,17\rbrace { 10,13,17},占 p 1 = 3 6 p_1=\frac{3}{6} p