决策树
在机器学习领域,决策树不管是在面试过程中还是在工作中都是非常常见的一个算法,所以有必要对决策树算法的概念进行深入的了解。
概念
决策树算法是一种基本的分类和回归算法,本文主要探讨的是分类方法。决策树分类是基于训练数据,根据损失函数最小化的原则建立决策树模型。决策树学习通常包含3个步骤:特征选择、决策树生成和决策树剪枝。分类决策树是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成,结点有两种类型:内部结点和叶结点。内部结点表示一个特征或属性,叶结点表示一个类。
分类决策树选择特征的三种算法(ID3、C4.5、CART)
以下是贷款申请训练数据集D,本文讲解各种算法时会用到。数据包括贷款申请人的4个特征:1、年龄(取值为青年、中年、老年),2、是否有工作(是、否),3、是否有房子(是、否),4、信贷情况(非常好、好、一般)。最后一列是类型,表示是否同意贷款,取值为是、否。
ID 年龄 是否有工作 是否有房子 信贷情况 类别
1 青年 否 否 一般 否
2 青年 否 否 好 否
3 青年 是 否 一般 是
4 青年 是 是 一般 是
5 青年 否 否 一般 否
6 中年 否 否 一般 否
7 中年 否 否 好 否
8 中年 是 是 好 是
9 中年 否 是 非常好 是
10 中年 否 是 非常好 是
11 老年 否 是 非常好 是
12 老年 否 是 好 是
13 老年 是 否 好 是
14 老年 是 否 非常好 是
15 老年 否 否 一般 否
信息增益
首先给定随机变量X的概率分布
P
(
X
=
x
i
)
=
p
i
,
i
=
1
,
2
,
3
,
.
.
.
,
n
P(X=x_i) = p_i, i = 1, 2, 3, ..., n
P(X=xi)=pi,i=1,2,3,...,n
熵表示随机变量的不确定性,则有随便变量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)表示在已知随机变量X的条件下随机变量Y的不确定性,公式为
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)
信息增益表示得知特征X的信息而使得类Y的信息使Y的信息的不确定性减少的程度。其具体定义如下:
特征A对训练数据集D的信息增益g(D, A),定义为集合D的经验熵与特征A给定条件下D的经验条件熵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)
其实就是上面两个公式,熵与条件熵之差。
信息增益算法(1.1)
输入:训练数据集D和特征A;
输出:特征A对训练数据集D的信息增益g(D|A)。
(1) 计算数据集D的经验熵H(D)
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
l
o
g
2
∣
C
k
∣
D
∣
H(D) = -\sum_{k=1}^{K}{\frac{|C_k|}{|D|}log_2\frac{|C_k}{|D|}}
H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck
(2) 计算特征A对数据集D的经验条件熵H(D|A)
H
(
D
∣
A
)
=
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
H
(
D
i
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
∑
k
=
1
K
l
o
g
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}log_2\frac{|D_ik|}{|D_i|}}
H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑Klog2∣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)
下面结合例子说明一下信息增益算法选择最优特征的过程
解 首先计算经验熵H(D)
已知实例个数为15,类别为是的有9个,否的有6个,故
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
然后计算个特征对数据集D的信息增益。分别以A1,A2,A3,A4表示年龄、有无工作、是否有房子和信贷情况4个特征,则
g
(
D
∣
A
1
)
=
H
(
D
)
−
[
5
15
H
(
D
1
)
+
5
15
H
(
D
2
)
+
5
15
H
(
D
3
)
]
=
0.971
−
[
5
15
(
−
2
5
l
o
g
2
2
5
−
3
5
l
o
g
2
3
5
)
+
5
15
(
−
3
5
l
o
g
2
3
5
−
2
5
l
o
g
2
2
5
)
+
5
15
(
−
4
5
l
o
g
2
4
5
−
1
5
l
o
g
2
1
5
)
]
=
0.971
−
0.888
=
0.083
g(D|A_1) = H(D) - [\frac{5}{15}H(D_1)+\frac{5}{15}H(D_2)+\frac{5}{15}H(D_3)] \\ = 0.971 - [\frac{5}{15}(-\frac{2}{5}log_2\frac{2}{5}-\frac{3}{5}log_2\frac{3}{5})+\\ \frac{5}{15}(-\frac{3}{5}log_2\frac{3}{5}-\frac{2}{5}log_2\frac{2}{5})+ \frac{5}{15}(-\frac{4}{5}log_2\frac{4}{5}-\frac{1}{5}log_2\frac{1}{5})]\\ =0.971-0.888 = 0.083
g(D∣A1)=H(D)−[155H(D1)+155H(D2)+155H(D3)]=0.971−[155(−52log252−53log253)+155(−53log253−52log252)+155(−54log254−51log251)]=0.971−0.888=0.083
这里D1,D2,D3分别是D中A1(年龄)取值为青年、中年和老年的样本子集。类似地,
g
(
D
∣
A
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
g(D|A_2) = 0.971-[\frac{5}{15}×0+\frac{10}{15}(-\frac{4}{10}log_2\frac{4}{10}-\frac{6}{10}log_2\frac{6}{10})]=0.324
g(D∣A2)=0.971−[155×0+1510(−104log2104−106log2106)]=0.324
g ( D ∣ A 3 ) = 0.971 − [ 6 15 × 0 + 9 15 ( − 3 9 l o g 2 3 9 − 6 9 l o g 2 6 9 ) ] = 0.971 − 0.551 = 0.420 g(D|A_3) = 0.971-[\frac{6}{15}×0+\frac{9}{15}(-\frac{3}{9}log_2\frac{3}{9}-\frac{6}{9}log_2\frac{6}{9})]\\ = 0.971 - 0.551 = 0.420 g(D∣A3)=0.971−[156×0+159(−93log293−96log296)]=0.971−0.551=0.420
g ( D ∣ A 4 ) = 0.971 − 0.608 = 0.363 g(D|A_4) = 0.971 - 0.608 = 0.363 g(D∣A4)=0.971−0.608=0.363
最后,比较各特征的信息增益值。由于特征 A 3 A_3 A3(是否有房子)的信息增益值最大,所以选择特征 A 3 A_3 A3作为最优特征。
信息增益比
以信息增益作为划分训练数据集的特征,存在偏向选择取值较多的特征的问题(比如例子中如果ID也作为特征输入,那么信息增益就会选择ID作为最优特征,但事实上ID对于决策来讲意义不大)。使用信息增益比可以对这一问题进行校正。这是特征选择的另一准则。
信息增益比算法(1.2)
特征A对训练数据集D的信息增益比gR(D, A)定义为其信息增益g(D, A)与训练数据集D关于特征A的值的额熵
H
A
(
D
)
H_A(D)
HA(D)之比,即
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
gR(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
∣
l
o
g
2
∣
D
i
∣
∣
D
∣
H_A(D) = -\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是特征A的取值的个数。
决策树的生成
接下来,让我们看看怎么利用上面的算法生成一棵决策树吧。
ID3算法
ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的额特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;知道所有特征的信息增益均很小或没有特征可以选择为止。最后得到一棵决策树。ID3相当于用极大似然法进行概率模型的选择。
具体做法
输入:训练数据集D,特征值A阈值 ε \varepsilon ε;
输出:决策树T。
(1) 若D中所有实例属于同一类 C k C_k Ck,则T为单结点树,并将 C k C_k Ck作为结点的类标记,返回T;
(2) 若 A = ϕ A=\phi A=ϕ,则T为单结点树,并将D中实例数最大的类 C k C_k Ck作为该结点的标记,返回T;
(3) 否则,按决策树算法(1.1)计算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分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例最大的类作为标记,构建子结点,又结点及其子结点构成树T,返回T;
(6) 对于第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。
下面结合数据集说明一下
由于特征 A 3 A_3 A3(是否有房子)的信息增益最大,所以选择特征 A 3 A_3 A3作为根结点的特征。他将训练数据D划分为两个子集 D 1 D_1 D1( A 3 A_3 A3的取值为"是")和 D 2 D_2 D2( A 3 A_3 A3的取值为"否")。由于 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(信贷情况)中选择新的特征。计算各个特征的信息增益:
由于
A
3
A_3
A3选择"否"的情况下
D
2
D_2
D2还有9个实例,其中6个类别为"否",3个类别为"是",则有
H
(
D
2
)
=
−
6
9
l
o
g
2
6
9
−
6
9
l
o
g
2
6
9
=
0.918
H(D_2) = -\frac{6}{9}log_2\frac{6}{9}-\frac{6}{9}log_2\frac{6}{9} = 0.918
H(D2)=−96log296−96log296=0.918
g ( D 2 , A 1 ) = H ( D 2 ) − H ( D 2 ∣ A 1 ) = 0.918 − 0.667 = 0.251 g(D_2, A_1) = H(D_2) - H(D_2|A_1) = 0.918-0.667=0.251 g(D2,A1)=H(D2)−H(D2∣A1)=0.918−0.667=0.251
g ( D 2 , A 2 ) = H ( D 2 ) − H ( D 2 ∣ A 2 ) = 0.918 − 0 = 0.918 g(D_2, A_2) = H(D_2) - H(D_2|A_2) = 0.918-0=0.918 g(D2,A2)=H(D2)−H(D2∣A2)=0.918−0=0.918
g ( D 2 , A 4 ) = H ( D 2 ) − H ( D 2 ∣ A 4 ) = 0.474 g(D_2, A_4) = H(D_2) - H(D_2|A_4) = 0.474 g(D2,A4)=H(D2)−H(D2∣A4)=0.474
选择信息增益最大的特征 A 2 A_2 A2作为结点的特征。当他选择"是"的时候类的标记全是"是",当他选择"否"的时候,类的标记全是"否",故决策树生成完成。
C4.5算法
C4.5其实就是在特征选择的时候用信息增益比替换信息增益
CART算法
CART就是分类回归树(classification and regression tree)。分类树用基尼指数选择最优 特征,同时决定该特征的最优二值切分点。CART假设决策树是二叉树,内部结点特征的取值为"是"和"否",左分支是取值为"是"分支,右分支是取值为"否"的分支。
基尼指数:分类问题中,假定有K个类,样本点属于第k类的概率为
p
k
p_k
pk,则概率分布的基尼指数定义为
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
Gini(p)=\sum_{k=1}^{K}{p_k(1-p_k)}=1-\sum_{k=1}^{K}{p_k^2}
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于二分类问题,若样本点属于第1类的概率是p,则概率分布的基尼指数为为
G
i
n
i
(
p
)
=
2
p
(
1
−
p
)
Gini(p)=2p(1-p)
Gini(p)=2p(1−p)
对于给定的样本集合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中属于第k类的样本子集,K是类的个数。
如果样本集合D根据特征A是否取某一个可能指a被分割成
D
1
D_1
D1和
D
2
D_2
D2两部分,即
D
1
=
(
x
,
y
)
∈
D
∣
A
(
x
)
=
a
,
D
2
=
D
−
D
1
D_1={(x,y)\in D|A(x)=a},D_2=D-D_1
D1=(x,y)∈D∣A(x)=a,D2=D−D1
则在特征A的条件下,集合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)
基尼指数Gini(D)表示集合的不确定性,基尼指数Gini(D,A)表示经A=a分割后集合二D的不确定性。基尼指数值越大,样本的不确定性也就越大,这一点与熵的定义相似。
CART生成算法
输入:训练数据集D,停止计算的条件;
输出:CART决策树。
根据训练数据集,从根结点开始,递归地对每个结点进行一下操作,构建二叉决策树:
(1) 设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对其可能取的每个值a,根据样本点对a的测试为"是"或"否",将D分割成 D 1 D_1 D1和 D 2 D_2 D2两部分,利用Gini(D,A)计算A=a时的基尼指数。
(2) 在所有可能的特征A以及他们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点,将训练数据集依特征分配到两个子结点中去。
(3) 对两个子结点递归地调用(1),(2),直至满足停止条件。
(4) 生成CART决策树。
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
结合数据说明下决策树的生成过程
以 A 1 A_1 A1, A 2 A_2 A2, A 3 A_3 A3, A 4 A_4 A4表示年龄、是否有工作、是否有房子和信贷情况4个特征,并以1, 2, 3表示年龄为青年、中年、老年,以1,2表示是否有工作和是否有房子的值为是和否,以1,2,3表示信贷情况的值为非常好、好和一般。
求特征
A
1
A_1
A1的基尼指数:
G
i
n
i
(
D
,
A
1
=
1
)
=
5
15
(
2
×
2
5
×
(
1
−
2
5
)
)
+
10
15
(
2
×
7
10
×
(
1
−
7
10
)
)
=
0.44
Gini(D,A_1=1)=\frac{5}{15}(2×\frac{2}{5}×(1-\frac{2}{5}))+\frac{10}{15}(2×\frac{7}{10}×(1-\frac{7}{10}))=0.44
Gini(D,A1=1)=155(2×52×(1−52))+1510(2×107×(1−107))=0.44
G i n i ( D , A 1 = 2 ) = 0.48 Gini(D,A_1=2)=0.48 Gini(D,A1=2)=0.48
G i n i ( D , A 1 = 2 ) = 0.44 Gini(D,A_1=2)=0.44 Gini(D,A1=2)=0.44
这里稍微解释一下, 2 5 \frac{2}{5} 52表示年龄为青年时类别为"是"的概率, 7 10 \frac{7}{10} 107为年龄不为青年时(即中年和老年)类别为是类别为"是"的概率.
由于 G i n i ( D , A 1 = 1 ) Gini(D,A_1=1) Gini(D,A1=1)和 G i n i ( D , A 1 = 3 ) Gini(D,A_1=3) Gini(D,A1=3)相等,且最小,所以 A 1 = 1 A_1=1 A1=1和 A 1 = 3 A_1=3 A1=3都可以选作 A 1 A_1 A1的最优切分点。
求特征
A
2
A_2
A2和
A
3
A_3
A3的基尼指数:
G
i
n
i
(
D
,
A
2
=
1
)
=
0.32
G
i
n
i
(
D
,
A
3
=
1
)
=
0.27
Gini(D,A_2=1)=0.32\\ Gini(D,A_3=1)=0.27
Gini(D,A2=1)=0.32Gini(D,A3=1)=0.27
由于
A
1
A_1
A1和
A
3
A_3
A3只有一个切分点,所以他们就是最优切分点。
求特征
A
4
A_4
A4的基尼指数:
G
i
n
i
(
D
,
A
4
=
1
)
=
0.36
G
i
n
i
(
D
,
A
4
=
2
)
=
0.47
G
i
n
i
(
D
,
A
4
=
3
)
=
0.32
Gini(D,A_4=1)=0.36\\ Gini(D,A_4=2)=0.47\\ Gini(D,A_4=3)=0.32
Gini(D,A4=1)=0.36Gini(D,A4=2)=0.47Gini(D,A4=3)=0.32
G
i
n
i
(
D
,
A
4
=
3
)
Gini(D,A_4=3)
Gini(D,A4=3)最小,所以
A
4
=
3
A_4=3
A4=3为
A
4
A_4
A4的最优切分点。
在 A 1 A_1 A1, A 2 A_2 A2, A 3 A_3 A3, A 4 A_4 A4几个特征中, G i n i ( D , A 3 = 1 ) = 0.27 Gini(D,A_3=1)=0.27 Gini(D,A3=1)=0.27最小,所以选择特征 A 3 A_3 A3为最优特征 A 3 = 1 A_3=1 A3=1为最优切分点。于是根结点生成两个子结点,一个是叶结点。对另一个结点继续使用以上方法在 A 1 A_1 A1, A 3 A_3 A3, A 4 A_4 A4中选择最优特征及其最优切分点,结果是 A 2 = 1 A_2=1 A2=1。以此计算得知,所得的结点都是叶结点。
剪枝
决策树的生长就是不断地拟合训练数据,但是如果只考虑拟合效果,决策树不断生长,模型复杂度增加,就会导致训练数据拟合效果很好,而未知数据的预测效果非常差,导致过拟合。剪枝就是在训练数据的拟合效果和模型复杂度之间寻找一个均衡,提高预测准确率。具体可以查找其他资料,这里不做展开。
注:本文内容大部分来自李航老师的<<统计学习方法 第二版>>第五章-决策树