决策树是一种基本的分类与回归方法,决策树模型呈树形结构,可以认为是if-then规则的集合。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。开始,构建根结点,将所有训练数据都放在根结点。选择一个最优特征,按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。如果这些子集已经能够被基本正确分类,那么构建叶结点,并将这些子集分到所对应的叶结点中去;如果还是子集不能被基本正确分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的结点。如此递归地进行下去,直至所有训练数据子集被基本正确分类,或者没有合适的特征为止。最后每个子集都被分到叶结点上,即都有了明确的类,这就生成了一颗决策树。
决策树对于训练数据的拟合能力很强,但往往容易过拟合,导致对未知的测试数据未必有很好的分类能力。因此,需要引入剪枝步骤,将树模型简单化,从而使其具有更好的泛化能力。
决策树常用的算法有ID3、C4.5、CART、RF、GBDT、XGBoost、LGBM等,下面我们逐一介绍。
ID3
ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。最后得到一个决策树,ID3算法相当于用极大似然法进行概率模型的选择。但是ID3算法只有树的生成,所以容易过拟合。
信息增益
信息增益表示得知特征 X X X 的信息而使得类 Y Y Y 的信息的不确定性减少的程度。
设训练数据集为
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 的样本个数。特征
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
)
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
log
2
∣
C
k
∣
∣
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
∣
g(D,A)=H(D)-H(D|A) \\ H(D)=-\sum_{k=1}^K\frac{|C_k|}{|D|}\log_2\frac{|C_k|}{|D|} \\ 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|}
g(D,A)=H(D)−H(D∣A)H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
ID3算法:
输入:训练数据集
D
D
D,特征集
A
A
A,阈值
ε
\varepsilon
ε
输出:决策树
T
T
T
- 若 D D D 中所有实例属于同一类 C k C_k Ck,则 T T T 为单结点树,并将类 C k C_k Ck 作为该结点的类标记,返回 T T T;
- 若 A = ∅ A=\varnothing A=∅,则 T T T 为单结点树,并将 D D D 中实例数最大的类 C k C_k Ck 作为该结点的类标记,返回 T T T;
- 否则,计算 A A A 中各特征对 D D D 的信息增益,选择信息增益最大的特征 A g A_g Ag;
- 如果 A g A_g Ag 的信息增益小于阈值 ε \varepsilon ε,则置 T T T 为单结点树,并将 D D D 中实例数最大的类 C k C_k Ck 作为该结点的类标记,返回 T T T;
- 否则,对 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;
- 对第 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
C4.5与ID3一样,只是在特征选择时,将信息增益换成信息增益比。
信息增益比
特征
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
(
D
)
g_R(D,A)=\frac{g(D,A)}{H(D)}
gR(D,A)=H(D)g(D,A) 信息增益值的大小是相对于训练数据集而言的,并没有绝对意义。在分类问题困难时,即训练数据集经验熵大的时候,信息增益值会偏大,反之,则会偏小。因此,使用信息增益比可以对这一问题进行改善。
CART
分类与回归树(CART)模型由Breiman等人在1984年提出,是即可用于分类,也可用于回归。CART中的决策树全部是二叉树,内部结点取值只有“是”和“否”。注意,ID3和C4.5则没有要求决策树必须为“二叉”。
回归树
输入:训练数据集
D
D
D
输出:回归树
f
(
x
)
f(x)
f(x)
在训练数据集所在的输入空间中,递归地每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
- 选择最优切分变量
j
j
j 与切分点
s
s
s,求解
min j , s [ min c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] \min_{j,s} \bigg [ \min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2+\min_{c_2}\sum_{x_i\in R_2(j,s)}(y_i-c_2)^2 \bigg ] j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2]遍历变量 j j j,对固定的切分变量 j j j 扫描切分点 s s s,选择使上式达到最小值的对 ( j , s ) (j,s) (j,s)。 - 用选定的对
(
j
,
s
)
(j,s)
(j,s) 划分区域并决定相应的输出值:
R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } ,        R 2 ( j , s ) = { x ∣ x ( j ) > s } c m ^ = 1 N m ∑ x i ∈ R m ( j , s ) y i ,        x ∈ R m ,        m = 1 , 2 R_1(j,s)=\{x|x^{(j)} \leq s\},\;\;\; R_2(j,s)=\{x|x^{(j)}>s\} \\ \hat{c_m}=\frac{1}{N_m}\sum_{x_i \in R_m(j,s)} y_i, \;\;\; x\in R_m,\;\;\; m=1,2 R1(j,s)={x∣x(j)≤s},R2(j,s)={x∣x(j)>s}cm^=Nm1xi∈Rm(j,s)∑yi,x∈Rm,m=1,2 - 继续对两个子区域调用步骤1,2,直至满足停止条件。
- 将输入空间划分为
M
M
M 个区域
R
1
,
R
2
,
.
.
.
,
R
M
R_1,R_2,...,R_M
R1,R2,...,RM,生成决策树:
f ( x ) = ∑ m = 1 M c m ^ I ( x ∈ R m ) f(x)=\sum_{m=1}^M \hat{c_m}I(x\in R_m) f(x)=m=1∑Mcm^I(x∈Rm)
分类树
输入:训练数据集
D
D
D,停止计算的条件
输出:CART决策树
根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:
- 设结点的训练数据集为
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 时的基尼指数:
G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) \\ Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2 Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2其中, C k C_k Ck 是 D D D 中属于第 k k k 类的样本子集。 - 在所有可能的特征 A A A 以及它们所有可能的切分点 a a a 中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
- 对两个子结点递归地调用步骤1,2,直至满足停止条件。
- 生成CART决策树。
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
CART剪枝
决策树剪枝是通过从底端剪去一些子树,使决策树变小变简单,避免过拟合的发生,从而能够对未知数据有更准确的预测。CART剪枝算法由两步组成:剪枝+交叉验证选子树。
剪枝
在剪枝过程中,计算子树的损失函数:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=C(T)+\alpha|T|
Cα(T)=C(T)+α∣T∣其中,
T
T
T 为任意子树,
C
(
T
)
C(T)
C(T) 为对训练数据的预测误差,
∣
T
∣
|T|
∣T∣ 为子树的叶结点个数,
α
≥
0
\alpha \ge0
α≥0 为参数,
C
α
(
T
)
C_{\alpha}(T)
Cα(T) 为参数是
α
\alpha
α 时的子树
T
T
T 的整体损失。参数
α
\alpha
α 权衡训练数据的拟合程度与模型复杂度。
具体地,从整体树
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∣当
α
=
0
\alpha=0
α=0 及
α
\alpha
α 充分小的时候,有:
C
α
(
T
t
)
<
C
α
(
t
)
C_{\alpha}(T_t)<C_{\alpha}(t)
Cα(Tt)<Cα(t)当
α
\alpha
α 增大时,在某一
α
\alpha
α 有:
C
α
(
T
t
)
=
C
α
(
t
)
C_{\alpha}(T_t)=C_{\alpha}(t)
Cα(Tt)=Cα(t)当
α
\alpha
α 继续增大时,不等式反向。即当
α
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
\alpha=\frac{C(t)-C(T_t)}{|T_t|-1}
α=∣Tt∣−1C(t)−C(Tt) 时,
T
t
T_t
Tt 与
t
t
t 有相同的损失函数值,而
t
t
t 的结点少,因此
t
t
t 比
T
t
T_t
Tt 更可取,对
T
t
T_t
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)它表示剪枝后整体损失函数减少的程度。在
T
0
T_0
T0 中剪去
g
(
t
)
g(t)
g(t) 最小的
T
t
T_t
Tt,将得到的子树作为
T
1
T_1
T1,同时将最小的
g
(
t
)
g(t)
g(t) 设为
α
1
\alpha_1
α1。
T
1
T_1
T1 为区间
[
α
1
,
α
2
)
[\alpha_1,\alpha_2)
[α1,α2) 的最优子树。如此剪枝下去,直至得到根结点。在这一过程中,不断地增加
α
\alpha
α 的值,产生新的区间。
交叉验证选子树
利用独立的验证数据集,测试子树序列 T 0 , T 1 , . . . , T n T_0,T_1,...,T_n T0,T1,...,Tn 中各棵子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每棵子树 T 0 , T 1 , . . . , T n T_0,T_1,...,T_n T0,T1,...,Tn 都对应于一个参数 α 1 , α 2 , . . . , α n \alpha_1,\alpha_2,...,\alpha_n α1,α2,...,αn。所以,当最优子树 T k T_k Tk 确定时,对应的 α k \alpha_k αk 也确定了,即得到最优决策树 T α T_{\alpha} Tα。
参考文献
[1] 李航. 统计学习方法. 清华大学出版社. 2012