一、决策树(Decision Tree)
决策树是一种树形结构,一棵决策树包含一个根节点、若干个内部结点和若干个叶结点:叶结点对应于决策结果,其他每个结点则对应于一个属性测试。每个结点包含的样本集合根据属性测试的结果被划分到子结点中,根结点包含样本全集,从根结点到每个叶子结点的路径对应了一个判定测试序列。
常见的决策树生成算法有ID3决策树(信息增益)、 C4.5决策树(信息增益率)和CART决策树(基尼指数)等。
分类树(决策树)是一种十分常用的分类方法,也是一种监督学习的方法。所谓监督学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。这样的机器学习就被称之为监督学习。
决策树的生成是一个递归的过程。在决策树基本算法中,有三种情形会导致递归返回:
- 当前节点包含的样本全属于同一类别,无需划分;
- 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;
- 当前节点包含的样本集合为空,不能划分;
举例 -> 西瓜数据集2.0(色泽、根蒂、敲声、纹理、脐部、触感)
西瓜数据集2.0
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
---|---|---|---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
8 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
决策树学习的关键在于如何选择最优的划分属性,所谓的最优划分属性,就是尽量使划分的样本属于同一类别。根据属性划分后,数据集中属于同一类别的数据越多,树节点“纯度”越高。如何选择划分属性的策略是区分不同决策树模型的关键。
决策树算法本质上就是要找出每一列属性的最佳划分以及不同属性列划分的先后顺序及排布。
优点:
- 简单直观,生成的决策树很直观。
- 基本不需要预处理,不需要提前归一化和处理缺失值。
- 既可以处理离散值也可以处理连续值。
- 决策树在逻辑上可以很好解释。
- 可以交叉验证的剪枝来选择模型,从而提高泛化能力。
缺点:
- 决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
- 决策树会因为样本发生一点的改动,导致树结构的剧烈改变。
- 如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。
- 无论ID3,C4.5,CART都是选择一个最优的特征做分类决策,但大多数分类的决策不是由某一个特征决定,而是一组特征确定的。
二、信息增益
信息熵
信息量是对信息的度量,就跟时间的度量是秒一样。信息的多少用信息量来衡量,我们接受到的信息量跟具体发生的事件有关。信息量的大小跟随机事件的概率有关。越小概率的事情发生了产生的信息量越大,如某各地方发生了地震。越大概率的事情发生了产生的信息量越小,如太阳从东边升起来了(肯定发生嘛,没什么信息量)。因此一个具体事件的信息量应该是随着其发生概率的增大而递减的,且不能为负。
信息量度量的是一个具体事件发生了所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望。
信息熵是度量样本集合(树节点)纯度的一种最常用的指标之一。
样本集合为D,其中 k 表示第k类样本,p(k)表示第k类样本所占的比例,|Y|表示样本总的类别数。信息熵的计算公式如下
E
n
t
(
D
)
=
−
∑
k
=
1
∣
Y
∣
p
k
log
2
p
k
(1)
Ent(D)=− \sum^{|Y|}_{k=1} p_k\log_2p_k \tag{1}
Ent(D)=−k=1∑∣Y∣pklog2pk(1)
注意:若
p
k
p_k
pk=0,约定(或者规定):
p
k
l
o
g
2
p
k
p_klog_2p_k
pklog2pk= 0
Ent(D)的值越小,D的纯度越高。这个公式也决定了信息增益的一个缺点:即信息增益对可取值数目多的特征有偏好,即该属性能取得值越多,信息增益越偏向这个属性。因为特征可取的值越多,会导致“纯度”越大,即Ent(D)会很小,如果一个特征的离散个数与样本数相等,那么Ent(D)值会为0。
条件熵
条件熵的定义:在一个已知条件下,所有可能发生事件所带来的信息量的期望。
基于某一个特征的条件熵越小,表示该特征所带来的信息量越大,事件发生的不确定性就越小。
条件熵是按一个特征的每个值对原数据集进行分类,然后在每一个小类里面,都计算一个信息熵,然后每一个信息熵乘以各个类别的概率,然后求和。计算公式如下:
假定离散特征 a 有V可能的取值{
a
1
a^1
a1,
a
2
a^2
a2, … ,
a
v
a^v
av},如果使用特征 a 来对数据集 D 进行划分,则会产生 V 个分支结点(树节点),其中第 v 个分支结点包含了 D 中所有在特征 a 上取值为
a
v
a_v
av 的数据,记为
D
v
D^v
Dv 。考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重
∣
D
v
∣
∣
D
∣
\frac {|D_v|} {|D|}
∣D∣∣Dv∣ ,即样本数越多的分支结点的影响越大。
E
n
t
(
D
∣
a
)
=
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
(2)
Ent(D|a)= \sum^{V}_{v=1}{\frac{|D^v|}{|D|}} Ent(D^v) \tag{2}
Ent(D∣a)=v=1∑V∣D∣∣Dv∣Ent(Dv)(2)
信息增益
当我们使用一个特征对原数据进行分类后,原数据集的不确定性就会减小了,因为新增了一个特征的信息,不确定程度减少了多少就是信息的增益。原数据集的信息熵减去基于某个特征的条件熵,所得到的结果便是信息增益。信息增益越大,表示该特征所带来的信息量越大,数据集中的不确定性就越小。
在决策树算法的学习过程中,信息增益是特征选择的一个重要指标,它定义为一个特征能够为分类系统带来多少信息,带来的信息越多,说明该特征越重要,相应的信息增益也就越大。对一个特征而言,系统有它和没它时信息量将发生变化,而前后信息量的差值就是这个特征给系统带来的信息量,即信息增益。
换句话说,信息增益代表了在一个条件下,信息复杂度(不确定性)减少的程度。在决策树算法中,我们的关键就是每次选择一个特征,特征有多个,那么到底按照什么标准来选择哪一个特征。这个问题可以用信息增益来度量。如果选择一个特征后,信息增益最大(信息不确定性减少的程度最大),那么我们就选取这个特征。
信息增益的计算公式如下:
G
(
D
,
a
)
=
E
n
t
(
D
)
−
E
n
t
(
D
∣
a
)
(3)
G(D,a)=Ent(D) - Ent(D|a) \tag{3}
G(D,a)=Ent(D)−Ent(D∣a)(3)
根据西瓜数据集2.0举例:
好瓜 | 数量 | id集合 |
---|---|---|
是 | 8 | 1,2,3,4,5,6,7,8 |
否 | 9 | 9,10,11,12,13,14,15,16,17 |
E n t ( D ) = − ( ( 8 17 ∗ l o g 2 8 17 ) + ( 9 17 ∗ l o g 2 9 17 ) ) = 0.998 \begin{aligned} Ent(D) &= -(({\frac{8}{17}} * log_2{\frac{8}{17}}) + ({\frac{9}{17}} * log_2{\frac{9}{17}})) \\ &=0.998 \\ \end{aligned} Ent(D)=−((178∗log2178)+(179∗log2179))=0.998
此处选择特征 a = “色泽” 作为例子,计算条件熵:
色泽 | 数量 | id集合 |
---|---|---|
青绿 | 6 | 1(是),4(是),6(是),10(否),13(否),17(否) |
乌黑 | 6 | 2(是),3(是),7(是),8(是),9(否),15(否) |
浅白 | 5 | 5(是),11(否),12(否),14(否),16(否) |
特征 a=“色泽” 的每个取值的信息熵如下:
E
n
t
(
D
v
=
"
青
绿
"
)
=
−
(
(
3
6
∗
l
o
g
2
3
6
)
+
(
3
6
∗
l
o
g
2
3
6
)
)
=
1.000
Ent(D^{v="青绿"}) = - (({\frac{3}{6}} * log_2{\frac{3}{6}}) + ({\frac{3}{6}} * log_2{\frac{3}{6}})) =1.000
Ent(Dv="青绿")=−((63∗log263)+(63∗log263))=1.000
E n t ( D v = " 乌 黑 " ) = − ( ( 4 6 ∗ l o g 2 4 6 ) + ( 4 6 ∗ l o g 2 4 6 ) ) = 0.918 Ent(D^{v="乌黑"}) = - (({\frac{4}{6}} * log_2{\frac{4}{6}}) + ({\frac{4}{6}} * log_2{\frac{4}{6}})) =0.918 Ent(Dv="乌黑")=−((64∗log264)+(64∗log264))=0.918
E n t ( D v = " 浅 白 " ) = − ( ( 1 5 ∗ l o g 2 1 5 ) + ( 4 5 ∗ l o g 2 4 5 ) ) = 0.722 Ent(D^{v="浅白"}) = - (({\frac{1}{5}} * log_2{\frac{1}{5}}) + ({\frac{4}{5}} * log_2{\frac{4}{5}})) =0.722 Ent(Dv="浅白")=−((51∗log251)+(54∗log254))=0.722
特征 a=“色泽” 的条件熵如下:
E
n
t
(
D
∣
a
=
"
色
泽
"
)
=
∣
D
v
=
"
青
绿
"
∣
∣
D
∣
∗
E
n
t
(
D
v
=
"
青
绿
"
)
+
∣
D
v
=
"
乌
黑
"
∣
∣
D
∣
∗
E
n
t
(
D
v
=
"
乌
黑
"
)
+
∣
D
v
=
"
浅
白
"
∣
∣
D
∣
∗
E
n
t
(
D
v
=
"
浅
白
"
)
=
6
17
∗
1.000
+
6
17
∗
0.918
+
5
17
∗
0.722
=
0.889
\begin{aligned} Ent(D|a="色泽") &={\frac{|D^{v="青绿"}|}{|D|}} * Ent(D^{v="青绿"}) + {\frac{|D^{v="乌黑"}|}{|D|}} * Ent(D^{v="乌黑"}) + {\frac{|D^{v="浅白"}|}{|D|}} * Ent(D^{v="浅白"})\\ &={\frac{6}{17}} * 1.000 + {\frac{6}{17}} * 0.918 + {\frac{5}{17}} * 0.722 \\ &=0.889 \end{aligned}
Ent(D∣a="色泽")=∣D∣∣Dv="青绿"∣∗Ent(Dv="青绿")+∣D∣∣Dv="乌黑"∣∗Ent(Dv="乌黑")+∣D∣∣Dv="浅白"∣∗Ent(Dv="浅白")=176∗1.000+176∗0.918+175∗0.722=0.889
特征 a=“色泽” 的信息增益如下:
G
a
i
n
(
D
,
a
=
"
色
泽
"
)
=
E
n
t
(
D
)
−
E
n
t
(
D
∣
a
=
"
色
泽
"
)
=
0.998
−
0.889
=
0.109
\begin{aligned} Gain(D,a="色泽") &= Ent(D) - Ent(D|a="色泽") \\ &= 0.998 - 0.889 \\ &= 0.109 \end{aligned}
Gain(D,a="色泽")=Ent(D)−Ent(D∣a="色泽")=0.998−0.889=0.109
同理计算其它特征的信息增益:
G
a
i
n
(
D
,
a
=
"
根
蒂
"
)
=
0.143
G
a
i
n
(
D
,
a
=
"
敲
声
"
)
=
0.141
G
a
i
n
(
D
,
a
=
"
纹
理
"
)
=
0.381
G
a
i
n
(
D
,
a
=
"
脐
部
"
)
=
0.289
G
a
i
n
(
D
,
a
=
"
触
感
"
)
=
0.006
\begin{aligned} &Gain(D,a="根蒂") = 0.143 \\ &Gain(D,a="敲声") = 0.141 \\ &Gain(D,a="纹理") = 0.381 \\ &Gain(D,a="脐部") = 0.289 \\ &Gain(D,a="触感") = 0.006 \\ \end{aligned}
Gain(D,a="根蒂")=0.143Gain(D,a="敲声")=0.141Gain(D,a="纹理")=0.381Gain(D,a="脐部")=0.289Gain(D,a="触感")=0.006
可见,特征 a=“纹理” 的信息增益最大,因此第一步划分使用特征“纹理”作为最优的划分属性。划分结果如下:
第一步划分结束,纹理=清晰的瓜和纹理=稍糊的瓜有好有坏,需要继续根据特征划分,而纹理=模糊的瓜全是坏瓜,不需要继续划分。在需要划分的分支结点中继续重复上述步骤,以纹理=清晰的分支结点为例:
好瓜 | 数量 | id集合 |
---|---|---|
是 | 7 | 1,2,3,4,5,6,8 |
否 | 2 | 10,15 |
E n t ( D [ " 纹 理 = 清 晰 " ] ) = − ( ( 7 9 ∗ l o g 2 7 9 ) + ( 2 9 ∗ l o g 2 2 9 ) ) = 0.764 \begin{aligned} Ent(D["纹理=清晰"]) &= -(({\frac{7}{9}} * log_2{\frac{7}{9}}) + ({\frac{2}{9}} * log_2{\frac{2}{9}})) \\ &= 0.764 \end{aligned} Ent(D["纹理=清晰"])=−((97∗log297)+(92∗log292))=0.764
以特征 a=“色泽” 为例计算条件熵:
色泽 | 数量 | id集合 |
---|---|---|
青绿 | 4 | 1(是),4(是),6(是),10(否) |
乌黑 | 4 | 2(是),3(是),8(是),15(否) |
浅白 | 1 | 5(是) |
特征 a=“色泽” 的每个取值的信息熵如下:
E
n
t
(
D
[
"
纹
理
=
清
晰
"
]
v
=
"
青
绿
"
)
=
−
(
(
3
4
∗
l
o
g
2
3
4
)
+
(
1
4
∗
l
o
g
2
1
4
)
)
=
0.811
Ent(D["纹理=清晰"]^{v="青绿"}) = - (({\frac{3}{4}} * log_2{\frac{3}{4}}) + ({\frac{1}{4}} * log_2{\frac{1}{4}})) =0.811
Ent(D["纹理=清晰"]v="青绿")=−((43∗log243)+(41∗log241))=0.811
E n t ( D [ " 纹 理 = 清 晰 " ] v = " 乌 黑 " ) = − ( ( 3 4 ∗ l o g 2 3 4 ) + ( 1 4 ∗ l o g 2 1 4 ) ) = 0.811 Ent(D["纹理=清晰"]^{v="乌黑"}) = - (({\frac{3}{4}} * log_2{\frac{3}{4}}) + ({\frac{1}{4}} * log_2{\frac{1}{4}})) =0.811 Ent(D["纹理=清晰"]v="乌黑")=−((43∗log243)+(41∗log241))=0.811
E n t ( D [ " 纹 理 = 清 晰 " ] v = " 浅 白 " ) = − ( ( 1 1 ∗ l o g 2 1 1 ) + ( 0 1 ∗ l o g 2 0 1 ) ) = 0.000 Ent(D["纹理=清晰"]^{v="浅白"}) = - (({\frac{1}{1}} * log_2{\frac{1}{1}})+({\frac{0}{1}} * log_2{\frac{0}{1}})) =0.000 Ent(D["纹理=清晰"]v="浅白")=−((11∗log211)+(10∗log210))=0.000
特征 a=“色泽” 的条件熵如下:
E
n
t
(
D
[
"
纹
理
=
清
晰
"
]
∣
a
=
"
色
泽
"
)
=
∣
D
[
"
纹
理
=
清
晰
"
]
v
=
"
青
绿
"
∣
∣
D
[
"
纹
理
=
清
晰
"
]
∣
∗
E
n
t
(
D
[
"
纹
理
=
清
晰
"
]
v
=
"
青
绿
"
)
+
∣
D
[
"
纹
理
=
清
晰
"
]
v
=
"
乌
黑
"
∣
∣
D
[
"
纹
理
=
清
晰
"
]
∣
∗
E
n
t
(
D
[
"
纹
理
=
清
晰
"
]
v
=
"
乌
黑
"
)
+
∣
D
[
"
纹
理
=
清
晰
"
]
v
=
"
浅
白
"
∣
∣
D
[
"
纹
理
=
清
晰
"
]
∣
∗
E
n
t
(
D
[
"
纹
理
=
清
晰
"
]
v
=
"
浅
白
"
)
=
4
9
∗
0.881
+
4
9
∗
0.881
+
1
9
∗
0.000
=
0.721
\begin{aligned} Ent(D["纹理=清晰"]|a="色泽") &={\frac{|D["纹理=清晰"]^{v="青绿"}|}{|D["纹理=清晰"]|}} * Ent(D["纹理=清晰"]^{v="青绿"}) \\ &+ {\frac{|D["纹理=清晰"]^{v="乌黑"}|}{|D["纹理=清晰"]|}} * Ent(D["纹理=清晰"]^{v="乌黑"}) \\ &+ {\frac{|D["纹理=清晰"]^{v="浅白"}|}{|D["纹理=清晰"]|}} * Ent(D["纹理=清晰"]^{v="浅白"}) \\ &={\frac{4}{9}} * 0.881 + {\frac{4}{9}} * 0.881 +{\frac{1}{9}} * 0.000 \\ &=0.721 \end{aligned}
Ent(D["纹理=清晰"]∣a="色泽")=∣D["纹理=清晰"]∣∣D["纹理=清晰"]v="青绿"∣∗Ent(D["纹理=清晰"]v="青绿")+∣D["纹理=清晰"]∣∣D["纹理=清晰"]v="乌黑"∣∗Ent(D["纹理=清晰"]v="乌黑")+∣D["纹理=清晰"]∣∣D["纹理=清晰"]v="浅白"∣∗Ent(D["纹理=清晰"]v="浅白")=94∗0.881+94∗0.881+91∗0.000=0.721
特征 a=“色泽” 的信息增益如下:
G
a
i
n
(
D
[
"
纹
理
=
清
晰
"
]
,
a
=
"
色
泽
"
)
=
E
n
t
(
D
[
"
纹
理
=
清
晰
"
]
)
−
E
n
t
(
D
[
"
纹
理
=
清
晰
"
]
∣
a
=
"
色
泽
"
)
=
0.764
−
0.721
=
0.043
\begin{aligned} Gain(D["纹理=清晰"],a="色泽") &= Ent(D["纹理=清晰"]) - Ent(D["纹理=清晰"]|a="色泽") \\ &= 0.764 - 0.721 \\ &= 0.043 \end{aligned}
Gain(D["纹理=清晰"],a="色泽")=Ent(D["纹理=清晰"])−Ent(D["纹理=清晰"]∣a="色泽")=0.764−0.721=0.043
同理计算其它特征的信息增益:
G
a
i
n
(
D
[
"
纹
理
=
清
晰
"
]
,
a
=
"
根
蒂
"
)
=
0.458
G
a
i
n
(
D
[
"
纹
理
=
清
晰
"
]
,
a
=
"
敲
声
"
)
=
0.331
G
a
i
n
(
D
[
"
纹
理
=
清
晰
"
]
,
a
=
"
脐
部
"
)
=
0.458
G
a
i
n
(
D
[
"
纹
理
=
清
晰
"
]
,
a
=
"
触
感
"
)
=
0.458
\begin{aligned} &Gain(D["纹理=清晰"],a="根蒂") = 0.458 \\ &Gain(D["纹理=清晰"],a="敲声") = 0.331 \\ &Gain(D["纹理=清晰"],a="脐部") = 0.458 \\ &Gain(D["纹理=清晰"],a="触感") = 0.458 \\ \end{aligned}
Gain(D["纹理=清晰"],a="根蒂")=0.458Gain(D["纹理=清晰"],a="敲声")=0.331Gain(D["纹理=清晰"],a="脐部")=0.458Gain(D["纹理=清晰"],a="触感")=0.458
可见,特征 a=“根蒂” 的信息增益最大,因此第二步划分使用特征“根蒂”作为最优的划分属性。划分结果如下:
至此,对纹理=清晰的结点数据的二次划分结束,得到如上二叉树。同理完成对上述未完全划分的结点数据进行划分,得到结果二叉树,如下图所示:
ID3决策树学习算法
ID3算法是决策树的一种,即Iterative Dichotomiser 3,迭代二叉树3代。在信息论中,期望信息越小,那么信息增益就越大,从而纯度就越高。ID3算法的核心思想就是以信息增益来度量属性的选择,选择分裂后信息增益最大的属性进行分裂,因为信息增益越大,区分样本的能力就越强,越具有代表性。
熵这个概念最早起源于物理学,在物理学中是用来度量一个热力学系统的无序程度,而在信息学里面,熵是对不确定性的度量。在1948年,香农引入了信息熵,将其定义为离散随机事件出现的概率,一个系统越是有序,信息熵就越低,反之一个系统越是混乱,它的信息熵就越高。所以信息熵可以被认为是系统有序化程度的一个度量。
三、增益率
由于信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,选择使用增益率(gain ratio)来选择最优划分属性。
增益率的本质: 在信息增益的基础之上除以一个惩罚参数。特征个数较多时,惩罚参数较大。特征个数较少时,惩罚参数较小。
惩罚参数:数据集D以特征a作为随机变量的熵,即:将特征a取值相同的样本划分到同一个子集中。
增益率的定义如下:
G
a
i
n
_
r
a
t
i
o
(
D
,
a
)
=
G
a
i
n
(
D
,
a
)
I
V
(
a
)
(4)
Gain\_ratio(D,a) = {\frac{Gain(D,a)}{IV(a)}} \tag{4}
Gain_ratio(D,a)=IV(a)Gain(D,a)(4)
其中:
I
V
(
a
)
=
−
∑
v
=
1
V
(
∣
D
v
∣
∣
D
∣
∗
l
o
g
2
∣
D
v
∣
∣
D
∣
)
(5)
IV(a) = − \sum^{V}_{v=1} ({\frac{|D^v|}{|D|}} * log_2{\frac{|D^v|}{|D|}}) \tag{5}
IV(a)=−v=1∑V(∣D∣∣Dv∣∗log2∣D∣∣Dv∣)(5)
IV(a)称为特征 a 的固有值。特征 a 的可能取值数目越多(即V越大),则IV(a)的值通常也越大。增益率准则对可取值数目较少的特征有所偏好,因此不直接选择增益率最大的候选划分属性,而是先从候选划分属性中找出信息增益高于平均水平的属性,在从中选择增益率最高的特征。
I
V
(
a
=
"
色
泽
"
)
=
−
(
6
17
∗
l
o
g
2
6
17
+
6
17
∗
l
o
g
2
6
17
+
5
17
∗
l
o
g
2
5
17
)
=
1.580
(
V
=
3
)
\begin{aligned} IV(a="色泽") &= - ({\frac{6}{17}}*log_2{\frac{6}{17}} + {\frac{6}{17}}*log_2{\frac{6}{17}} + {\frac{5}{17}}* log_2{\frac{5}{17}}) \\ &= 1.580 (V = 3) \\ \end{aligned}
IV(a="色泽")=−(176∗log2176+176∗log2176+175∗log2175)=1.580(V=3)
I
V
(
a
=
"
根
蒂
"
)
=
−
(
8
17
∗
l
o
g
2
8
17
+
7
17
∗
l
o
g
2
7
17
+
2
17
∗
l
o
g
2
2
17
)
=
1.402
(
V
=
3
)
\begin{aligned} IV(a="根蒂") &= - ({\frac{8}{17}}*log_2{\frac{8}{17}} + {\frac{7}{17}}*log_2{\frac{7}{17}} + {\frac{2}{17}}* log_2{\frac{2}{17}}) \\ &= 1.402 (V = 3)\\ \end{aligned}
IV(a="根蒂")=−(178∗log2178+177∗log2177+172∗log2172)=1.402(V=3)
I
V
(
a
=
"
敲
声
"
)
=
−
(
10
17
∗
l
o
g
2
10
17
+
5
17
∗
l
o
g
2
5
17
+
2
17
∗
l
o
g
2
2
17
)
=
1.333
(
V
=
3
)
\begin{aligned} IV(a="敲声") &= - ({\frac{10}{17}}*log_2{\frac{10}{17}} + {\frac{5}{17}}*log_2{\frac{5}{17}} + {\frac{2}{17}}* log_2{\frac{2}{17}}) \\ &= 1.333 (V = 3) \\ \end{aligned}
IV(a="敲声")=−(1710∗log21710+175∗log2175+172∗log2172)=1.333(V=3)
I
V
(
a
=
"
纹
理
"
)
=
−
(
9
17
∗
l
o
g
2
9
17
+
5
17
∗
l
o
g
2
5
17
+
3
17
∗
l
o
g
2
3
17
)
=
1.447
(
V
=
3
)
\begin{aligned} IV(a="纹理") &= - ({\frac{9}{17}}*log_2{\frac{9}{17}} + {\frac{5}{17}}*log_2{\frac{5}{17}} + {\frac{3}{17}}* log_2{\frac{3}{17}}) \\ &= 1.447 (V = 3) \\ \end{aligned}
IV(a="纹理")=−(179∗log2179+175∗log2175+173∗log2173)=1.447(V=3)
I
V
(
a
=
"
脐
部
"
)
=
−
(
7
17
∗
l
o
g
2
7
17
+
6
17
∗
l
o
g
2
6
17
+
4
17
∗
l
o
g
2
4
17
)
=
0.987
(
V
=
3
)
\begin{aligned} IV(a="脐部") &= - ({\frac{7}{17}}*log_2{\frac{7}{17}} + {\frac{6}{17}}*log_2{\frac{6}{17}} + {\frac{4}{17}}* log_2{\frac{4}{17}}) \\ &= 0.987 (V = 3) \\ \end{aligned}
IV(a="脐部")=−(177∗log2177+176∗log2176+174∗log2174)=0.987(V=3)
I
V
(
a
=
"
触
感
"
)
=
−
(
12
17
∗
l
o
g
2
12
17
+
5
17
∗
l
o
g
2
5
17
)
=
0.874
(
V
=
2
)
\begin{aligned} IV(a="触感")& = - ({\frac{12}{17}}*log_2{\frac{12}{17}} + {\frac{5}{17}}*log_2{\frac{5}{17}} ) \\ &= 0.874 (V = 2) \\ \end{aligned}
IV(a="触感")=−(1712∗log21712+175∗log2175)=0.874(V=2)
特征 | Gain(D, a) | IV(a) | Gain_ratio(D, a) |
---|---|---|---|
色泽 | 0.109 | 1.580 | 0.069 |
根蒂 | 0.143 | 1.402 | 0.102 |
敲声 | 0.141 | 1.333 | 0.106 |
纹理 | 0.381 | 1.447 | 0.263 |
脐部 | 0.289 | 0.987 | 0.293 |
触感 | 0.006 | 0.874 | 0.007 |
其中 Gain(D, a) ‾ \overline{\text{Gain(D, a)}} Gain(D, a) = 0.178,选择信息增益大于平均信息增益的特征,从中选择出增益率最大的特征进行初步划分。因此第一步特征划分选择脐部作为最优划分特征。
然后在未完全的划分的子结点中继续使用增益率进行划分,直到所有瓜都划分完成。
C4.5决策树算法
从实际的计算公式可以知道,增益率在信息增益的基础上增加了**固有值IV(a)**去缓解信息增益对特征取值较多的偏好,提高其泛化能力。比如西瓜数据中的编号如果作为特征,在决策树中将产生17个分支结点,并且每个分支结点的纯度都达到了最大,这种情况下构建地决策树并不具有泛化能力。
C4.5决策树算法依托于信息增益率来构建的决策树,是ID3算法的一种延伸和优化。C4.5算法对ID3算法主要做了一下几点改进:
(1)通过信息增益率选择分裂属性,克服了ID3算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足;
(2)能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理;
(3)构造决策树之后进行剪枝操作;
(4)能够处理具有缺失属性值的训练数据。
四、基尼指数
基尼指数同样可以描述一个随机变量的不确定性的程度,表示在样本集合中一个随机选中的样本被分错的概率。
注意: Gini指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高。反之,集合越不纯。
即 基尼指数(基尼不纯度) = 样本被选中的概率 * 样本被分错的概率
说明:
-
p k p_k pk 表示选中的样本属于k类别的概率,则这个样本被分错的概率是(1- p k p_k pk);
-
样本集合中有K个类别,一个随机选中的样本可以属于这k个类别中的任意一个,因而对类别就加和;
数据集 D 的纯度使用基尼值来度量:
G
i
n
i
(
D
)
=
∑
k
=
1
∣
Y
∣
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
∣
Y
∣
p
k
2
(6)
\begin{aligned} Gini(D) &= \sum^{|Y|}_{k=1}p_k(1 - p_k) \\ &= 1 - \sum^{|Y|}_{k=1}p_k^2 \\ \end{aligned} \tag{6}
Gini(D)=k=1∑∣Y∣pk(1−pk)=1−k=1∑∣Y∣pk2(6)
Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,则数据集D的纯度越高。
属性a的基尼指数的定义为:
G
i
n
i
_
i
n
d
e
x
(
D
,
a
)
=
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
∗
G
i
n
i
(
D
v
)
(7)
Gini\_index(D, a) = \sum^{V}_{v=1} {\frac{|D^v|}{|D|}} * Gini(D^v) \tag{7}
Gini_index(D,a)=v=1∑V∣D∣∣Dv∣∗Gini(Dv)(7)
在候选特征集合中,选择基尼指数最小的特征作为最优划分属性。
以西瓜数据集2.0举例:
此处选择特征 a = “色泽” 基尼值和基尼指数:
色泽 | 数量 | id集合 |
---|---|---|
青绿 | 6 | 1(是),4(是),6(是),10(否),13(否),17(否) |
乌黑 | 6 | 2(是),3(是),7(是),8(是),9(否),15(否) |
浅白 | 5 | 5(是),11(否),12(否),14(否),16(否) |
a=色泽特征的基尼值为:
G
i
n
i
(
"
色
泽
"
=
"
青
绿
"
)
=
1
−
(
(
3
6
)
2
+
(
3
6
)
2
)
=
0.500
\begin{aligned} &Gini("色泽"="青绿") = 1 - (({\frac{3}{6})^2} + ({\frac{3}{6}})^2) = 0.500 \\ \end{aligned}
Gini("色泽"="青绿")=1−((63)2+(63)2)=0.500
G
i
n
i
(
"
色
泽
"
=
"
乌
黑
"
)
=
1
−
(
(
4
6
)
2
+
(
2
6
)
2
)
=
0.444
\begin{aligned} &Gini("色泽"="乌黑") = 1 - (({\frac{4}{6})^2} + ({\frac{2}{6}})^2) = 0.444 \\ \end{aligned}
Gini("色泽"="乌黑")=1−((64)2+(62)2)=0.444
G
i
n
i
(
"
色
泽
"
=
"
浅
白
"
)
=
1
−
(
(
1
5
)
2
+
(
4
5
)
2
)
=
0.320
\begin{aligned} &Gini("色泽"="浅白") = 1 - (({\frac{1}{5})^2} + ({\frac{4}{5}})^2) = 0.320 \\ \end{aligned}
Gini("色泽"="浅白")=1−((51)2+(54)2)=0.320
基尼指数为:
G
i
n
i
_
i
n
d
e
x
(
D
,
a
=
"
色
泽
"
)
=
(
6
17
∗
G
i
n
i
(
"
色
泽
"
=
"
青
绿
"
)
+
6
17
∗
G
i
n
i
(
"
色
泽
"
=
"
乌
黑
"
)
+
5
17
∗
G
i
n
i
(
"
色
泽
"
=
"
浅
白
"
)
)
=
(
6
17
∗
0.500
+
6
17
∗
0.444
+
5
17
∗
0.320
)
=
0.428
\begin{aligned} Gini\_index(D,a="色泽") &= ({\frac{6}{17}}*Gini("色泽"="青绿") + {\frac{6}{17}}*Gini("色泽"="乌黑") + {\frac{5}{17}}* Gini("色泽"="浅白")) \\ &= ({\frac{6}{17}}*0.500 + {\frac{6}{17}}*0.444 + {\frac{5}{17}}* 0.320) \\ &= 0.428 \end{aligned}
Gini_index(D,a="色泽")=(176∗Gini("色泽"="青绿")+176∗Gini("色泽"="乌黑")+175∗Gini("色泽"="浅白"))=(176∗0.500+176∗0.444+175∗0.320)=0.428
此处选择特征 a = “根蒂” 计算基尼值和基尼指数:
根蒂 | 数量 | id集合 |
---|---|---|
蜷缩 | 8 | 1(是),2(是),3(是),4(是),5(是),12(否),16(否),17(否) |
稍蜷 | 7 | 6(是),7(是),8(是),9(否),13(否),14(否),15(否) |
硬挺 | 2 | 10(否),11(否) |
a=根蒂特征的基尼值为:
G
i
n
i
(
"
根
蒂
"
=
"
蜷
缩
"
)
=
1
−
(
(
5
8
)
2
+
(
3
8
)
2
)
=
0.469
G
i
n
i
(
"
根
蒂
"
=
"
稍
蜷
"
)
=
1
−
(
(
3
7
)
2
+
(
4
7
)
2
)
=
0.490
G
i
n
i
(
"
根
蒂
"
=
"
硬
挺
"
)
=
1
−
(
(
2
2
)
2
+
(
0
2
)
2
)
=
0.000
\begin{aligned} &Gini("根蒂"="蜷缩") = 1 - (({\frac{5}{8})^2} + ({\frac{3}{8}})^2) = 0.469 \\ &Gini("根蒂"="稍蜷") = 1 - (({\frac{3}{7})^2} + ({\frac{4}{7}})^2) = 0.490 \\ &Gini("根蒂"="硬挺") = 1 - (({\frac{2}{2})^2} + ({\frac{0}{2}})^2) = 0.000 \\ \end{aligned}
Gini("根蒂"="蜷缩")=1−((85)2+(83)2)=0.469Gini("根蒂"="稍蜷")=1−((73)2+(74)2)=0.490Gini("根蒂"="硬挺")=1−((22)2+(20)2)=0.000
基尼指数为:
G
i
n
i
_
i
n
d
e
x
(
D
,
a
=
"
根
蒂
"
)
=
(
8
17
∗
G
i
n
i
(
"
根
蒂
"
=
"
蜷
缩
"
)
+
7
17
∗
G
i
n
i
(
"
根
蒂
"
=
"
稍
蜷
"
)
+
2
17
∗
G
i
n
i
(
"
根
蒂
"
=
"
硬
挺
"
)
)
=
(
8
17
∗
0.469
+
7
17
∗
0.490
+
2
17
∗
0.000
)
=
0.418
\begin{aligned} Gini\_index(D,a="根蒂") &= ({\frac{8}{17}}*Gini("根蒂"="蜷缩") + {\frac{7}{17}}*Gini("根蒂"="稍蜷") + {\frac{2}{17}}* Gini("根蒂"="硬挺")) \\ &= ({\frac{8}{17}}*0.469 + {\frac{7}{17}}*0.490 + {\frac{2}{17}}* 0.000) \\ &= 0.418 \end{aligned}
Gini_index(D,a="根蒂")=(178∗Gini("根蒂"="蜷缩")+177∗Gini("根蒂"="稍蜷")+172∗Gini("根蒂"="硬挺"))=(178∗0.469+177∗0.490+172∗0.000)=0.418
此处选择特征 a = “敲声” 计算基尼值和基尼指数:
敲声 | 数量 | id集合 |
---|---|---|
浊响 | 10 | 1(是),3(是),5(是),6(是),7(是),8(是),12(否),13(否),15(否),16(否) |
沉闷 | 5 | 2(是),4(是),9(是),14(否),17(否) |
清脆 | 2 | 10(否)11(否) |
a=敲声特征的基尼值为:
G
i
n
i
(
"
敲
声
"
=
"
浊
响
"
)
=
1
−
(
(
6
10
)
2
+
(
4
10
)
2
)
=
0.400
G
i
n
i
(
"
敲
声
"
=
"
沉
闷
"
)
=
1
−
(
(
3
5
)
2
+
(
2
5
)
2
)
=
0.480
G
i
n
i
(
"
敲
声
"
=
"
清
脆
"
)
=
1
−
(
(
2
2
)
2
+
(
0
2
)
2
)
=
0.000
\begin{aligned} &Gini("敲声"="浊响") = 1 - (({\frac{6}{10})^2} + ({\frac{4}{10}})^2) = 0.400 \\ &Gini("敲声"="沉闷") = 1 - (({\frac{3}{5})^2} + ({\frac{2}{5}})^2) = 0.480 \\ &Gini("敲声"="清脆") = 1 - (({\frac{2}{2})^2} + ({\frac{0}{2}})^2) = 0.000 \\ \end{aligned}
Gini("敲声"="浊响")=1−((106)2+(104)2)=0.400Gini("敲声"="沉闷")=1−((53)2+(52)2)=0.480Gini("敲声"="清脆")=1−((22)2+(20)2)=0.000
基尼指数为:
G
i
n
i
_
i
n
d
e
x
(
D
,
a
=
"
敲
声
"
)
=
(
10
17
∗
G
i
n
i
(
"
敲
声
"
=
"
浊
响
"
)
+
5
17
∗
G
i
n
i
(
"
敲
声
"
=
"
沉
闷
"
)
+
2
17
∗
G
i
n
i
(
"
敲
声
"
=
"
清
脆
"
)
)
=
(
10
17
∗
0.400
+
5
17
∗
0.480
+
2
17
∗
0.000
)
=
0.376
\begin{aligned} Gini\_index(D,a="敲声") &= ({\frac{10}{17}}*Gini("敲声"="浊响") + {\frac{5}{17}}*Gini("敲声"="沉闷") + {\frac{2}{17}}* Gini("敲声"="清脆")) \\ &= ({\frac{10}{17}}*0.400 + {\frac{5}{17}}*0.480 + {\frac{2}{17}}* 0.000) \\ &= 0.376 \end{aligned}
Gini_index(D,a="敲声")=(1710∗Gini("敲声"="浊响")+175∗Gini("敲声"="沉闷")+172∗Gini("敲声"="清脆"))=(1710∗0.400+175∗0.480+172∗0.000)=0.376
此处选择特征 a = “纹理” 计算基尼值和基尼指数:
纹理 | 数量 | id集合 |
---|---|---|
清晰 | 9 | 1(是),2(是),3(是),4(是),5(是),6(是),8(是),10(否),15(否) |
稍糊 | 5 | 7(是),9(否),13(否),14(否),17(否) |
模糊 | 3 | 11(否),12(否),16(否) |
a=纹理特征的基尼值为:
G
i
n
i
(
"
纹
理
"
=
"
清
晰
"
)
=
1
−
(
(
7
9
)
2
+
(
2
9
)
2
)
=
0.346
G
i
n
i
(
"
纹
理
"
=
"
稍
糊
"
)
=
1
−
(
(
1
5
)
2
+
(
4
5
)
2
)
=
0.320
G
i
n
i
(
"
纹
理
"
=
"
模
糊
"
)
=
1
−
(
(
3
3
)
2
+
(
0
3
)
2
)
=
0.000
\begin{aligned} &Gini("纹理"="清晰") = 1 - (({\frac{7}{9})^2} + ({\frac{2}{9}})^2) = 0.346 \\ &Gini("纹理"="稍糊") = 1 - (({\frac{1}{5})^2} + ({\frac{4}{5}})^2) = 0.320 \\ &Gini("纹理"="模糊") = 1 - (({\frac{3}{3})^2} + ({\frac{0}{3}})^2) = 0.000 \\ \end{aligned}
Gini("纹理"="清晰")=1−((97)2+(92)2)=0.346Gini("纹理"="稍糊")=1−((51)2+(54)2)=0.320Gini("纹理"="模糊")=1−((33)2+(30)2)=0.000
基尼指数为:
G
i
n
i
_
i
n
d
e
x
(
D
,
a
=
"
纹
理
"
)
=
(
9
17
∗
G
i
n
i
(
"
纹
理
"
=
"
清
晰
"
)
+
5
17
∗
G
i
n
i
(
"
纹
理
"
=
"
稍
糊
"
)
+
3
17
∗
G
i
n
i
(
"
纹
理
"
=
"
模
糊
"
)
)
=
(
9
17
∗
0.346
+
5
17
∗
0.320
+
3
17
∗
0.000
)
=
0.277
\begin{aligned} Gini\_index(D,a="纹理") &= ({\frac{9}{17}}*Gini("纹理"="清晰") + {\frac{5}{17}}*Gini("纹理"="稍糊") + {\frac{3}{17}}* Gini("纹理"="模糊")) \\ &= ({\frac{9}{17}}*0.346 + {\frac{5}{17}}*0.320 + {\frac{3}{17}}* 0.000) \\ &= 0.277 \\ \end{aligned}
Gini_index(D,a="纹理")=(179∗Gini("纹理"="清晰")+175∗Gini("纹理"="稍糊")+173∗Gini("纹理"="模糊"))=(179∗0.346+175∗0.320+173∗0.000)=0.277
此处选择特征 a = “脐部” 计算基尼值和基尼指数:
脐部 | 数量 | id集合 |
---|---|---|
凹陷 | 7 | 1(是),2(是),3(是),4(是),5(是),13(否),14(否) |
稍凹 | 6 | 6(是),7(是),8(是),9(否),15(否),17(否) |
平坦 | 4 | 10(否),11(否),12(否),16(否) |
a=脐部特征的基尼值为:
G
i
n
i
(
"
脐
部
"
=
"
凹
陷
"
)
=
1
−
(
(
5
7
)
2
+
(
2
7
)
2
)
=
0.408
G
i
n
i
(
"
脐
部
"
=
"
稍
凹
"
)
=
1
−
(
(
3
6
)
2
+
(
3
6
)
2
)
=
0.500
G
i
n
i
(
"
脐
部
"
=
"
平
坦
"
)
=
1
−
(
(
4
4
)
2
+
(
0
4
)
2
)
=
0.000
\begin{aligned} &Gini("脐部"="凹陷") = 1 - (({\frac{5}{7})^2} + ({\frac{2}{7}})^2) = 0.408 \\ &Gini("脐部"="稍凹") = 1 - (({\frac{3}{6})^2} + ({\frac{3}{6}})^2) = 0.500 \\ &Gini("脐部"="平坦") = 1 - (({\frac{4}{4})^2} + ({\frac{0}{4}})^2) = 0.000 \\ \end{aligned}
Gini("脐部"="凹陷")=1−((75)2+(72)2)=0.408Gini("脐部"="稍凹")=1−((63)2+(63)2)=0.500Gini("脐部"="平坦")=1−((44)2+(40)2)=0.000
基尼指数为:
G
i
n
i
_
i
n
d
e
x
(
D
,
a
=
"
脐
部
"
)
=
(
7
17
∗
G
i
n
i
(
"
脐
部
"
=
"
凹
陷
"
)
+
6
17
∗
G
i
n
i
(
"
脐
部
"
=
"
稍
凹
"
)
+
4
17
∗
G
i
n
i
(
"
脐
部
"
=
"
平
坦
"
)
)
=
(
7
17
∗
0.408
+
6
17
∗
0.500
+
4
17
∗
0.000
)
=
0.344
\begin{aligned} Gini\_index(D,a="脐部") &= ({\frac{7}{17}}*Gini("脐部"="凹陷") + {\frac{6}{17}}*Gini("脐部"="稍凹") + {\frac{4}{17}}* Gini("脐部"="平坦")) \\ &= ({\frac{7}{17}}*0.408 + {\frac{6}{17}}*0.500 + {\frac{4}{17}}* 0.000) \\ &= 0.344 \\ \end{aligned}
Gini_index(D,a="脐部")=(177∗Gini("脐部"="凹陷")+176∗Gini("脐部"="稍凹")+174∗Gini("脐部"="平坦"))=(177∗0.408+176∗0.500+174∗0.000)=0.344
G i n i _ i n d e x ( D , a = " 纹 理 " ) = ( 9 17 ∗ G i n i ( " 纹 理 " = " 清 晰 " ) + 5 17 ∗ G i n i ( " 纹 理 " = " 稍 糊 " ) + 3 17 ∗ G i n i ( " 纹 理 " = " 模 糊 " ) ) = ( 9 17 ∗ 0.346 + 5 17 ∗ 0.320 + 3 17 ∗ 0.000 ) = 0.277 \begin{aligned} Gini\_index(D,a="纹理") &= ({\frac{9}{17}}*Gini("纹理"="清晰") + {\frac{5}{17}}*Gini("纹理"="稍糊") + {\frac{3}{17}}* Gini("纹理"="模糊")) \\ &= ({\frac{9}{17}}*0.346 + {\frac{5}{17}}*0.320 + {\frac{3}{17}}* 0.000) \\ &= 0.277 \\ \end{aligned} Gini_index(D,a="纹理")=(179∗Gini("纹理"="清晰")+175∗Gini("纹理"="稍糊")+173∗Gini("纹理"="模糊"))=(179∗0.346+175∗0.320+173∗0.000)=0.277
此处选择特征 a = “触感” 计算基尼值和基尼指数:
触感 | 数量 | id集合 |
---|---|---|
硬滑 | 12 | 1(是),2(是),3(是),4(是),5(是),8(是),9(否),11(否),13(否),14(否),16(否),17(否) |
软黏 | 5 | 6(是),7(是),10(否),12(否),15(否) |
a=触感特征的基尼值为:
G
i
n
i
(
"
触
感
"
=
"
硬
滑
"
)
=
1
−
(
(
6
12
)
2
+
(
6
12
)
2
)
=
0.500
G
i
n
i
(
"
触
感
"
=
"
软
黏
"
)
=
1
−
(
(
2
5
)
2
+
(
3
5
)
2
)
=
0.480
\begin{aligned} &Gini("触感"="硬滑") = 1 - (({\frac{6}{12})^2} + ({\frac{6}{12}})^2) = 0.500 \\ &Gini("触感"="软黏") = 1 - (({\frac{2}{5})^2} + ({\frac{3}{5}})^2) = 0.480 \\ \end{aligned}
Gini("触感"="硬滑")=1−((126)2+(126)2)=0.500Gini("触感"="软黏")=1−((52)2+(53)2)=0.480
基尼指数为:
G
i
n
i
_
i
n
d
e
x
(
D
,
a
=
"
触
感
"
)
=
(
12
17
∗
G
i
n
i
(
"
触
感
"
=
"
硬
滑
"
)
+
5
17
∗
G
i
n
i
(
"
触
感
"
=
"
软
黏
"
)
)
=
(
12
17
∗
0.500
+
5
17
∗
0.480
)
=
0.494
\begin{aligned} Gini\_index(D,a="触感") &= ({\frac{12}{17}}*Gini("触感"="硬滑") + {\frac{5}{17}}*Gini("触感"="软黏")) \\ &= ({\frac{12}{17}}*0.500 + {\frac{5}{17}}*0.480) \\ &= 0.494 \\ \end{aligned}
Gini_index(D,a="触感")=(1712∗Gini("触感"="硬滑")+175∗Gini("触感"="软黏"))=(1712∗0.500+175∗0.480)=0.494
最后得到的基尼指数表为:
色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | |
---|---|---|---|---|---|---|
Gini_index | 0.428 | 0.418 | 0.376 | 0.277 | 0.344 | 0.494 |
因此,选择使用纹理特征作为最优划分属性。第一步划分的决策树如下:
同理在后续结点中计算新的基尼指数,进行下一步的划分。
CART决策树算法
CART算法(classification and regression tree),即分类和回归算法,是一种应用广泛的决策树学习方法,既然是一种决策树学习方法,必然也满足决策树的几大步骤,即:
- 特征的选择
- 决策树的生成
- 决策树的剪枝 (预剪枝和后剪枝)
三大步骤,CART算法既可以用于分类还可以用于回归。
CART决策树算法使用基尼指数来代替信息增益比,基尼指数同样可以描述一个随机变量的不确定性的程度,基尼指数越小,不确定性越低,特征越好。对于回归树,使用的是平方误差最小准则。而对于分类树,使用的是基尼指数最小化准则。
三种决策树算法的比较:
算法 | 支持模型 | 特征选择 | 连续值处理 | 缺失值处理 | 剪枝 |
---|---|---|---|---|---|
ID3 | 分类 | 信息增益 | 不支持 | 不支持 | 不支持 |
C4.5 | 分类 | 信息增益率 | 支持 | 支持 | 支持 |
CART | 分类回归 | 基尼指数、均方差 | 支持 | 支持 | 支持 |
五、预剪枝与后剪枝
在构建决策树模型的过程中,最容易出现的问题是“过拟合”问题,即模型(或者算法)把样本学习得太好了,以至于它将一些训练样本自身的一些特点当做了所有样本潜在的一般性质,导致了算法的泛化性能下降。而剪枝操作是决策树学习算法解决“过拟合”问题的主要手段。
在决策树学习过程中,为了尽可能正确分类训练样本,结点的划分过程不断重复,有时会造成决策树分支过多,导致决策树学习得太好了,从而产生了过拟合问题。因此,可以通过主动去掉一些分支来降低过拟合风险。决策树剪枝的基本策略包括:预剪枝和后剪枝。对决策树泛化性能的评估通过将历史数据划分为训练集和验证集来完成。
训练集:
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
---|---|---|---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
验证集:
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
---|---|---|---|---|---|---|---|
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
8 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
预剪枝
是指在决策树的生成过程中,对每个结点在划分前后进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
1)、在未划分前,根据训练集得知,所有结点集中在根节点,验证集中属于好瓜类别的有{4,5,8},选择将根节点标记为好瓜,因此分类正确的性能是3/7*100%=42.9%;
2)、计算训练集的信息增益,得知脐部的信息增益最大,因此按照脐部进行划分。又因为在训练集中,凹陷特征好瓜的占比多,因此凹陷划分为好。稍凹特征好瓜占比多,因此将其标记为好瓜。按照脐部划分的子树结果如下:
划分后,验证集结果为:
编号 | 好瓜(正确结果) | 划分结果 |
---|---|---|
4(凹陷) | 是 | 是 |
5(凹陷) | 是 | 是 |
8(稍凹) | 是 | 是 |
9(稍凹) | 否 | 是(划分错误) |
11(平坦) | 否 | 否 |
12(平坦) | 否 | 否 |
13(凹陷) | 否 | 是(划分错误) |
泛化性能(正确率) | 3/7 | 5/7 |
由表可知,正确率提高,可划分。
3)、在脐部划分的基础上,进一步计算凹陷特征下,其他特征的信息增益。根据计算结果可知,在凹陷的情况下,色泽的信息增益最大,因此对于凹陷的西瓜,进一步确定按照色泽进行划分,划分结果如下:
对于凹陷数据,进一步按照色泽进行划分后,对比划分前后的准确性:
编号 | 好瓜(正确结果) | 划分结果 | 凹陷条件下,色泽划分 |
---|---|---|---|
4(凹陷) | 是 | 是 | 是 |
5(凹陷) | 是 | 是 | 否(划分错误) |
8(稍凹) | 是 | 是 | 是 |
9(稍凹) | 否 | 是(划分错误) | 是(划分错误) |
11(平坦) | 否 | 否 | 否 |
12(平坦) | 否 | 否 | 否 |
13(凹陷) | 否 | 是(划分错误) | 是(划分错误) |
泛化性能(正确率) | 3/7 | 5/7 | 4/7 |
泛化性能下降,不划分。
4)、对稍凹数据集,进一步计算其他属性的信息增益,确定根蒂特征的信息增益最大,因此对稍凹结点数据进一步按照根蒂特征进行划分:
对于稍凹数据,进一步按照根蒂进行划分后,对比划分前后的准确性:
编号 | 好瓜(正确结果) | 划分结果 | 稍凹条件下,色泽划分 |
---|---|---|---|
4(凹陷) | 是 | 是 | 是 |
5(凹陷) | 是 | 是 | 是 |
8(稍凹) | 是 | 是 | 否 |
9(稍凹) | 否 | 是(划分错误) | 否 |
11(平坦) | 否 | 否 | 否 |
12(平坦) | 否 | 否 | 否 |
13(凹陷) | 否 | 是(划分错误) | 是 |
泛化性能(正确率) | 3/7 | 5/7 | 5/7 |
泛化性能不变,不划分。
5)、按照预剪枝得到的决策树结果如下图,其泛化性能为71.4%(5/7):
优点:
- 降低了过拟合风险;
- 显著减少了决策树的训练时间开销和测试时间开销;
缺点:
- 有些分支的当前划分虽然不能提升泛化性能,甚至可能导致泛化性能暂时下降,但在其基础上进行后续划分却有可能导致性能显著提升;
- 预剪枝基于“贪心”本质,禁止这些分支的展开,给预剪枝决策树带来了欠拟合风险;
后剪枝
是先从训练集生成一棵完整的决策树,然后自底向上地对非叶节点进行考察,若将该结点对应的子树替换为叶节点能带来决策树泛化性能的提升,则将该子树替换为叶节点。
1)、使用增益率生成完整决策树,标记验证集的西瓜编号。
对比标记节点的划分类与各数据的真实分类,计算准确率,如下表所示:
编号 | 好瓜(正确结果) | 整棵树划分结果 |
---|---|---|
4 | 是 | 是 |
5 | 是 | 否(划分错误) |
8 | 是 | 否(划分错误) |
9 | 否 | 是(划分错误) |
11 | 否 | 否 |
12 | 否 | 否 |
13 | 否 | 是(划分错误) |
泛化性能(正确率) | 3/7 |
生成的决策树,在验证集上的准确度为3/7*100%=42.9%
2)、后剪枝将从决策树的底部往上进行剪枝,先看最底部的纹理,将其领衔的分支减掉,即将其换成叶子节点。由于在训练集上,替换后,包含的西瓜编号为{8,9},好瓜坏瓜比例相等,因此选择好瓜进行标记,剪枝后的决策树为:
剪枝后的结果对比:
编号 | 好瓜(正确结果) | 整棵树划分结果 | 剪掉底部纹理划分 |
---|---|---|---|
4 | 是 | 是 | 是 |
5 | 是 | 否(划分错误) | 否(划分错误) |
8 | 是 | 否(划分错误) | 是 |
9 | 否 | 是(划分错误) | 是(划分错误) |
11 | 否 | 否 | 否 |
12 | 否 | 否 | 否 |
13 | 否 | 是(划分错误) | 是(划分错误) |
泛化性能(正确率) | 3/7 | 4/7 |
准确率提高,后剪枝去掉底部纹理划分。
3)、接着往上裁剪,应该是色泽部分。在训练集上替换后,包含的西瓜编号为{8,9},好瓜、坏瓜一样多,因此选择好瓜进行标记,剪枝后的决策树为:
后剪枝结果对比如下:
编号 | 好瓜(正确结果) | 整棵树划分结果 | 剪掉底部纹理划分 | 减掉底部色泽划分 |
---|---|---|---|---|
4 | 是 | 是 | 是 | 是 |
5 | 是 | 否(划分错误) | 否(划分错误) | 否(划分错误) |
8 | 是 | 否(划分错误) | 是 | 是 |
9 | 否 | 是(划分错误) | 是(划分错误) | 是(划分错误) |
11 | 否 | 否 | 否 | 否 |
12 | 否 | 否 | 否 | 否 |
13 | 否 | 是(划分错误) | 是(划分错误) | 是(划分错误) |
泛化性能(正确率) | 3/7 | 4/7 | 4/7 |
此时决策树验证集精度仍为57.1%,因此可不进行剪枝,保留按照色泽的进一步划分。
4)、对根节点的脐部凹陷分支。由于在训练集上,将色泽替换为叶节点后,包含的样本号为{4,5,13},好瓜(2个)多于坏瓜(1个),因此选择好瓜进行标记,剪枝后的决策树为:
根节点脐部凹陷特征的结点剪枝后的结果对比如下:
编号 | 好瓜(正确结果) | 整棵树划分结果 | 剪掉底部纹理划分 | 剪掉色泽划分(左侧脐部凹陷结点) |
---|---|---|---|---|
4 | 是 | 是 | 是 | 是 |
5 | 是 | 否(划分错误) | 否(划分错误) | 是 |
8 | 是 | 否(划分错误) | 是 | 是 |
9 | 否 | 是(划分错误) | 是(划分错误) | 是(划分错误) |
11 | 否 | 否 | 否 | 否 |
12 | 否 | 否 | 否 | 否 |
13 | 否 | 是(划分错误) | 是(划分错误) | 是(划分错误) |
泛化性能(正确率) | 3/7 | 4/7 | 5/7 |
后剪枝剪去脐部凹陷的色泽分支后,泛化性能提升,因此剪去此分支。
5)、至此整棵树的后剪枝策略完成。剪枝结果如下:
优点:欠拟合风险小,泛化性能往往优于预剪枝决策树。
缺点:后剪枝的训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
六、连续值与缺失值
连续值处理
之前的讨论都是基于离散属性的决策树生成,而大多数的情况下,出现最多的是几组连续值的决策树生成。由于连续属性的可取值数目未知(或无限),不能直接使用连续值属性的可取值对节点进行划分。此时对连续值进行离散化处理就非常有必要了,最简单的策略是采用二分法对连续值进行处理,这种策略在C4.5决策树算法中也有使用。
给定样本集 D 和连续值属性 a,假定a在D上出现了n个不同的取值,将这些值按照从小到达进行排序,记为{
a
1
a^1
a1,
a
2
a^2
a2, … ,
a
n
a^n
an}。基于划分点t可以将D分为子集
D
t
+
D^+_t
Dt+ 和
D
t
−
D^-_t
Dt− ,其中
D
t
+
D^+_t
Dt+ 包含那些在属性 a 上取值大于 t 的样本,而
D
t
−
D^-_t
Dt− 则包含那些取值不大于 t 的样本。对于相邻的属性取值
a
i
a^i
ai 和
a
i
+
1
a^{i+1}
ai+1 来说,t在区间 [
a
i
a^i
ai,
a
i
+
1
a^{i+1}
ai+1) 中取任意值的结果相同。对于连续属性a,我们可考察包含n-1个元素的候选划分集合:
T
a
=
{
a
i
+
a
i
+
1
2
∣
1
≤
i
≤
n
−
1
}
(8)
\begin{aligned} T_a &= \{{\frac{a^i + a^{i+1}}{2} | 1\le i \le n-1} \}\\ \end{aligned} \tag{8}
Ta={2ai+ai+1∣1≤i≤n−1}(8)
即把区间 [
a
i
a^i
ai,
a
i
+
1
a^{i+1}
ai+1) 的中位点
a
i
+
a
i
+
1
2
{\frac{a^i + a^{i+1}}{2}}
2ai+ai+1 作为候选划分点。然后按照之前离散属性的方式计算信息增益、信息增益率等等。例如对信息增益的计算:
G
a
i
n
(
D
,
a
,
t
)
=
max
t
∈
T
a
(
G
a
i
n
(
D
,
a
,
t
)
)
=
max
t
∈
T
a
(
E
n
t
(
D
)
−
∑
λ
∈
{
−
,
+
}
∣
D
t
λ
∣
∣
D
∣
∗
E
n
t
(
D
t
λ
)
)
(9)
\begin{aligned} Gain(D, a, t) &= \max_{t \in T_a} \left( Gain(D, a, t)\right) \\ &= \max_{t \in T_a} \left( Ent(D) - \sum^{}_{\lambda \in \{-,+\}} {\frac{|D^\lambda_t|}{|D|}} * Ent(D^\lambda_t) \right) \\ \end{aligned} \tag{9}
Gain(D,a,t)=t∈Tamax(Gain(D,a,t))=t∈Tamax⎝⎛Ent(D)−λ∈{−,+}∑∣D∣∣Dtλ∣∗Ent(Dtλ)⎠⎞(9)
其中 Gain(D, a, t) 是样本集 D 基于划分点 t 二分后的信息增益,从中选择并记录使该信息增益最大的划分点 t 和信息增益的值。
取西瓜数据集的密度数据为例:
编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
密度 | 0.697 | 0.774 | 0.634 | 0.608 | 0.556 | 0.403 | 0.481 | 0.437 | 0.666 | 0.243 | 0.245 | 0.343 | 0.639 | 0.657 | 0.360 | 0.593 | 0.719 |
好瓜 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
对密度进行排序(17个数据点):
0.243,0.245,0.343,0.360,0.403,0.437,0.481,0.556,0.593,0.608,0.634,0.639,0.657,0.666,0.697,0.719,0.774
得到的候选划分点(16个候选划分点):
0.244,0.294,0.351,0.381,0.420,0.459,0.518,0.574,0.600,0.621,0.636,0.648,0.661,0.681,0.708,0.746
取 t=0.244 为例:
密度 | 个数 | 编号集合 |
---|---|---|
≤ \le ≤ 0.244 | 1 | 10(否) |
> \gt > 0.244 | 16 | 1(是),2(是),3(是),4(是),5(是),6(是),7(是),8(是),9(否),11(否),12(否),13(否),14(否),15(否),16(否),17(否) |
$$
\begin{aligned}
Gain(D, a=“密度”, t=0.244)
&= Ent(D) - \sum^{}_{\lambda \in {-,+}}{\frac{|D^\lambda_t|}{|D|}} * Ent(D^\lambda_t) \
&= 0.998 - (\frac{1}{17} * (-(\frac{1}{1} * log_2{\frac{1}{1}} + \frac{0}{1} * log_2{\frac{0}{1}})) +
(\frac{16}{17} * (-(\frac{8}{16} * log_2{\frac{8}{16}} + \frac{8}{16} * log_2{\frac{8}{16}})))) \
&=0.988-\frac{16}{17} \
&=0.047
\end{aligned}
\tag{26}
$$
同理计算出所有候选划分点的信息增益,选择候选划分点集合中最大的信息增益作为连续值属性的信息增益。
注意:与离散属性不同,若当前节点划分属性为连续属性,该属性还可以在其后代节点继续作为划分属性。
缺失值处理
实际的数据处理中,一条数据可能某一个属性出现缺失,其他属性没有缺失,需要通过某些策略去忽略这条数据缺失的属性,使用为缺失的属性,避免数据的浪费。
以西瓜数据集为例:
在构造决策树时,处理含有缺失值的样本的时候,需要解决两个问题:
(1)如何在属性值缺失的情况下选择最优划分属性?
(2)选定了划分属性,若样本在该属性上的值是缺失的,那么该如何对这个样本进行划分?
这里引入了权重的概念,在学习开始时,样本的默认权重为1,即 ω x \omega_x ωx = 1,对于无缺失值的样本,划分到子节点时其权重保持不变。
样本有了权重,我们需要对信息增益的计算公式做一些改进。
(无缺失值样本所占的比例,样本的个数按权重来计算)
(无缺失值样本中第k类所占的比例,样本的个数按权重来计算)
(无缺失值样本中属性a上取值为的样本所占的比例,样本个数按权重来计算)
之前的算法中,我们选择信息增益最大的属性作为最优划分属性,那么对于有缺失值的属性,其信息增益就是无缺失值样本所占的比例乘以无缺失值样本子集的信息增益。
其中 ρ \rho ρ 是属性a上无缺失值样本所占的比例。 D ~ \tilde{D} D~ 是属性a上无缺失值的样本子集。信息增益的计算方法:
色泽:
色泽 | 数量 | 编号集合 |
---|---|---|
青绿 | 4 | 4(是),6(是),10(否),17(否) |
乌黑 | 6 | 2(是),3(是),7(是),8(是),9(否),15(否) |
浅白 | 4 | 11(否),12(否),14(否),16(否) |
缺失编号 {1, 5, 13},另 D ~ 1 \tilde{D}^1 D~1、 D ~ 2 \tilde{D}^2 D~2、 D ~ 3 \tilde{D}^3 D~3 分别表示“色泽”属性上取值为“青绿”、“乌黑”、“浅白”的样本子集。
同样可以计算出其他几个属性的信息增益:
属性 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 |
---|---|---|---|---|---|---|
信息增益 | 0.252 | 0.171 | 0.145 | 0.424 | 0.289 | 0.006 |
因此,选择“纹理”作为根节点进行划分。编号为{1,2,3,4,5,6,15}的7个样本进入“纹理=清晰”的分支,编号为{7,9,13,14,17}的5个样本进入“纹理=稍糊”的分支,编号为{11,12,16}的3个样本进入“纹理=模糊”的分支。
那么选定了划分属性,若样本在该属性上的值是缺失的,那么该如何对这个样本进行划分?
重点来了:对于编号为8和10的缺失值样本,将分别以7/15、5/15、3/15的权重划分到以上3个分支。也就是说,将缺失值样本按不同的概率划分到了所有分支中,而概率则等于无缺失值样本在每个分支中所占的比例。
下面我们再以“纹理=清晰”这个分支为例,看看下一步将如何划分:
以色泽属性为例:
无缺失值样本中,好瓜的比例:
无缺失值样本中,坏瓜的比例:
无缺失值样本中,“色泽=乌黑”的样本的比例:
无缺失值样本中,“色泽=青绿”的样本的比例:
计算结点信息熵:
“色泽=乌黑”条件信息熵:
“色泽=青绿”条件信息熵:
信息增益:
同理计算其它属性,选择信息增益最大的属性进行下一步划分。
划分结果如下: