跟我一起机器学习系列文章将首发于公众号:月来客栈,欢迎文末扫码关注!
1 基本概念
在正式介绍决策树的生成算法前,我们先将上一篇文章中介绍的几个概念重新梳理一下;并且同时再通过一个例子来熟悉一下计算过程,以便于后续更好的理解决策树的生成算法。
1.1 信息熵
设
X
X
X是一个取值为有限个的离散型随机变量(例如前一篇引例中可能夺冠的16只球队),其概率分布为
P
(
X
=
x
i
)
=
p
i
,
i
=
1
,
2
,
.
.
.
,
n
P(X=x_i)=p_i,\;i=1,2,...,n
P(X=xi)=pi,i=1,2,...,n(每个球队可能夺冠的概率),则随机变量
X
X
X的信息熵定义为:
H
(
X
)
=
−
∑
i
=
1
n
p
i
log
p
i
(1)
H(X)=-\sum_{i=1}^np_i\log{p_i}\tag{1}
H(X)=−i=1∑npilogpi(1)
其中,若
p
i
=
0
p_i=0
pi=0,则定义
0
log
0
=
0
0\log0=0
0log0=0;且通常
log
\log
log取2为底或
e
e
e为底时,其熵的单位分别称为比特(bit)或纳特(nat)。如无特殊说明,默认2为底。
1.2 条件熵
设有随机变量
(
X
,
Y
)
(X,Y)
(X,Y),其联合概率分布分
P
(
X
=
x
i
,
Y
=
y
i
)
=
p
i
j
,
i
=
1
,
2
,
.
.
.
,
n
;
j
=
1
,
2
,
.
.
.
,
m
P(X=x_i,Y=y_i)=p_{ij},\;i=1,2,...,n;\;j=1,2,...,m
P(X=xi,Y=yi)=pij,i=1,2,...,n;j=1,2,...,m,条件熵
H
(
Y
∣
X
)
H(Y|X)
H(Y∣X)表示在已知随机变量
X
X
X的条件下,随机变量
Y
Y
Y的不确定性,其定义为
H
(
Y
∣
X
)
=
∑
i
=
1
n
p
i
H
(
Y
∣
X
=
x
i
)
(2)
H(Y|X)=\sum_{i=1}^np_iH(Y|X=x_i)\tag{2}
H(Y∣X)=i=1∑npiH(Y∣X=xi)(2)
其中,
p
i
=
P
(
X
=
x
i
)
,
i
=
1
,
2
,
.
.
.
,
n
p_i=P(X=x_i),i=1,2,...,n
pi=P(X=xi),i=1,2,...,n
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称之为经验熵(empirical entropy)和经验条件熵(empirical coditional entropy)。(P.s. 暂时看不懂没关系,请看后面计算示例)
1.3 信息增益
从上一篇文章的内容可知,所谓信息增益指的就是事物
U
U
U的信息熵
H
(
U
)
H(U)
H(U),在引入外部信息
I
I
I后的变化量:
H
(
U
)
−
H
(
U
∣
I
)
H(U)-H(U|I)
H(U)−H(U∣I)。因此,我们将特征
A
A
A对训练数据集
D
D
D的信息增益
d
(
D
,
A
)
d(D,A)
d(D,A)定义为:集合
D
D
D信息熵
H
(
D
)
H(D)
H(D)与特征
A
A
A给定条件下
D
D
D的条件熵
H
(
D
∣
A
)
H(D|A)
H(D∣A)之差,即
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
(3)
g(D,A)=H(D)-H(D|A)\tag{3}
g(D,A)=H(D)−H(D∣A)(3)
设训练集为
D
D
D,
∣
D
∣
|D|
∣D∣表示所有训练样本总数;其中有
K
K
K个类别
C
k
,
k
=
1
,
2
,
.
.
.
,
K
;
∣
C
k
∣
C_k,k=1,2,...,K;\;|C_k|
Ck,k=1,2,...,K;∣Ck∣为属于类
C
k
C_k
Ck的样本总数,即
∑
k
=
1
K
∣
C
k
∣
=
∣
D
∣
\sum_{k=1}^K|C_k|=|D|
∑k=1K∣Ck∣=∣D∣;设特征
A
A
A有
n
n
n个不同的取值
a
1
,
a
2
,
.
.
.
,
a
n
{a_1,a_2,...,a_n}
a1,a2,...,an,根据特征
A
A
A的取值将
D
D
D划分为
n
n
n个子集
D
1
,
D
2
,
.
.
.
,
D
n
D_1,D_2,...,D_n
D1,D2,...,Dn,
∣
D
i
∣
|D_i|
∣Di∣为子集
D
i
D_i
Di中的样本个数,即
∑
i
=
1
n
∣
D
i
∣
=
∣
D
∣
\sum_{i=1}^n|D_i|=|D|
∑i=1n∣Di∣=∣D∣;同时记子集
D
i
D_i
Di中,属于类
C
k
C_k
Ck的样本集合为
D
i
k
D_{ik}
Dik,即
D
i
k
=
D
i
⋂
C
k
D_{ik}=D_i\bigcap C_k
Dik=Di⋂Ck,
∣
D
i
k
∣
|D_{ik}|
∣Dik∣为
D
i
k
D_{ik}
Dik的样本个数。(P.s. 都是概念定义,可稍后带入下面的例子会更加清晰) 则有如下定义:
(1)数据集
D
D
D的经验熵
H
(
D
)
H(D)
H(D)为
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
log
2
∣
C
k
∣
∣
D
∣
(4)
H(D)=-\sum_{k=1}^K\frac{|C_k|}{|D|}\log_2\frac{|C_k|}{|D|}\tag{4}
H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣(4)
(2)特征值
A
A
A对数据集
D
D
D的经验条件熵
H
(
D
∣
A
)
为
H(D|A)为
H(D∣A)为
H
(
D
∣
A
)
=
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
H
(
D
i
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
∑
k
=
1
K
∣
D
i
k
∣
∣
D
i
∣
log
2
D
i
k
D
i
(5)
H(D|A)=\sum_{i=1}^n\frac{|D_i|}{|D|}H(D_i)=-\sum_{i=1}^n\frac{|D_i|}{|D|}\sum_{k=1}^K\frac{|D_{ik}|}{|D_i|}\log_2{\frac{D_{ik}}{D_i}}\tag{5}
H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2DiDik(5)
(3)信息增益
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
(6)
g(D,A)=H(D)-H(D|A)\tag{6}
g(D,A)=H(D)−H(D∣A)(6)
1.4 计算示例
如果仅看上面的公式肯定会很模糊,下面我们进行举例说明(将公式同下面的计算式子对比着看会更容易理解)。下表是一个由15个样本组成的贷款申请训练数据集。数据包括4个特征,最后一列表示是否通过申请,即每个样本对于的类标。
I
D
年龄
有工作
有自己的房子
贷款情况
类别
1
青年
否
否
一般
否
2
青年
否
否
好
否
3
青年
是
否
好
是
4
青年
是
是
一般
是
5
青年
否
否
一般
否
6
中年
否
否
一般
否
7
中年
否
否
好
否
8
中年
是
是
好
是
9
中年
否
是
非常好
是
10
中年
否
是
非常好
是
11
老年
否
是
非常好
是
12
老年
否
是
好
是
13
老年
是
否
好
是
14
老年
是
否
非常好
是
15
老年
否
否
一般
否
\begin{array}{c|cc} \hline ID&\text{年龄}&\text{有工作}&\text{有自己的房子}&\text{贷款情况}&\text{类别}\\ \hline 1&\text{青年}&\text{否}&\text{否}&\text{一般}&\text{否}\\ 2&\text{青年}&\text{否}&\text{否}&\text{好}&\text{否}\\ 3&\text{青年}&\text{是}&\text{否}&\text{好}&\text{是}\\ 4&\text{青年}&\text{是}&\text{是}&\text{一般}&\text{是}\\ 5&\text{青年}&\text{否}&\text{否}&\text{一般}&\text{否}\\ \hline 6&\text{中年}&\text{否}&\text{否}&\text{一般}&\text{否}\\ 7&\text{中年}&\text{否}&\text{否}&\text{好}&\text{否}\\ 8&\text{中年}&\text{是}&\text{是}&\text{好}&\text{是}\\ 9&\text{中年}&\text{否}&\text{是}&\text{非常好}&\text{是}\\ 10&\text{中年}&\text{否}&\text{是}&\text{非常好}&\text{是}\\ \hline 11&\text{老年}&\text{否}&\text{是}&\text{非常好}&\text{是}\\ 12&\text{老年}&\text{否}&\text{是}&\text{好}&\text{是}\\ 13&\text{老年}&\text{是}&\text{否}&\text{好}&\text{是}\\ 14&\text{老年}&\text{是}&\text{否}&\text{非常好}&\text{是}\\ 15&\text{老年}&\text{否}&\text{否}&\text{一般}&\text{否}\\ \hline \end{array}
ID123456789101112131415年龄青年青年青年青年青年中年中年中年中年中年老年老年老年老年老年有工作否否是是否否否是否否否否是是否有自己的房子否否否是否否否是是是是是否否否贷款情况一般好好一般一般一般好好非常好非常好非常好好好非常好一般类别否否是是否否否是是是是是是是否
(1)计算
H
(
D
)
H(D)
H(D),根据公式
(
4
)
(4)
(4)有:
H
(
D
)
=
−
(
9
15
log
2
9
15
+
6
15
log
2
6
15
)
=
0.971
H(D)=-(\frac{9}{15}\log_2\frac{9}{15}+\frac{6}{15}\log_2\frac{6}{15})=0.971
H(D)=−(159log2159+156log2156)=0.971
(2)计算条件熵
由上表我们可以知道,数据集有4个特征(年龄、工作、房子、贷款)
A
1
,
A
2
,
A
3
,
A
4
A_1,A_2,A_3,A_4
A1,A2,A3,A4;接下来我们计算D分别在4个特征条件下的熵
H
(
D
∣
A
i
)
H(D|A_i)
H(D∣Ai)。
- 在知道外部信息年龄的情况下,根据公式 ( 5 ) (5) (5)有:
H ( D ∣ A 1 ) = [ 5 15 H ( D 1 ) + 5 15 H ( D 2 ) + 5 15 H ( D 3 ) ] = − 5 15 ( 2 5 log 2 5 + 3 5 log 3 5 ) − 5 15 ( 3 5 log 3 5 + 2 5 log 2 5 ) − 5 15 ( 4 5 log 4 5 + 1 5 log 1 5 ) = 0.888 \begin{aligned} H(D|A_1)=&\left[\frac{5}{15}H(D_1)+\frac{5}{15}H(D_2)+\frac{5}{15}H(D_3)\right]\\[2ex] =&-\frac{5}{15}(\frac{2}{5}\log{\frac{2}{5}}+\frac{3}{5}\log{\frac{3}{5}})\\[2ex] &-\frac{5}{15}(\frac{3}{5}\log{\frac{3}{5}}+\frac{2}{5}\log{\frac{2}{5}})\\[2ex] &-\frac{5}{15}(\frac{4}{5}\log{\frac{4}{5}}+\frac{1}{5}\log{\frac{1}{5}})\\[2ex] =&0.888 \end{aligned} H(D∣A1)===[155H(D1)+155H(D2)+155H(D3)]−155(52log52+53log53)−155(53log53+52log52)−155(54log54+51log51)0.888
这里的 D 1 , D 2 , D 3 D_1,D_2,D_3 D1,D2,D3分别是 A 1 A_1 A1取值为青年,中年,老年时训练样本对应划分后的子集。
H ( D ∣ A 2 ) = 5 15 H ( D 1 ) + 10 15 H ( D 2 ) = − 5 10 × 0 − 10 15 ( 4 10 log 4 10 + 6 10 log 6 10 ) = 0.647 \begin{aligned} H(D|A_2)=&\frac{5}{15}H(D_1)+\frac{10}{15}H(D_2)\\[2ex] =&-\frac{5}{10}\times0\\[2ex] &-\frac{10}{15}(\frac{4}{10}\log{\frac{4}{10}}+\frac{6}{10}\log{\frac{6}{10}})\\[2ex] =&0.647 \end{aligned} H(D∣A2)===155H(D1)+1510H(D2)−105×0−1510(104log104+106log106)0.647
这里的 D 1 , D 2 D_1,D_2 D1,D2分别是 A 2 A_2 A2取值为是或否时训练样本对应划分后的子集。
H ( D ∣ A 3 ) = 9 15 H ( D 1 ) + 6 15 H ( D 2 ) = − 9 15 ( 3 9 log 3 9 + 6 9 log 6 9 ) = 0.551 \begin{aligned} H(D|A_3)=&\frac{9}{15}H(D_1)+\frac{6}{15}H(D_2)\\[2ex] =&-\frac{9}{15}(\frac{3}{9}\log{\frac{3}{9}}+\frac{6}{9}\log{\frac{6}{9}})\\[2ex] =&0.551 \end{aligned} H(D∣A3)===159H(D1)+156H(D2)−159(93log93+96log96)0.551
这里的 D 1 , D 2 D_1,D_2 D1,D2分别是 A 3 A_3 A3取值为是或否时训练样本对应划分后的集。
H ( D ∣ A 4 ) = [ 5 15 H ( D 1 ) + 6 15 H ( D 2 ) + 4 15 H ( D 3 ) ] = − 5 15 ( 4 5 log 4 5 + 1 5 log 1 5 ) − 6 15 ( 2 6 log 2 6 + 4 6 log 4 6 ) = 0.608 \begin{aligned} H(D|A_4)=&\left[\frac{5}{15}H(D_1)+\frac{6}{15}H(D_2)+\frac{4}{15}H(D_3)\right]\\[2ex] =&-\frac{5}{15}(\frac{4}{5}\log{\frac{4}{5}}+\frac{1}{5}\log{\frac{1}{5}})\\[2ex] &-\frac{6}{15}(\frac{2}{6}\log{\frac{2}{6}}+\frac{4}{6}\log{\frac{4}{6}})\\[2ex] =&0.608 \end{aligned} H(D∣A4)===[155H(D1)+156H(D2)+154H(D3)]−155(54log54+51log51)−156(62log62+64log64)0.608
这里的 D 1 , D 2 , D 3 D_1,D_2,D_3 D1,D2,D3分别是 A 4 A_4 A4取值为一般,好,非常好时训练样本对应划分后的子集。
(3)计算信息增益
g
(
D
,
A
1
)
=
0.971
−
0.888
=
0.083
g
(
D
,
A
2
)
=
0.971
−
0.647
=
0.324
g
(
D
,
A
3
)
=
0.971
−
0.551
=
0.420
g
(
D
,
A
4
)
=
0.971
−
0.608
=
0.363
\begin{aligned} g(D,A_1)=0.971-0.888=0.083\\[1ex] g(D,A_2)=0.971-0.647=0.324\\[1ex] g(D,A_3)=0.971-0.551=0.420\\[1ex] g(D,A_4)=0.971-0.608=0.363\\[1ex] \end{aligned}
g(D,A1)=0.971−0.888=0.083g(D,A2)=0.971−0.647=0.324g(D,A3)=0.971−0.551=0.420g(D,A4)=0.971−0.608=0.363
到目前为止,我们已经知道了在生成决策树的过程中所需要计算的关键步骤信息增益,接下来我们就开始正真的生成一颗决策树。
2 决策树的生成
在前一篇文章中的末尾我们总结出构建决策树的核心思想就是:每次划分时,要选择使得信息增益最大的划分方式,以此来递归构建决策树。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。因此,对于决策树生成的一个关键步骤就是选取对训练数据具有分类能力的特征,这样可以提高决策树学习的效率,而通常对于特征选择的准则就是我们前面谈到的信息增益。
2.1 ID3算法
ID3(Interactive Dichotomizer-3)算法的核心思想是在选择决策树的各个节点上,利用信息增益来作为选择特征的标准,从而递归地构建决策树。其过程可以概括为:从根节点开始,计算所有可能划分下的信息增益;然后选择信息增益最大的特征作为划分特征,由该特征的不同取值建立子节点;最后对子节点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有可以选择为止。例如根据上面1.4小节的计算结果可知,首先应该将数据样本以特征 A 3 A_3 A3(有无自己房子)作为划分方式对数据集进行第一次划分。
训练步骤如下:
输入:训练数据集D,特征集A,阈值
ε
\varepsilon
ε;
输出:决策树
(1)若
D
D
D中所有实例属于同一类
C
k
C_k
Ck(即此时只有一个类别)则T为单节点树,将
C
k
C_k
Ck作为该节点的类标记,返回T;
(2)若
A
=
∅
A=\emptyset
A=∅,则T为单节点树,并将
D
D
D中实例数最大的类
C
k
C_k
Ck作为该节点的类标记,返回T;
(3)否则,计算
A
A
A中各特征对
D
D
D的信息增益,选择信息增益最大的特征
A
g
A_g
Ag;
(4)如果
A
g
A_g
Ag的信息增益小于阈值
ε
\varepsilon
ε,则置T为单节点树,并将
D
D
D中实例数最大的类
C
k
C_k
Ck最为该节点的类标记,返回T;
(5)否则,对
A
g
A_g
Ag的每一个可能值
a
i
a_i
ai,以
A
g
=
a
i
A_g=a_i
Ag=ai将
D
D
D分割为若干非空子集建立为子节点;
(6)对于第
i
i
i个子节点,以
D
i
D_i
Di为训练集,以
A
−
{
A
g
}
A-\{A_g\}
A−{Ag}为特征集,递归地调用(1)-(5),得到子树
T
i
T_i
Ti,返回
T
i
T_i
Ti
2.2 生成示例
下面用ID3算法对上表中的数据集进行学习:
易知该数据集不满足步骤(1)(2),所以开始执行步骤(3)。同时,根据前面1.4小节是计算结果可知,对于特征
A
1
,
A
2
,
A
3
,
A
4
A_1,A_2,A_3,A_4
A1,A2,A3,A4来说,在
A
3
A_3
A3的条件下信息增益最大,所以应该选择特征
A
3
A_3
A3作为根节点。
g
(
D
,
A
1
)
=
0.971
−
0.888
=
0.083
g
(
D
,
A
2
)
=
0.971
−
0.647
=
0.324
g
(
D
,
A
3
)
=
0.971
−
0.551
=
0.420
g
(
D
,
A
4
)
=
0.971
−
0.608
=
0.363
\begin{aligned} g(D,A_1)=0.971-0.888=0.083\\[1ex] g(D,A_2)=0.971-0.647=0.324\\[1ex] g(D,A_3)=0.971-0.551=0.420\\[1ex] g(D,A_4)=0.971-0.608=0.363\\[1ex] \end{aligned}
g(D,A1)=0.971−0.888=0.083g(D,A2)=0.971−0.647=0.324g(D,A3)=0.971−0.551=0.420g(D,A4)=0.971−0.608=0.363
本例中未设置阈值,所以执行步骤(5),将训练集
D
D
D安装
A
3
A_3
A3的取值划分为两个子集
D
1
,
D
2
D_1,D_2
D1,D2,如下表
I
D
年龄
有工作
有自己的房子
贷款情况
类别
4
青年
是
是
一般
是
8
中年
是
是
好
是
9
中年
否
是
非常好
是
D
1
10
中年
否
是
非常好
是
11
老年
否
是
非常好
是
12
老年
否
是
好
是
1
青年
否
否
一般
否
2
青年
否
否
好
否
3
青年
是
否
好
是
5
青年
否
否
一般
否
D
2
6
中年
否
否
一般
否
7
中年
否
否
好
否
13
老年
是
否
好
是
14
老年
是
否
非常好
是
15
老年
否
否
一般
否
\begin{array}{c|cc} \hline ID&\text{年龄}&\text{有工作}&\text{有自己的房子}&\text{贷款情况}&\text{类别}\\ \hline 4&\text{青年}&\text{是}&\text{是}&\text{一般}&\text{是}\\ 8&\text{中年}&\text{是}&\text{是}&\text{好}&\text{是}\\ 9&\text{中年}&\text{否}&\text{是}&\text{非常好}&\text{是}&D_1\\ 10&\text{中年}&\text{否}&\text{是}&\text{非常好}&\text{是}\\ 11&\text{老年}&\text{否}&\text{是}&\text{非常好}&\text{是}\\ 12&\text{老年}&\text{否}&\text{是}&\text{好}&\text{是}\\ \hline 1&\text{青年}&\text{否}&\text{否}&\text{一般}&\text{否}\\ 2&\text{青年}&\text{否}&\text{否}&\text{好}&\text{否}\\ 3&\text{青年}&\text{是}&\text{否}&\text{好}&\text{是}\\ 5&\text{青年}&\text{否}&\text{否}&\text{一般}&\text{否}&D_2\\ 6&\text{中年}&\text{否}&\text{否}&\text{一般}&\text{否}\\ 7&\text{中年}&\text{否}&\text{否}&\text{好}&\text{否}\\ 13&\text{老年}&\text{是}&\text{否}&\text{好}&\text{是}\\ 14&\text{老年}&\text{是}&\text{否}&\text{非常好}&\text{是}\\ 15&\text{老年}&\text{否}&\text{否}&\text{一般}&\text{否}\\ \hline \end{array}
ID489101112123567131415年龄青年中年中年中年老年老年青年青年青年青年中年中年老年老年老年有工作是是否否否否否否是否否否是是否有自己的房子是是是是是是否否否否否否否否否贷款情况一般好非常好非常好非常好好一般好好一般一般好好非常好一般类别是是是是是是否否是否否否是是否D1D2
开始执行步骤(6),由于 D 1 D_1 D1满足步骤(1)中的条件,所以它成为一个叶节点,节点的类标记为“是”。则此时的决策树如下:

易知
D
2
D_2
D2不满足步骤(1)(2)中的条件,所有对
D
2
D_2
D2执行步骤(3),此时
D
2
D_2
D2需要从特征
A
−
{
A
g
}
A-\{A_g\}
A−{Ag}中即
A
1
,
A
2
,
A
4
A_1,A_2,A_4
A1,A2,A4中选择新的特征,并计算信息增益:
H
(
D
2
)
=
−
[
2
3
log
2
3
+
1
3
log
1
3
]
=
0.918
\begin{aligned} H(D_2)=-\left[\frac{2}{3}\log{\frac{2}{3}}+\frac{1}{3}\log{\frac{1}{3}}\right]=0.918 \end{aligned}
H(D2)=−[32log32+31log31]=0.918
H ( D 2 ∣ A 1 ) = − 4 9 ( 3 4 log 3 4 + 1 4 log 1 4 ) − 3 9 ( 2 3 log 2 3 + 1 3 log 1 3 ) = 0.667 H ( D 2 ∣ A 2 ) = − 6 9 ( 1 ⋅ log 1 ) − 3 9 ( 1 ⋅ log 1 ) = 0 H ( D 2 ∣ A 4 ) = − 4 9 ( 1 ⋅ log 1 ) − 4 9 ( 2 4 log 2 4 + 2 4 log 2 4 ) = 0.444 \begin{aligned} H(D_2|A_1)=&-\frac{4}{9}(\frac{3}{4}\log{\frac{3}{4}}+\frac{1}{4}\log{\frac{1}{4}})-\frac{3}{9}(\frac{2}{3}\log{\frac{2}{3}}+\frac{1}{3}\log{\frac{1}{3}})=0.667\\[2ex] H(D_2|A_2)=&-\frac{6}{9}(1\cdot\log{1})-\frac{3}{9}(1\cdot\log{1})=0\\[2ex] H(D_2|A_4)=&-\frac{4}{9}(1\cdot\log{1})-\frac{4}{9}(\frac{2}{4}\log{\frac{2}{4}}+\frac{2}{4}\log{\frac{2}{4}})=0.444\\[2ex] \end{aligned} H(D2∣A1)=H(D2∣A2)=H(D2∣A4)=−94(43log43+41log41)−93(32log32+31log31)=0.667−96(1⋅log1)−93(1⋅log1)=0−94(1⋅log1)−94(42log42+42log42)=0.444
g ( D 2 ∣ A 1 ) = 0.918 − 0.667 = 0.251 g ( D 2 ∣ A 2 ) = 0.918 − 0.000 = 0.918 g ( D 2 ∣ A 4 ) = 0.918 − 0.444 = 0.474 \begin{aligned} g(D_2|A_1)=0.918-0.667=0.251\\[1ex] g(D_2|A_2)=0.918-0.000=0.918\\[1ex] g(D_2|A_4)=0.918-0.444=0.474\\[1ex] \end{aligned} g(D2∣A1)=0.918−0.667=0.251g(D2∣A2)=0.918−0.000=0.918g(D2∣A4)=0.918−0.444=0.474
计算后发现信息增益最大的特征是
A
2
A_2
A2,所以执行步骤(5),将
D
2
D_2
D2划分为两个子集
D
21
,
D
22
D_{21},D_{22}
D21,D22,如下表:
I
D
年龄
有工作
有自己的房子
贷款情况
类别
4
青年
是
是
一般
是
8
中年
是
是
好
是
9
中年
否
是
非常好
是
D
1
10
中年
否
是
非常好
是
11
老年
否
是
非常好
是
12
老年
否
是
好
是
3
青年
是
否
好
是
13
老年
是
否
好
是
D
21
14
老年
是
否
非常好
是
1
青年
否
否
一般
否
2
青年
否
否
好
否
5
青年
否
否
一般
否
D
22
6
中年
否
否
一般
否
7
中年
否
否
好
否
15
老年
否
否
一般
否
\begin{array}{c|cc} \hline ID&\text{年龄}&\text{有工作}&\text{有自己的房子}&\text{贷款情况}&\text{类别}\\ \hline 4&\text{青年}&\text{是}&\text{是}&\text{一般}&\text{是}\\ 8&\text{中年}&\text{是}&\text{是}&\text{好}&\text{是}\\ 9&\text{中年}&\text{否}&\text{是}&\text{非常好}&\text{是}&D_1\\ 10&\text{中年}&\text{否}&\text{是}&\text{非常好}&\text{是}\\ 11&\text{老年}&\text{否}&\text{是}&\text{非常好}&\text{是}\\ 12&\text{老年}&\text{否}&\text{是}&\text{好}&\text{是}\\ \hline 3&\text{青年}&\text{是}&\text{否}&\text{好}&\text{是}\\ 13&\text{老年}&\text{是}&\text{否}&\text{好}&\text{是}&D_{21}\\ 14&\text{老年}&\text{是}&\text{否}&\text{非常好}&\text{是}\\ \hline 1&\text{青年}&\text{否}&\text{否}&\text{一般}&\text{否}\\ 2&\text{青年}&\text{否}&\text{否}&\text{好}&\text{否}\\ 5&\text{青年}&\text{否}&\text{否}&\text{一般}&\text{否}&D_{22}\\ 6&\text{中年}&\text{否}&\text{否}&\text{一般}&\text{否}\\ 7&\text{中年}&\text{否}&\text{否}&\text{好}&\text{否}\\ 15&\text{老年}&\text{否}&\text{否}&\text{一般}&\text{否}\\ \hline \end{array}
ID489101112313141256715年龄青年中年中年中年老年老年青年老年老年青年青年青年中年中年老年有工作是是否否否否是是是否否否否否否有自己的房子是是是是是是否否否否否否否否否贷款情况一般好非常好非常好非常好好好好非常好一般好一般一般好一般类别是是是是是是是是是否否否否否否D1D21D22
由划分后的结果可知, D 21 , D 22 D_{21},D_{22} D21,D22均满足步骤(1)中的条件,所以两部分均为叶节点,节点的类标记分别为“是”和“否”,到此递归结束;最终生成的决策树如下图所示:

如上就是整个决策树的生成过程,但同时我们也可以清楚的看到,ID3算法极易导致过拟合。原因就在于,如果单纯以 g ( D , A ) g(D,A) g(D,A)作为标准的话,会存在偏向于选择取值较多的特征(比如上面的 A 1 , A 4 A_1,A_4 A1,A4)虽然在这个例子中不存在。但是我们仍可以从直观上理解为什么ID3会偏向于选取特征值取值较多的特征。由于 g ( D , A ) g(D,A) g(D,A)的直观意义是 D D D被 A A A划分后不确定性的减少量,可想而知当 A A A的取值很多时 D D D会被划分成很多分,于是其不确定性自然会减少很多,从而ID3算法会倾向于选择取值较多的特征作为划分依据。可以想象如果这样做的话,我们最终得到的决策树将会是一颗很胖很矮的决策树树,进而导致了模型的过拟合现象。
2.3 C4.5算法
为了解决ID3算法的弊端,从而产生了C4.5算法。C4.5算法与ID3算法相似,不同之处仅在于C4.5算法在选择特征的时候采用了信息增益比作为标准。具体为,特征 A A A对训练集 D D D的信息增益比 g R ( D , A ) g_R(D,A) gR(D,A)定义为其信息增益 g ( D , A ) g(D,A) g(D,A)与其训练集 D D D关于特征 A A A的信息熵熵 H A ( D ) H_A(D) HA(D)之比,即
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
(7)
g_R(D,A)=\frac{g(D,A)}{H_A(D)}\tag{7}
gR(D,A)=HA(D)g(D,A)(7)
其中,
H
A
(
D
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
log
2
∣
D
i
∣
∣
D
∣
H_A(D)=-\displaystyle\sum_{i=1}^n\frac{|D_i|}{|D|}\log_2{\frac{|D_i|}{|D|}}
HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣,
n
n
n是特征
A
A
A取值的个数。
如在前面的例子中,对于选取根节点时,其增益比计算如下:
g
(
D
,
A
1
)
=
0.971
−
0.888
=
0.083
g
(
D
,
A
2
)
=
0.971
−
0.647
=
0.324
g
(
D
,
A
3
)
=
0.971
−
0.551
=
0.420
g
(
D
,
A
4
)
=
0.971
−
0.608
=
0.363
\begin{aligned} g(D,A_1)=0.971-0.888=0.083\\[1ex] g(D,A_2)=0.971-0.647=0.324\\[1ex] g(D,A_3)=0.971-0.551=0.420\\[1ex] g(D,A_4)=0.971-0.608=0.363\\[1ex] \end{aligned}
g(D,A1)=0.971−0.888=0.083g(D,A2)=0.971−0.647=0.324g(D,A3)=0.971−0.551=0.420g(D,A4)=0.971−0.608=0.363
H A 1 ( D ) = − ∑ i = 1 3 ∣ D i ∣ ∣ D ∣ log ∣ D i ∣ ∣ D ∣ = − ( 5 15 log 5 15 + 5 15 log 5 15 + 5 15 log 5 15 ) = 1.585 H A 2 ( D ) = − ( 10 15 log 10 15 + 5 15 log 5 15 ) = 0.918 H A 3 ( D ) = − ( 9 15 log 9 15 + 6 15 log 6 15 ) = 0.971 H A 4 ( D ) = − ( 5 15 log 5 15 + 6 15 log 6 15 + 4 15 log 4 15 ) = 1.566 \begin{aligned} H_{A_1}(D)&=-\sum_{i=1}^3\frac{|D_i|}{|D|}\log{\frac{|D_i|}{|D|}}\\[2ex] &=-(\frac{5}{15}\log{\frac{5}{15}}+\frac{5}{15}\log{\frac{5}{15}}+\frac{5}{15}\log{\frac{5}{15}})=1.585\\[2ex] H_{A_2}(D)&=-(\frac{10}{15}\log{\frac{10}{15}}+\frac{5}{15}\log{\frac{5}{15}})=0.918\\[2ex] H_{A_3}(D)&=-(\frac{9}{15}\log{\frac{9}{15}}+\frac{6}{15}\log{\frac{6}{15}})=0.971\\[2ex] H_{A_4}(D)&=-(\frac{5}{15}\log{\frac{5}{15}}+\frac{6}{15}\log{\frac{6}{15}}+\frac{4}{15}\log{\frac{4}{15}})=1.566\\[2ex] \end{aligned} HA1(D)HA2(D)HA3(D)HA4(D)=−i=1∑3∣D∣∣Di∣log∣D∣∣Di∣=−(155log155+155log155+155log155)=1.585=−(1510log1510+155log155)=0.918=−(159log159+156log156)=0.971=−(155log155+156log156+154log154)=1.566
所以有:
g
R
(
D
,
A
1
)
=
0.083
1.583
=
0.052
g
R
(
D
,
A
2
)
=
0.324
0.918
=
0.353
g
R
(
D
,
A
3
)
=
0.420
0.971
=
0.433
g
R
(
D
,
A
4
)
=
0.363
1.566
=
0.232
\begin{aligned} g_R(D,A_1)=\frac{0.083}{1.583}=0.052\\[2ex] g_R(D,A_2)=\frac{0.324}{0.918}=0.353\\[2ex] g_R(D,A_3)=\frac{0.420}{0.971}=0.433\\[2ex] g_R(D,A_4)=\frac{0.363}{1.566}=0.232\\[2ex] \end{aligned}
gR(D,A1)=1.5830.083=0.052gR(D,A2)=0.9180.324=0.353gR(D,A3)=0.9710.420=0.433gR(D,A4)=1.5660.363=0.232
训练步骤如下:
输入:训练数据集D,特征集A,阈值
ε
\varepsilon
ε;
输出:决策树
(1)若
D
D
D中所有实例属于同一类
C
k
C_k
Ck,则T为单节点树,并将
C
k
C_k
Ck作为该节点的类标记,返回T;
(2)若
A
=
∅
A=\emptyset
A=∅,则T为单节点树,并将
D
D
D中实例数最大的类
C
k
C_k
Ck作为该 节点的类标记,返回T;
(3)否则,计算A中各特征对D的信息增益比,选择信息增益比最大的特征
A
g
A_g
Ag;
(4)如果
A
g
A_g
Ag的信息增益比小于阈值
ε
\varepsilon
ε,则置T为单节点树,并将D中实例数最大的类
C
k
C_k
Ck最为该节点的类标记,返回T;
(5)否则,对
A
g
A_g
Ag的每一个可能值
a
i
a_i
ai,以
A
g
=
a
i
A_g=a_i
Ag=ai将D分割为若干非空子集建立为子节点;
(6)对于第
i
i
i个子节点,以
D
i
D_i
Di为训练集,以
A
−
{
A
g
}
A-\{A_g\}
A−{Ag}为特征集,递归地调用(1)-(5),得到子树
T
i
T_i
Ti,返回
T
i
T_i
Ti
从以上训练步骤可以看出,C4.5算法与ID3算法的唯一为别就是选择的标准不同,而其它的步骤均为一样。
3 总结
在本篇文章中,我们首先回顾了决策树中几个基本的概念并进行了演算示例;接着介绍了如何通过信息增益这一划分标准(即ID3算法)来构造生成决策树,并以一个真实的例子进行了演算;最后我们通过引入信息增益比(即C4.5算法)来解决ID3算法所存在的弊端。在接下来的一篇,我们将继续学习决策树的生成与剪枝算法。本次内容就到此结束,感谢阅读!
若有任何疑问与见解,请发邮件至moon-hotel@hotmail.com并附上文章链接,青山不改,绿水长流,月来客栈见!
引用
[1] 《统计机器学习(第二版)》李航,公众号回复“统计学习方法”即可获得电子版与讲义
[2]《Python与机器学习实战》何宇健
[3] 示例代码:关注公众号回复“示例代码”即可直接获取!
