决策树是一种基本的分类与回归方法。决策树的学习包含三个步骤:特征选择、决策树的生成、决策树的修剪。决策树根据不同的特征选择原则分为ID3算法、C4.5算法、CART算法。
基本概念
在介绍决策树之前先来了解一些基本相关概念。
1、熵
熵是随机变量不确定性的度量。设X是一个有限取值的离散随机变量,其概率分布为:
P
(
X
=
x
i
)
=
p
i
,
i
=
1
,
2
,
…
n
P(X=x_i) = p_i,\quad i=1,2,\ldots n
P(X=xi)=pi,i=1,2,…n
随机变量X的熵定义:
H
(
p
)
=
H
(
X
)
=
−
∑
i
=
1
n
p
i
log
p
i
H(p)=H(X)=-\sum_{i=1}^{n}p_i\log p_i
H(p)=H(X)=−i=1∑npilogpi
熵只与
X
X
X的分布有关,与
X
X
X取值无关
当随机变量只有两个取值时,例如1,0,即X的分布:
P
(
X
=
1
)
=
p
,
P
(
X
=
0
)
=
1
−
p
P(X=1) = p,\quad P(X=0)=1-p
P(X=1)=p,P(X=0)=1−p
熵为:
H
(
p
)
=
−
p
log
p
−
(
1
−
p
)
log
(
1
−
p
)
H(p)=-p\log p -(1-p)\log(1-p)
H(p)=−plogp−(1−p)log(1−p)
这时,熵
H
(
p
)
H(p)
H(p) 随概率
p
p
p变化的曲线如图所示:
当
p
=
0
p=0
p=0 或
p
=
1
p=1
p=1 时
H
(
p
)
=
0
H(p)=0
H(p)=0 随机变量完全没有不确定性。当
p
=
0.5
p=0.5
p=0.5 时,
H
(
p
)
=
1
H(p)=1
H(p)=1,熵取值最大,随机变量不确定性最大。
2、条件熵
定义为
X
X
X给定条件下
Y
Y
Y的条件概率分布的熵对
X
X
X 的数学期望:
H
(
Y
∣
X
)
=
∑
i
=
1
n
p
i
H
(
Y
∣
X
=
x
i
)
H(Y|X)=\sum_{i=1}^np_iH(Y|X=x_i)
H(Y∣X)=i=1∑npiH(Y∣X=xi)
其中
p
i
=
P
(
X
=
x
i
)
,
i
=
1
,
2
,
…
,
n
p_i=P(X=x_i),i=1,2,\dots ,n
pi=P(X=xi),i=1,2,…,n
3、信息增益
表示得知特征 X X X 的信息而使得类 Y Y Y 的信息的不确定性减少的程度。
特征
A
A
A对训练数据集
D
D
D的信息增益
g
(
D
∣
A
)
g(D|A)
g(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
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)
熵与条件熵的差称为互信息。
给定训练数据集D和特征A,熵 H ( D ) H(D) H(D) 表示对数据集D进行分类的不确定性。条件熵 H ( D ∣ A ) H(D|A) H(D∣A) 表示在特征A给定条件下对数据集D进行分类的不确定性。二者的差,即信息增益,表示由于特征A而使得对数据集D的分类的不确定性减少的程度,不同的特征有不同的信息增益,信息增益大的特征有更强的分类能力。
4、信息增益比
特征
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
)
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
n
n
n 是特征
A
A
A 的取值个数。
ID3 算法
ID3算法的通过信息增益来进行特征选择生成决策树。
信息增益算法
输入:训练数据集 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)
计算所有的特征的信息增益,根据信息增益的大小确定最优特征。
通过下面这个例子来说明ID3算法生成决策树的过程。
下表是由15个样本组成的贷款申请训练数据。
希望通过所给的训练数据学习一个贷款申请决策树,用以对未来的贷款申请进行分类。
首先计算熵
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
然后计算各个特征对数据集D的信息增益,分别以
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(D_1) + \frac{5}{15}H(D_2) + \frac{5}{15}H(D_3) \\&= -\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} + \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
D
1
,
D
2
,
D
3
D_1,D_2,D_3
D1,D2,D3 分别表示
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
同理计算是否有工作的信息增益为:
H
(
D
∣
A
2
)
=
H
(
D
)
−
[
5
15
H
(
D
1
)
+
10
15
H
(
D
2
)
]
=
0.971
−
[
5
15
×
0
+
10
15
(
−
4
10
l
o
g
2
4
10
−
6
10
l
o
g
2
6
10
)
]
=
0.324
\begin{aligned} H(D|A_2) &= H(D) -\left[\frac{5}{15}H(D_1) + \frac{10}{15}H(D_2) \right] \\&= 0.971-\left[\frac{5}{15}\times 0+ \frac{10}{15}(-\frac{4}{10}log_2\frac{4}{10} - \frac{6}{10}log_2\frac{6}{10}) \right] \\&= 0.324 \end{aligned}
H(D∣A2)=H(D)−[155H(D1)+1510H(D2)]=0.971−[155×0+1510(−104log2104−106log2106)]=0.324
是否有房子的信息增益为:
H
(
D
∣
A
3
)
=
H
(
D
)
−
[
6
15
H
(
D
1
)
+
9
15
H
(
D
2
)
]
=
0.971
−
[
6
15
×
0
+
9
15
(
−
3
9
l
o
g
2
3
9
−
6
9
l
o
g
2
6
9
)
]
=
0.420
\begin{aligned} H(D|A_3) &= H(D) -\left[\frac{6}{15}H(D_1) + \frac{9}{15}H(D_2) \right] \\&= 0.971-\left[\frac{6}{15}\times 0+ \frac{9}{15}(-\frac{3}{9}log_2\frac{3}{9} - \frac{6}{9}log_2\frac{6}{9}) \right] \\&= 0.420 \end{aligned}
H(D∣A3)=H(D)−[156H(D1)+159H(D2)]=0.971−[156×0+159(−93log293−96log296)]=0.420
信贷情况的信息增益:
H
(
D
∣
A
4
)
=
0.971
−
0.608
=
0420
\begin{aligned} H(D|A_4) = 0.971 - 0.608=0420 \end{aligned}
H(D∣A4)=0.971−0.608=0420
比较后,发现特征
A
3
A_3
A3 (有自己的房子)的信息增益最大,所以选择特征
A
3
A_3
A3 作为最优特征。所以
A
3
A_3
A3 作为根结点的特征。然后将数据集分为两个子集
D
1
D_1
D1(拥有自己的房子)和
D
2
D_2
D2(没有自己的房子)。
D
1
D_1
D1 只有同一类样本点,所以他成为一个叶子结点。对于
D
2
D_2
D2 需要从特征
A
1
A_1
A1(年龄)、
A
2
A_2
A2(有工作)、
A
4
A_4
A4(信贷情况)中选择新的特征。计算各个特征的信息增益:
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
1
)
=
0.918
g
(
D
2
,
A
3
)
=
H
(
D
2
)
−
H
(
D
2
∣
A
1
)
=
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_1) = 0.918\\ g(D_2,A_3) = H(D_2)-H(D_2|A_1) = 0.474\\
g(D2,A1)=H(D2)−H(D2∣A1)=0.251g(D2,A2)=H(D2)−H(D2∣A1)=0.918g(D2,A3)=H(D2)−H(D2∣A1)=0.474
选择信息增益最大的特征
A
2
A_2
A2 作为结点特征。
A
2
A_2
A2 有两个可能的取值,从这一结点引出两个子结点:一个对应有工作的子结点,包含三个样本,均属于同一类,所以这是一个叶子节点。另一个是无工作的子结点,包含6个 样本,也属于同一类,所以这是一个叶子节点。所以就生成了如下的决策树:
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
ID3 算法缺陷:
(1)容易过拟合
(2)没有考虑连续特征的处理
(3)没有考虑对缺失值的处理
(4)采用信息增益的特征选择方法,在相同的情况下,取值较多的特征比取值少的特征信息增益大。
为了改进这些不足,C4.5算法对ID3生成决策树算法进行了改进。
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)给定划分属性,若样本在该属性上缺失,如何对样本进行划分。
给定训练集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
C4.5缺陷:
(1)只能用于分类,不能用于解决回归问题。
(2)C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
(3) C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。
决策树的剪枝
决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考忠如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。
在决策树学习中将已生成的树进行简化的过程称为剪枝(pruning) 。具体地,剪枝从已生成的树上裁掉一-些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
剪枝的过程往往通过极小化决策树的损失函数或代价函数来实现。
树
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\color{red}\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|}\color{red}N_tH_t(T)\color{black}=-\sum_{t=1}^{|T|}\sum_{k=1}^K\color{red}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控制两者之间的影响。
(1) 当 α \alpha α 较大时, ∣ T ∣ |T| ∣T∣ 较小,树的模型相对简单。
(2) 当 α \alpha α 较小时, ∣ T ∣ |T| ∣T∣ 较大,树的模型相对复杂。
(3)当 α = 0 \alpha=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)则进行剪枝,即将父结点变为新的叶结点:
- 返回2,直至不能继续为止,得到损失函数最小的子树 T α T_\alpha Tα