基础概念
熵
离散型变量X的概率分布是P(X)。它的熵
H
(
X
)
o
r
H
(
P
)
{H(X) \; or \; H(P)}
H(X)orH(P)越大,代表越均匀、越混乱、越不确定。熵的公式如下:
H
(
P
)
=
−
∑
x
∈
X
P
(
x
)
log
P
(
x
)
{H(P)} = {- \sum_{x \in X}P(x) \log P(x)}
H(P)=−x∈X∑P(x)logP(x)
定义
0
log
0
=
0
0\log0=0
0log0=0,熵是非负的。熵只与
X
X
X的分布有关,与
X
X
X取值无关。当X服从均匀分布时,熵最大。
假设随机变量X只取两个值,如0和1。此时X的分布为:
H
(
p
)
=
−
p
l
o
g
2
p
−
(
1
−
p
)
l
o
g
2
(
1
−
p
)
H(p)=-plog_2p-(1-p)log2(1-p)
H(p)=−plog2p−(1−p)log2(1−p)
此时,H§随着概率p的变换曲线如下图所示:
当p=0或者1时,随机变量完全是个确定值。所以熵达到了最小值,即 H ( p ) = 0 H(p) = 0 H(p)=0。但是当 p 0 = p 1 = 0.5 p_0=p_1=0.5 p0=p1=0.5时,不确定性最大,熵达到了最大值1。
条件熵
条件熵H(Y|X)类似于条件概率,它度量了我们的Y在知道X以后剩下的不确定性,即给定X的条件下,Y的条件概率分布的熵对X的数学期望。表达式如下:
H
(
Y
∣
X
)
=
∑
j
=
1
n
p
(
x
j
)
H
(
Y
∣
x
j
)
=
−
∑
i
=
1
n
p
(
x
i
,
y
i
)
l
o
g
p
(
y
i
∣
x
i
)
H(Y|X) = \sum\limits_{j=1}^{n}p(x_j)H(Y|x_j) = -\sum\limits_{i=1}^{n}p(x_i,y_i)logp(y_i|x_i)
H(Y∣X)=j=1∑np(xj)H(Y∣xj)=−i=1∑np(xi,yi)logp(yi∣xi)
当熵和条件熵中的概率p由数据估计(常见的是用极大似然估计)得到的时,对应的熵和条件熵成为经验熵和经验条件熵。
信息增益
特征A对数据集D的信息增益g(D|A)定义为:集合D的经验熵H(D)与特征A给定的条件下
D
D
D的经验条件熵
H
(
D
∣
A
)
H(D|A)
H(D∣A)之差:
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)
一般的熵与条件熵的差也称为互信息。表示给定特征A使得数据集D不确定性减少的程度。显然不同的特征有不同的信息增益,使得信息增益最大的特征具有更强的分类能力。
信息增益算法:
输入:训练数据集 D D D和特征 A A A
输出:特征 A A A对训练数据集 D D D的信息增益 g ( D , A ) g(D,A) g(D,A)
- 数据集 D D D的经验熵 H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ log 2 ∣ C k ∣ ∣ D ∣ H(D)=-\sum_{k=1}^K\frac{|C_k|}{|D|}\log_2\frac{|C_k|}{|D|} H(D)=−∑k=1K∣D∣∣Ck∣log2∣D∣∣Ck∣
- 特征 A A A对数据集 D D D的经验条件熵 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 ∣ 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|} H(D∣A)=∑i=1n∣D∣∣Di∣H(Di)=−∑i=1n∣D∣∣Di∣∑k=1K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
- 信息增益 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
其中,|D|表示样本个数。假设有K个类,每个类用 C k C_k Ck表示,| C k C_k Ck|表示属于第k个类别的样本个数。特征A有n个不同的取值{ α 1 , α 2 , . . . , α n \alpha_1, \alpha_2,..., \alpha_n α1,α2,...,αn},那么用 D i D_i Di表示特征A取第i个值的样本集合, D i k D_{ik} Dik用于表示 D i D_i Di中属于第k个类别的样本集合。
举个例子:
首先计算经验熵H(D):
H
(
D
)
=
−
(
9
15
l
o
g
2
9
15
+
6
15
l
o
g
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
分别用
A
1
,
A
2
,
A
3
,
A
4
A_1,A_2,A_3,A_4
A1,A2,A3,A4表示年龄、有工作、有房子、贷款情况4个特征,则有:
H
(
D
∣
A
1
)
=
5
15
H
(
D
1
)
+
5
15
H
(
D
2
)
+
5
15
H
(
D
3
)
=
−
5
15
(
3
5
l
o
g
2
3
5
+
2
5
l
o
g
2
2
5
)
−
5
15
(
2
5
l
o
g
2
2
5
+
3
5
l
o
g
2
3
5
)
−
5
15
(
4
5
l
o
g
2
4
5
+
1
5
l
o
g
2
1
5
)
=
0.888
\begin{aligned} H(D|A_1) &= \frac{5}{15}H(D1) + \frac{5}{15}H(D2) + \frac{5}{15}H(D3) \\ &= -\frac{5}{15}(\frac{3}{5}log_2\frac{3}{5} + \frac{2}{5}log_2\frac{2}{5}) - \frac{5}{15}(\frac{2}{5}log_2\frac{2}{5}\\ & \quad+ \frac{3}{5}log_2\frac{3}{5}) -\frac{5}{15}(\frac{4}{5}log_2\frac{4}{5} + \frac{1}{5}log_2\frac{1}{5})\\ &= 0.888 \end{aligned}
H(D∣A1)=155H(D1)+155H(D2)+155H(D3)=−155(53log253+52log252)−155(52log252+53log253)−155(54log254+51log251)=0.888
于是得到特征
A
1
A_1
A1的信息增益为:
g
(
D
∣
A
1
)
=
H
(
D
)
−
H
(
D
∣
A
1
)
=
0.083
g(D|A_1) = H(D)-H(D|A_1) = 0.083
g(D∣A1)=H(D)−H(D∣A1)=0.083
同理可以得到:
g
(
D
∣
A
2
)
=
H
(
D
)
−
H
(
D
∣
A
2
)
=
0.324
g
(
D
∣
A
3
)
=
H
(
D
)
−
H
(
D
∣
A
3
)
=
0.420
g
(
D
∣
A
4
)
=
H
(
D
)
−
H
(
D
∣
A
4
)
=
0.363
g(D|A_2) = H(D)-H(D|A_2) = 0.324 \\ g(D|A_3) = H(D)-H(D|A_3) = 0.420 \\ g(D|A_4) = H(D)-H(D|A_4) = 0.363
g(D∣A2)=H(D)−H(D∣A2)=0.324g(D∣A3)=H(D)−H(D∣A3)=0.420g(D∣A4)=H(D)−H(D∣A4)=0.363
发现
A
3
A_3
A3的信息增益最大,因此
A
3
A_3
A3为最优特征。
信息增益比
以信息增益来筛选最优特征,会导致取值个数多的特征信息增益很大。例如我们把每条记录的唯一标识ID作为特征的话,那么每个ID的值都能唯一区分一条记录的类别,这样肯定会造成过拟合从而达不到我们预期的效果。
为此,我们引入了信息增益比来校正这一问题,用
g
R
(
D
,
A
)
g_R(D,A)
gR(D,A)表示:
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
H
A
(
D
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
l
o
g
2
∣
D
i
∣
∣
D
∣
g_R(D,A)= \frac{g(D,A)}{H_A(D)} \\ H_A(D) = -\sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}
gR(D,A)=HA(D)g(D,A)HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
即信息增益比为 特征A的信息增益 与 D关于特征A各个取值的熵 之比。
决策树生成
前面提到的信息增益和信息增益比,可以用来衡量某个特征对样本的划分能力。基于之前讲到的内容,接下来介绍的ID3生成算法和C4.5生成算法。
ID3生成算法
输入:训练数据集
D
D
D, 特征集
A
A
A,阈值
ϵ
\epsilon
ϵ
输出:决策树
T
T
T
- 如果 D D D属于同一类 C k C_k Ck, T T T为单节点树,类 C k C_k Ck作为该节点的类标记,返回 T T T
- 如果 A A A是空集,置 T T T为单节点树,实例数最多的类作为该节点类标记,返回 T T T
- 计算 g g g, 选择信息增益最大的特征 A g A_g Ag
- 如果 A g A_g Ag的信息增益小于 ϵ \epsilon ϵ, T T T为单节点树, D D D中实例数最大的类 C k C_k Ck作为类标记,返回 T T T
- A g A_g Ag的不同特征取值可以划分出若干非空子集 D i D_i Di,
- D i D_i Di训练集, A − A g A-A_g A−Ag为特征集,递归调用前面步骤,得到 T i T_i Ti,返回 T i T_i Ti
举个例子,由于特征 A 3 A_3 A3的信息增益最大,所以选择对应的特征“有房子”作为决策树的根节点。根据 A 3 A_3 A3取值的不同,导致树形成了“是”( D 1 D_1 D1)与“否”(D2)两个分支。对于两个分支,还需要继续对分支后的数据 D 1 , D 2 D_1, D_2 D1,D2分别找新的划分特征。对于 D 1 D_1 D1中的样本而言,他们都是一个类别,所以作为叶节点。
例如对
D
2
D_2
D2而言,需要从年龄、有工作、贷款情况中选择新特征:
g
(
D
2
∣
A
1
)
=
H
(
D
2
)
−
H
(
D
2
∣
A
1
)
=
0.251
g
(
D
2
∣
A
2
)
=
H
(
D
2
)
−
H
(
D
2
∣
A
2
)
=
0.918
g
(
D
2
∣
A
3
)
=
H
(
D
2
)
−
H
(
D
2
∣
A
3
)
=
0.474
g(D_2|A_1) = H(D_2)-H(D_2|A_1) = 0.251 \\ g(D_2|A_2) = H(D_2)-H(D_2|A_2) = 0.918 \\ g(D_2|A_3) = H(D_2)-H(D_2|A_3) = 0.474
g(D2∣A1)=H(D2)−H(D2∣A1)=0.251g(D2∣A2)=H(D2)−H(D2∣A2)=0.918g(D2∣A3)=H(D2)−H(D2∣A3)=0.474
于是,选择
A
2
A_2
A2对应的特征“有工作”来继续划分数据集,由于“是”有工作的子集有3个样本,且这三个样本都属于同一个类别,于是这是一个叶节点。对于标记为“否”的分支的6个样本也都属于一个类别,所以也是一个叶节点。最终得到的决策树为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eweq9C8L-1589329455836)(F:\优快云\树模型\决策树\assets\1589181996988.png)]
ID3算法不足之处:
- 容易过拟合
- 没有考虑连续特征的处理
- 没有考虑缺失值处理
- 偏好于将特征取值个数多的作为重要特征
决策树剪枝
越是复杂的决策树,越是容易过拟合,解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化,这个过程称为剪枝。
剪枝往往通过极小化决策树整体的损失函数或者代价函数来实现。
树
T
T
T的叶结点个数为
∣
T
∣
|T|
∣T∣,
t
t
t是树
T
T
T的叶结点,该结点有
N
t
N_t
Nt个样本点,其中
k
k
k类的样本点有
N
t
k
N_{tk}
Ntk个,
H
t
(
T
)
H_t(T)
Ht(T)为叶结点
t
t
t上的经验熵,
α
⩾
0
\alpha\geqslant 0
α⩾0为参数,决策树学习的损失函数可以定义为
C
α
(
T
)
=
∑
i
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
C_\alpha(T)=\sum_{i=1}^{|T|}N_tH_t(T)+\alpha|T|
Cα(T)=i=1∑∣T∣NtHt(T)+α∣T∣
其中
H
t
(
T
)
=
−
∑
k
N
t
k
N
t
log
N
t
k
N
t
H_t(T)=-\sum_k\frac{N_{tk}}{N_t}\color{black}\log \frac{N_{tk}}{N_t}
Ht(T)=−k∑NtNtklogNtNtk
C ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) = − ∑ t = 1 ∣ T ∣ ∑ k = 1 K N t k log N t k N t C(T)=\sum_{t=1}^{|T|}N_tH_t(T)\color{black}=-\sum_{t=1}^{|T|}\sum_{k=1}^K N_{tk}\color{black}\log\frac{N_{tk}}{N_t} C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk
这时有
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_\alpha(T)=C(T)+\alpha|T|
Cα(T)=C(T)+α∣T∣
其中
C
(
T
)
C(T)
C(T)表示模型对训练数据的误差,
∣
T
∣
|T|
∣T∣表示模型复杂度,参数
α
⩾
0
\alpha \geqslant 0
α⩾0控制两者之间的影响。
树的剪枝算法如下:
输入:生成算法生成的整个树 T T T,参数 α \alpha α
输出:修剪后的子树 T α T_\alpha Tα
-
计算每个叶结点的经验熵
-
递归的从树的叶结点向上回溯
假设一组叶结点回溯到其父结点之前与之后的整体树分别是 T B T_B TB和 T A T_A TA,其对应的损失函数分别是 C α ( T A ) C_\alpha(T_A) Cα(TA)和 C α ( T B ) C_\alpha(T_B) Cα(TB),如果 C α ( T A ) ⩽ C α ( T B ) C_\alpha(T_A)\leqslant C_\alpha(T_B) Cα(TA)⩽Cα(TB)则进行剪枝,即将父结点变为新的叶结点:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjC6Z4fY-1589329455839)(F:\优快云\树模型\决策树\assets\1589188171003.png)]
-
返回2,直至不能继续为止,得到损失函数最小的子树 T α T_\alpha Tα
C4.5生成算法
对于ID3算法的第一个缺陷,C4.5算法可以通过剪枝的方式,增强了模型的泛化能力。
对于第二个缺陷:不能处理连续特征, C4.5的思路是将连续的特征离散化。比如特征A的连续特征值有n个,从小到大排列为
a
1
,
a
2
,
.
.
.
,
a
n
{a_1,a_2,...,a_n}
a1,a2,...,an,则C4.5取相邻两样本值的平均数,一共取得n-1个划分点,其中第i个划分点
T
i
表
示
T_i表示
Ti表示为:
T
i
=
a
i
+
a
i
+
1
2
T_i = \frac{a_i+a_{i+1}}{2}
Ti=2ai+ai+1。对于这n-1个点,分别计算以该点作为二元分类点时的信息增益:
g
(
D
,
a
)
=
H
(
D
)
−
H
(
D
∣
a
)
g(D,a)=H(D)-H(D|a)
g(D,a)=H(D)−H(D∣a)
选择n-1个信息增益中最大的点作为该连续特征的二元离散分类点。比如取到的增益最大的点为
a
t
a_t
at,则小于
a
t
a_t
at的值为类别1,大于
a
t
a_t
at的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。
对于第三个缺陷:没有考虑对缺失值的处理。C4.5主要解决两个问题:
(1)如何在属性值缺失的情况下进行划分属性选择?
(2)给定划分属性,若样本在该属性上缺失,如何对样本进行划分?
对于问题(1),给定训练集D和属性A,令 D ^ \hat D D^ 表示D中在属性A上没有缺失值的样本子集。假定A的取值有v个: { a 1 , a 2 , … , a v } \{a_1,a_2,\ldots,a_v\} {a1,a2,…,av},令 D ^ v \hat D^v D^v 表示在属性A上取值为 a v a_v av 的样本子集(如:是否有工作)。 D ^ k \hat D_k D^k 表示 D ^ \hat D D^ 中第k类样本子集。为每一个样本 x x x赋予一个权重 w x w_x wx,定义:
对于属性A,无缺失样本所占的比例为:
ρ
=
∑
x
∈
D
^
w
x
∑
x
∈
D
w
x
\rho = \frac{\sum_{x\in\hat D} w_ \mathbf x}{\sum_{x\in D} w_ \mathbf x}
ρ=∑x∈Dwx∑x∈D^wx
无缺失样本中第k类所占的比例为:
p
^
k
=
∑
x
∈
D
^
k
w
x
∑
x
∈
D
^
w
x
\hat p_k =\frac{\sum_{x\in\hat D_k} w_ \mathbf x}{\sum_{x\in \hat D} w_ \mathbf x}
p^k=∑x∈D^wx∑x∈D^kwx
无缺失样本中在属性A上取值为
a
v
a_v
av 的样本所占的比例为:
r
^
v
=
∑
x
∈
D
^
v
w
x
∑
x
∈
D
^
w
x
\hat r_v =\frac{\sum_{x\in\hat D^v} w_ \mathbf x}{\sum_{x\in \hat D} w_ \mathbf x}
r^v=∑x∈D^wx∑x∈D^vwx
样本存在缺失值的情况下,采用以下的信息增益计算方式:
g
(
D
,
A
)
=
ρ
×
g
(
D
^
,
A
)
=
ρ
×
(
H
(
D
^
)
−
H
(
D
^
∣
A
)
)
\begin{aligned} g(D,A)&=\rho \times g(\hat D,A) \\ &= \rho \times \left(H(\hat D)-H(\hat D|A)\right) \end{aligned}
g(D,A)=ρ×g(D^,A)=ρ×(H(D^)−H(D^∣A))
其中:
H
(
D
^
)
=
−
∑
k
=
1
k
p
^
k
log
2
p
^
k
H
(
D
^
∣
A
)
=
∑
v
=
1
v
r
^
v
H
(
D
^
v
)
H(\hat D)=-\sum_{k=1}^k\hat p_k\log_2\hat p_k\\ H(\hat D|A) = \sum_{v=1}^v \hat r_v H(\hat D^v)
H(D^)=−k=1∑kp^klog2p^kH(D^∣A)=v=1∑vr^vH(D^v)
其实就是:第一步先计算无缺失值的样本的各个特征的信息增益,然后乘以该特征的无缺失样本的占比。再选择信息增益最大的特征作为划分特征。这也就回答了第一个问题。
对于问题(2),可以将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9。
对于第四个缺陷:特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题。即采用信息增益比来选择特征:
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
H
A
(
D
)
=
−
∑
i
=
1
n
D
i
D
l
o
g
2
D
i
D
g_R(D,A)=\frac{g(D,A)}{H_A(D)}\\ H_A(D)=-\sum_{i=1}^n\frac{D_i}{D}log_2\frac{D_i}{D}
gR(D,A)=HA(D)g(D,A)HA(D)=−i=1∑nDDilog2DDi
C4.5 算法流程如下:
输入:训练数据集
D
D
D,特征集
A
A
A,阈值
ϵ
\epsilon
ϵ
输出:决策树
T
T
T
- 如果 D D D属于同一类 C k C_k Ck, T T T为单节点树,类 C k C_k Ck作为该节点的类标记,返回 T T T
- 如果 A A A是空集, 置 T T T为单节点树,实例数最多的作为该节点类标记,返回 T T T
- 计算 g g g, 选择信息增益比最大的特征 A g A_g Ag
- 如果 A g A_g Ag的信息增益比小于 ϵ \epsilon ϵ, T T T为单节点树, D D D中实例数最大的类 C k C_k Ck作为类标记,返回 T T T
- A g A_g Ag划分若干非空子集 D i D_i Di,
- D i D_i Di训练集, A − A g A-A_g A−Ag为特征集,递归调用前面步骤,得到 T i T_i Ti,返回 T i T_i Ti
ID3和C4.5在生成上,差异只是准则不同。
C4.5 同样具有局限性,仍然有优化的空间:
-
C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
-
C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。
-
C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。
下一篇介绍的使用CART算法生成的决策树一定程度上解决了这些问题。
参考文章:
《统计学习方法 第二版》