介绍
决策树 (decision tree) 是一种基本的分类与回归方法。决策树的模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。决策树学习通常包括3个步骤:特征选择、决策树的生成、决策树的修剪。
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部结点(表示特征或属性)和叶结点(表示类)。
如下面一个相亲准则的例子:
年龄、长相、收入和公务员为特征或属性,见和不见是决策的类。
再看一个预测小明打球的例子:
我们根据天气、湿度和风三个特征将小明的打球数据进行了决策树的构建。红色代表不打球,绿色代表打球。那么我们该如何进行这些特征的选择?也就是我们怎么知道选哪个特征才能更好的划分数据?
特征选择
特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有什么很大的差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的准则是信息增益、信息增益比或基尼指数。
信息增益
介绍信息增益之前,先聊一聊信息熵 (简称熵) 的定义。熵 (entropy) 是表示随机变量不确定性的度量。设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的熵定义为
H
(
X
)
=
−
∑
i
n
p
i
l
o
g
p
i
H(X)=-\sum_i^np_ilogp_i
H(X)=−i∑npilogpi
由定义可知,熵只依赖于X的分布,而与X的取值无关,所以也可将X的熵记作
H
(
p
)
H(p)
H(p),即
H
(
p
)
=
−
∑
i
n
p
i
l
o
g
p
i
H(p)=-\sum_i^np_ilogp_i
H(p)=−i∑npilogpi
熵越大,随机变量的不确定性就越大。也可以理解成信息熵越大,混乱程度就越大,纯度 (purity) 越小。
例如,小明在6天中,3天去打球,3天不去打,则:不纯洁 (impure): 3是/3否
H
(
S
)
=
−
3
6
l
o
g
3
6
−
3
6
l
o
g
3
6
=
1
H(S)=-\frac{3}{6}log\frac{3}{6}-\frac{3}{6}log\frac{3}{6}=1
H(S)=−63log63−63log63=1
假如小明在4天中,4天都去打球了,则:纯洁 (pure):4是/0否
H
(
S
)
=
−
4
4
l
o
g
4
4
−
0
4
l
o
g
0
4
=
0
H(S)=-\frac{4}{4}log\frac{4}{4}-\frac{0}{4}log\frac{0}{4}=0
H(S)=−44log44−40log40=0
信息增益
信息增益是划分前样本数据集的不纯度(熵)和划分后样本数据集的不纯程度(熵)的差值。
假设划分前样本数据集为
S
i
S_i
Si并用属性A来划分样本集S,则按属性A划分S的信息增益Gain(S,A)为样本集
S
S
S的熵减去按属性A划分S后的样本子集的熵:
G
a
i
n
(
S
,
A
)
=
E
n
t
r
o
p
y
(
S
)
−
E
n
t
r
o
p
y
A
(
S
)
Gain(S,A)=Entropy(S)-Entropy_A(S)
Gain(S,A)=Entropy(S)−EntropyA(S)
按属性A划分S后的样本子集的熵定义如下:假定属性A有k个不同的取值,从而将S划分为k个样本子集
{
S
1
,
S
2
,
.
.
.
,
S
k
}
\{S_1,S_2,...,S_k\}
{S1,S2,...,Sk},则按属性A划分S后的样本子集的信息熵为:
E
n
t
r
o
p
y
A
(
S
)
=
∑
i
=
1
k
∣
S
i
∣
∣
S
∣
E
n
t
r
o
p
y
(
S
i
)
Entropy_A(S)=\sum_{i=1}^k\frac{|S_i|}{|S|}Entropy(S_i)
EntropyA(S)=i=1∑k∣S∣∣Si∣Entropy(Si)
其中
∣
s
i
∣
(
i
=
1
,
2
,
.
.
.
,
k
)
|s_i|\ (i=1,2,...,k)
∣si∣ (i=1,2,...,k)为样本子集
S
i
S_i
Si中包含的样本数,
∣
S
∣
|S|
∣S∣为样本集S中包含的样本数。信息增益越大,说明使用特征A划分后的样本子集越纯,越有利于分类。
∣
S
i
∣
S
\frac{|S_i|}{S}
S∣Si∣代表第i个分支的权重,样本越多越重要。
下面我们以周志华教授的西瓜数据集举例:
该数据集包含17个训练样例,结果有2个类别 (是好瓜、不是好瓜)
∣
y
∣
=
2
|y|=2
∣y∣=2,其中正例占
P
1
=
8
17
P_1=\frac{8}{17}
P1=178,反例占
P
2
=
9
17
P_2=\frac{9}{17}
P2=179. 根结点的信息熵为
E
n
t
r
o
p
y
(
D
)
=
−
∑
k
=
1
2
p
k
l
o
g
2
p
k
=
−
(
8
17
l
o
g
2
8
17
+
9
17
l
o
g
2
9
17
)
=
0.998
Entropy(D)=-\sum_{k=1}^2p_klog_2p_k=-(\frac{8}{17}log_2\frac{8}{17}+\frac{9}{17}log_2\frac{9}{17})=0.998
Entropy(D)=−k=1∑2pklog2pk=−(178log2178+179log2179)=0.998
以属性“色泽”为例,其对应的3个数据子集分别为
D
1
(
色
泽
=
青
绿
)
D^1(色泽=青绿)
D1(色泽=青绿),
D
2
(
色
泽
=
乌
黑
)
D^2(色泽=乌黑)
D2(色泽=乌黑),
D
3
(
色
泽
=
浅
白
)
D^3(色泽=浅白)
D3(色泽=浅白). 子集
D
1
D^1
D1包含变化为{1,4,6,10,13,17}的6个样例,其中正例占
p
1
=
3
6
p_1=\frac{3}{6}
p1=63,反例占
p
2
=
3
6
p_2=\frac{3}{6}
p2=63,
D
2
D^2
D2,
D
3
D^3
D3同理,按照色泽特征分类后的3个结点的信息熵为:
E
n
t
r
o
p
y
(
D
1
)
=
−
(
3
6
l
o
g
2
3
6
+
3
6
l
o
g
2
3
6
)
=
1.000
E
n
t
r
o
p
y
(
D
2
)
=
−
(
4
6
l
o
g
2
4
6
+
2
6
l
o
g
2
2
6
)
=
0.918
E
n
t
r
o
p
y
(
D
3
)
=
−
(
1
5
l
o
g
2
1
5
+
4
5
l
o
g
2
4
5
)
=
0.722
Entropy(D^1)=-(\frac{3}{6}log_2\frac{3}{6}+\frac{3}{6}log_2\frac{3}{6})=1.000\\ Entropy(D^2)=-(\frac{4}{6}log_2\frac{4}{6}+\frac{2}{6}log_2\frac{2}{6})=0.918\\ Entropy(D^3)=-(\frac{1}{5}log_2\frac{1}{5}+\frac{4}{5}log_2\frac{4}{5})=0.722
Entropy(D1)=−(63log263+63log263)=1.000Entropy(D2)=−(64log264+62log262)=0.918Entropy(D3)=−(51log251+54log254)=0.722
属于“色泽”的信息增益为:
G
a
i
n
(
D
,
色
泽
)
=
E
n
t
r
o
p
y
(
D
)
−
∑
v
=
1
3
∣
D
v
∣
∣
D
∣
E
n
t
o
r
p
y
(
D
v
)
=
0.998
−
(
6
17
×
1.000
+
6
17
×
0.918
+
5
17
×
0.722
)
Gain(D,{色泽})=Entropy(D)-\sum_{v=1}^3\frac{|D^v|}{|D|}Entorpy(D^v)\\ =0.998-(\frac{6}{17}\times1.000+\frac{6}{17}\times0.918+\frac{5}{17}\times0.722)
Gain(D,色泽)=Entropy(D)−v=1∑3∣D∣∣Dv∣Entorpy(Dv)=0.998−(176×1.000+176×0.918+175×0.722)
类似的,我们可以计算出其他特征的信息增益:
G
a
i
n
(
D
,
根
蒂
)
=
0.143
;
G
a
i
n
(
D
,
敲
声
)
=
0.141
;
G
a
i
n
(
D
,
纹
理
)
=
0.381
;
G
a
i
n
(
D
,
脐
部
)
=
0.289
;
G
a
i
n
(
D
,
触
感
)
=
0.006.
Gain(D,根蒂)=0.143;\ Gain(D,敲声)=0.141;\ Gain(D,纹理)=0.381;\\ Gain(D,脐部)=0.289;\ Gain(D,触感)=0.006.
Gain(D,根蒂)=0.143; Gain(D,敲声)=0.141; Gain(D,纹理)=0.381;Gain(D,脐部)=0.289; Gain(D,触感)=0.006.
显然,属性“纹理”的信息增益最大,于是它被选为划分属性。
信息增益率
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。当特征的取值较多时,根据此特征划分更容易得到纯度更高的子集,因此划分之后的熵更低,由于划分前的熵是一定的,因此信息增益更大,所以信息增益比较偏向取值较多的特征。使用信息增益率可以对这一问题进行校正。
信息增益率
特征A对训练数据集D的信息增益率
G
a
i
n
_
r
a
t
i
o
(
D
,
A
)
Gain\_ratio(D,A)
Gain_ratio(D,A)定义为其信息增益
G
a
i
n
(
D
,
A
)
Gain(D,A)
Gain(D,A)于训练数据集D关于特征A的值的熵
H
A
(
D
)
H_A(D)
HA(D)之比,即
G
a
i
n
_
r
a
t
i
o
(
D
,
A
)
=
G
a
i
n
(
D
,
A
)
H
A
(
D
)
Gain\_ratio(D,A)=\frac{Gain(D,A)}{H_A(D)}
Gain_ratio(D,A)=HA(D)Gain(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取值的个数。
H
A
(
D
)
H_A(D)
HA(D)称为属性的“固有值”,属性A的可能取值数目越多(即n为大),则
H
A
(
D
)
H_A(D)
HA(D)的值通常会越大。
需要注意的是,信息增益率准则对取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式: 先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择信息增益率最高的。
基尼指数
基尼指数或基尼不纯度,它反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此,Gini(D)越小,则数据集D的纯度越高。CART决策树使用“基尼指数”来选择划分特征。
G
i
n
i
(
D
)
=
∑
i
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
Gini(D)=\sum_{i=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2
Gini(D)=i=1∑Kpk(1−pk)=1−k=1∑Kpk2
其中,
p
k
p_k
pk表示选中的样本属于k类别的概率,则这个样本被分错的概率是
(
1
−
p
k
)
(1-p_k)
(1−pk).
二类分类中基尼指数、熵之半 ( 1 2 H ( p ) ) (\frac{1}{2}H(p)) (21H(p))和分类误差率的关系:
决策树的生成
决策树算法 | 算法描述 |
---|---|
ID3算法 | 其核心是在决策树的各级结点上,使用***信息增益***方法作为属性的选择标准,来帮助确定生成每个结点时所应采用的合适属性。 |
C4.5算法 | C4.5决策树算法相对于ID3算法的重要改进是使用***信息增益率***来选择结点属性。C4.5算法可以克服ID3算法存在的不足:ID3算法只适用于离散的描述属性,而C4.5算法既能够处理离散的描述属性,又可以处理连续的描述属性。 |
CART算法 | CART决策树是一种十分有效的非参数分类和回归方法,通过构建树、修剪树、评估树来构建一个二叉树。当终结点是连续变量时,该树为回归树;当终结点是分类变量时,该树为分类树。使用***基尼指数***代替了熵模型进行特征选择。 |
决策树算法 | 支持 | 选择标准 | 特征类型 | 缺失值 | 过拟合 |
---|---|---|---|---|---|
ID3 | 分类 | 信息增益 | 离散值 | 无法处理 | 无法处理 |
C4.5 | 分类 | 信息增益率 | 离散值、连续值 | 可以处理 | 预剪枝、后剪枝 |
CART | 分类(二叉树)、回归 | Gini指数 | 离散值、连续值 | 可以处理 | 预剪枝、后剪枝 |
决策树停止生长条件
- 当前节点包含的样本全属于同一类别,无需划分;
- 当前属性集为空,或时所有样本在所有属性上取值相同,无法划分;
- 当前结点包含的样本集合为空,不能划分。
剪枝
决策树剪枝的基本策略有“预剪枝”和“后剪枝”。预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。我们采用将数据集中预留一部分数据当作“验证集”以进行泛化性能评估。
预剪枝
预剪枝就是在完全正确分类训练集之前,较早地停止树的生长。 具体在什么时候停止决策树的生长有多种不同的方法:
- 一种最为简单的方法就是在决策树到达一定高度的情况下就停止树的生长
- 到达此结点的实例具有相同的特征向量,而不必一定属于同一类, 也可停止生长。
- 到达此结点的实例个数小于某一个阈值也可停止树的生长。
- 还有一种更为普遍的做法是计算每次扩张对系统性能的增益,如果这个增益值小于某个阈值则不进行扩展
优点&缺点
优点:由于预剪枝不必生成整棵决策树,且算法相对简单, 效率很高, 适合解决大规模问题。但是尽管这一方法看起来很直接, 但是 怎样精确地估计何时停止树的增长是相当困难的。
缺点:预剪枝有一个缺点, 即视野效果问题 。 也就是说在相同的标准下,也许当前的扩展会造成过度拟合训练数据,但是更进一步的扩展能够满足要求,也有可能准确地拟合训练数据。这将使得算法过早地停止决策树的构造。
后剪枝
后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。
主要有四种方法(这里不展开详细解释):
-
REP-错误率降低剪枝
-
PEP-悲观剪枝
-
CCP-代价复杂度剪枝
-
MEP-最小错误剪枝
决策树算法总结
决策树算法的优点
1)简单直观,生成的决策树很直观。
2)基本不需要预处理,不需要提前归一化,处理缺失值。
3)使用决策树预测的代价是 O ( l o g 2 n ) O(log_2n) O(log2n)。 n为样本数。
4)既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
5)可以处理多维度输出的分类问题。
6)相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释
7)可以交叉验证的剪枝来选择模型,从而提高泛化能力。
8) 对于异常点的容错能力好,健壮性高。
决策树算法的缺点
1)决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
2)决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。
3)寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善(Bagging、随机森林、Boosting、GBDT、XGBDT)。
4)有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
5)如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。
参考资料
- 《统计学习方法》, 李航著;
- 《机器学习》, 周志华著;
- https://zhuanlan.zhihu.com/p/59484953
- https://zhuanlan.zhihu.com/p/30296061
- https://www.jianshu.com/p/d153130b813f