1、决策树定义
决策树模型呈现树形结构,在分类问题中,表示基于特征(属性或数值) 对实例进行分类的过程。
决策树学习本质上是从训练数据集中归纳出一组分类规则,其算法通常是一个递归地选择最优的特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个很好的分类的过程,如此递归地进行下去,直至所有训练数据子集能被基本正确分类。
决策树学习算法包括3部分:特征选择、树的生成和树的剪枝。常用的算法有ID3、C4.5和CART。
2、特征选择
特征选择在于选取对训练数据具有分类能力的特征,这样可以提高决策树学习的效率。目前特征选择的准则是信息增益、信息增益比及基尼指数(Gini指数)。
2.1、信息增益(ID3)
(1)概念补充
设
X
X
X是一个取有限个值的离散随机变量,其概率分布为
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
l
o
g
p
i
H(X)=-\sum_{i=1}^{n}{p_ilogp_i}
H(X)=−i=1∑npilogpi
熵越大,随机变量的不确定性就越大。
条件熵
H
(
Y
∣
X
)
H(Y|X)
H(Y∣X)表示在已知随机变量
X
X
X的条件下随机变量
Y
Y
Y的不确定性。随机变量
X
X
X给定条件下随机变量
Y
Y
Y的条件熵
H
(
Y
∣
X
)
H(Y|X)
H(Y∣X),定义为
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}^{n}{p_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,...n.
pi=P(X=xi),i=1,2,...n.
(2)信息增益
特征
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)
一般地,熵
H
(
Y
)
H(Y)
H(Y)与条件熵
H
(
Y
∣
X
)
H(Y|X)
H(Y∣X)之差称为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
(3)信息增益算法
设训练数据集为
D
D
D,
∣
D
∣
|D|
∣D∣表示样本个数。设有
K
K
K个类
C
k
C_k
Ck,
k
=
1
,
2
,
…
,
K
k=1,2,…,K
k=1,2,…,K,
∣
C
k
∣
|C_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\cap C_k
Dik=Di∩Ck,
∣
D
i
k
∣
|D_{ik}|
∣Dik∣为
D
i
k
D_{ik}
Dik的样本个数。
算法流程:
输入:训练数据集
D
D
D和特征
A
A
A;
输出:特征
A
A
A对训练数据集
D
D
D的信息增益
g
(
D
,
A
)
g(D,A)
g(D,A)。
(1)计算数据集D的经验熵
H
(
D
)
H(D)
H(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=1∑KDCklog2DCk
(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
∣
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=1∑nD∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
(3)计算信息增益
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)
2.2、信息增益比(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的经验熵
H
(
D
)
H(D)
H(D)之比:
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
g_R(D,A)=\frac{g(D,A)}{H_A(D)}
gR(D,A)=HA(D)g(D,A)
其中,
H
A
(
D
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
log
2
∣
D
i
∣
∣
D
∣
H_A(D)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|}\log_2{\frac{|D_i|}{|D|}}
HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣,
n
n
n是特征
A
A
A取值的个数。
2.3、基尼指数(CART)
分类问题中,假设有
K
K
K个类,样本点属于第
k
k
k类的概率为
p
k
p_k
pk,则概率分布的基尼指数定义为
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
i
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
Gini(p)=\sum_{k=1}^{K}p_k(i-p_k)=1-\sum_{k=1}^{K}{p_k}^2
Gini(p)=k=1∑Kpk(i−pk)=1−k=1∑Kpk2
对于二类分类问题,若样本点属于第1个类的概率是
p
p
p,则概率分布的基尼指数为
G
i
n
i
(
p
)
=
2
p
(
1
−
p
)
Gini(p)=2p(1-p)
Gini(p)=2p(1−p)
对于给定的样本集合
D
D
D,其基尼指数为
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
Gini(D)=1-\sum_{k=1}^{K}(\frac{|C_k|}{|D|})^2
Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
这里,
C
k
C_k
Ck是
D
D
D中属于第
k
k
k类的样本子集,
K
K
K是类的个数。
如果样本集合
D
D
D根据特征
A
A
A是否取某一可能值
a
a
a被分割成
D
1
D_1
D1和
D
2
D_2
D2两部分,则在特征
A
A
A的条件下,集合
D
D
D的基尼指数定义为
G
i
n
i
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
G
i
n
i
(
D
1
)
+
∣
D
2
∣
∣
D
∣
G
i
n
i
(
D
2
)
Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
基尼指数
G
i
n
i
(
D
)
Gini(D)
Gini(D)表示集合
D
D
D的不确定性,基尼指数
G
i
n
i
(
D
,
A
)
Gini(D,A)
Gini(D,A)表示经
A
=
a
A=a
A=a分割后集合
D
D
D的不确定性。基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似。
3、树的生成
3.1、ID3生成算法
输入:训练数据集
D
D
D,特征集
A
A
A,阈值
ε
\varepsilon
ε;
输出:决策树
T
T
T。
(1)若
D
D
D中所有实例属于同一类
C
k
C_k
Ck,则
T
T
T为单结点树,并将类
C
k
C_k
Ck作为该结点的类标记,返回
T
T
T;
(2)若
A
=
∅
A=\varnothing
A=∅,则
T
T
T为单结点树,并将
D
D
D中实例数最大的类
C
k
C_k
Ck作为该结点的类标记,返回
T
T
T;
(3)否则,计算
A
A
A中各特征对
D
D
D的信息增益,选择信息增益最大的特征
A
g
A_g
Ag;
(4)如果
A
g
A_g
Ag的信息增益小于阈值
ε
\varepsilon
ε,则置
T
T
T为单结点树,并将
D
D
D中实例数最大的类
C
k
C_k
Ck作为该结点的类标记,返回
T
T
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分割为若干非空子集
D
i
D_i
Di,将
D
i
D_i
Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树
T
T
T,返回
T
T
T;
(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。
3.2、C4.5生成算法
C4.5算法与ID3算法相似,C4.5在生成的过程中,用信息增益比来选择特征。
3.3、CART生成算法
输入:训练数据集
D
D
D,停止计算的条件;
输出:CART决策树。
根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:
(1)设结点的训练数据集为
D
D
D,计算现有特征对该数据集的基尼指数。此时,对每一个特征
A
A
A,对其可能取的每个值
a
a
a,根据样本点对
A
=
a
A=a
A=a的测试为“是”或“否”将
D
D
D分割成
D
1
D_1
D1和
D
2
D_2
D2两部分,计算
A
=
a
A=a
A=a时的基尼指数。
(2)在所有可能的特征
A
A
A以及它们所有可能的切分点
a
a
a中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
(3)对两个子结点递归地调用(1),(2),直至满足停止条件。
(4)生成CART决策树。
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
4、树的剪枝
在决策树学习中将已生成的树进行简化的过程称为剪枝(pruning)。具体地,剪枝从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
决策树的剪枝往往通过极小化决策树整体的损失函数(loss function)或代价函数(cost function)来实现。设树
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个,
k
=
1
,
2
,
…
,
K
k=1,2,…,K
k=1,2,…,K,
H
t
(
T
)
H_t(T)
Ht(T)为叶结点
t
t
t上的经验熵,
α
≥
0
\alpha\geq0
α≥0为参数,则决策树学习的损失函数可以定义为
C
α
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T|
Cα(T)=t=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}\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)=-\sum_{t=1}^{|T|}\sum_{k=1}^{K}{N_{tk}}\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\geq0
α≥0控制两者之间的影响。较大的
α
\alpha
α促使选择较简单的模型(树),较小的
α
\alpha
α促使选择较复杂的模型(树)。
4.1、树的剪枝算法
输入:生成算法产生的整个树
T
T
T,参数
α
\alpha
α;
输出:修剪后的子树
T
α
T_\alpha
Tα。
(1)计算每个结点的经验熵。
(2)递归地从树的叶结点向上回缩。
设一组叶结点回缩到其父结点之前与之后的整体树分别为
T
B
T_B
TB与
T
A
T_A
TA,其对应的损失函数值分别是
C
a
(
T
B
)
C_a(T_B)
Ca(TB)与
C
a
(
T
A
)
C_a(T_A)
Ca(TA),如果
C
a
(
T
A
)
≤
C
a
(
T
B
)
C_a(T_A)\leq C_a(T_B)
Ca(TA)≤Ca(TB)
则进行剪枝,即将父结点变为新的叶结点。
(3)返回(2),直至不能继续为止,得到损失函数最小的子树
T
α
T_\alpha
Tα。
4.2、CART剪枝算法
从整体树
T
0
T_0
T0开始剪枝。对
T
0
T_0
T0的任意内部结点
t
t
t,以
t
t
t为单结点树的损失函数是
C
α
(
t
)
=
C
(
t
)
+
α
C_\alpha(t)=C(t)+\alpha
Cα(t)=C(t)+α
以
t
t
t为根结点的子树
T
t
T_t
Tt的损失函数是
C
α
(
T
t
)
=
C
(
T
t
)
+
α
∣
T
t
∣
C_\alpha(T_t)=C(T_t)+\alpha|T_t|
Cα(Tt)=C(Tt)+α∣Tt∣
对
T
0
T_0
T0中每一内部结点
t
t
t,计算
g
(
t
)
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}
g(t)=∣Tt∣−1C(t)−C(Tt)
它表示剪枝后整体损失函数减少的程度。
算法:
输入:CART算法生成的决策树
T
0
T_0
T0;
输出:最优决策树
T
α
T_\alpha
Tα.
(1)设
k
=
0
k=0
k=0,
T
=
T
0
T=T_0
T=T0.
(2)设
a
=
+
∞
a=+\infty
a=+∞.
(3)自下而上地对各内部结点
t
t
t计算
C
(
T
t
)
C(T_t)
C(Tt),
∣
T
t
∣
|T_t|
∣Tt∣以及
g
(
t
)
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}
g(t)=∣Tt∣−1C(t)−C(Tt)
α
=
m
i
n
(
α
,
g
(
t
)
)
\alpha=min(\alpha,g(t))
α=min(α,g(t))
这里,
T
t
T_t
Tt表示以
t
t
t为根结点的子树,
C
(
T
t
)
C(T_t)
C(Tt)是对训练数据的预测误差,
∣
T
t
∣
|T_t|
∣Tt∣是
T
t
T_t
Tt的叶结点个数。
(4)对
g
(
t
)
=
α
g(t)=\alpha
g(t)=α 的内部结点
t
t
t 进行剪枝,并对叶结点
t
t
t 以多数表决法决定其类,得到树
T
T
T。
(5)设
k
=
k
+
1
k=k+1
k=k+1,
α
k
=
α
\alpha_k=\alpha
αk=α,
T
k
=
T
T_k=T
Tk=T.
(6)如果
T
k
T_k
Tk 不是由根结点及两个叶结点构成的树,则回到步骤(3),否则令
T
k
=
T
n
T_k=T_n
Tk=Tn 。
(7)采用交叉验证法在子树序列
T
0
,
T
1
,
…
,
T
n
T_0,T_1,…,T_n
T0,T1,…,Tn中选取最优子树
T
α
T_\alpha
Tα。