1. 决策树
顾名思义,决策树是基于树结构进行决策,类似于人类面临问题时一种很自然的处理机制。因此决策树模型易于解释。
一般的,一颗决策树包含一个根结点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点对应于一个属性测试;每个结点包含的样本集合格局属性测试的结果被划分到子结点中;根节点包含全本全集。决策树的目的是为了产生一颗泛化能力强,即处理未见示例能力强的决策树,基本流程遵循简单的“分而治之”的策略,如下图,截自《机器学习》:
显然,决策数是一种递归的过程。有以下三种情况会导致递归返回:
- 1、当前结点包含的样本全属于同一类别,无需划分
- 2、当前属性集为空,或是所有样本在所有属性上取值相同
- 3、当前结点包含的样本集合为空,不能划分
第2种情况把当前结点标记为叶结点,并将其类别设定为该结点所含样本最多的类别;第3中情况同样将当前结点标记为叶结点,但将其类别设定为其父节点所含样本最多的类别。
这两种处理的实质不同:情形2是利用当前结点的后验分布,情形3是把父节点的样本分布当做当前结点的先验分布。
1.1. 划分选择
决策树学习的关键是如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同意类别,即结点的纯度越来越高。
1.1.1. 信息增益与信息增益率
信息熵是度量样本集合纯度最常用的一种指标。假定当前样本集合D中第k类样本所占的比例为
p
k
(
k
=
1
,
2
,
.
.
.
,
∣
y
∣
)
p_k(k=1,2,...,|y|)
pk(k=1,2,...,∣y∣),则D的信息熵为:
E
n
t
(
D
)
=
−
∑
k
=
1
∣
y
∣
p
k
l
o
g
2
p
k
Ent(D)=-\sum_{k=1}^{|y|}p_klog_2p_k
Ent(D)=−k=1∑∣y∣pklog2pk
信息熵的值越小,则D的纯度越高。
假定离散属性a有V个可能的取值
{
a
1
,
a
2
,
.
.
,
a
V
}
\{a^1,a^2,..,a^V\}
{a1,a2,..,aV},若使用a来对样本集D进行划分,则会产生V个分支结点,其中第v个分支结点包含了D中所有在属性a上取值为
a
v
a^v
av的样本记为
D
v
D^v
Dv。可以计算出其信息熵,再kaol不同分支结点所包含的样本数不同,给分支结点赋予权重
∣
D
v
∣
/
∣
D
∣
|D^v|/|D|
∣Dv∣/∣D∣,即样本数越多的分支结点的影响越大。于是可计算出用属性a对样本集D进行划分所获得的“信息增益”:
G
a
i
n
(
D
,
a
)
=
E
n
t
(
D
)
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v)
Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度”提升越大。ID3算法使用信息增益来进行决策树的划分属性选择。
信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,C4.5算法不直接使用信息增益,而是使用“增益率”来选择最优划分属性。
增益率定义为:
G
a
i
n
r
a
t
i
o
(
D
,
a
)
=
G
a
i
n
(
D
,
a
)
I
V
(
a
)
Gain_ratio(D,a)=\frac{Gain(D,a)}{IV(a)}
Gainratio(D,a)=IV(a)Gain(D,a)
其中
I
V
(
a
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
l
o
g
2
∣
D
v
∣
∣
D
∣
IV(a)=-\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|}
IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
称为属性a的固有值。属性a的可能取值数目越多(V越大),则IV(a)的值通常会越大。
注意:
增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
1.1.2. 基尼指数
CART树使用“基尼指数”来选择划分属性。数据集D的纯度可用基尼值来度量:
G
i
n
i
(
D
)
=
∑
k
=
1
∣
y
∣
∑
k
′
≠
k
p
k
p
k
′
=
1
−
∑
k
=
1
∣
y
∣
p
k
2
Gini(D)=\sum_{k=1}^{|y|}\sum_{k^{'}\neq k}p_kp_{k^{'}} \\ =1-\sum_{k=1}^{|y|}p_{k}^{2}
Gini(D)=k=1∑∣y∣k′̸=k∑pkpk′=1−k=1∑∣y∣pk2
直观来说,Gini(D)反映了数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,则数据集D的纯度越好。
属性a的基尼指数定义为:
G
i
n
i
i
n
d
e
x
(
D
,
a
)
=
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
G
i
n
i
(
D
v
)
Gini_index(D,a)=\sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v)
Giniindex(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
于是,在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性。
1.2. 剪枝
剪枝是决策树学习算法对付“过拟合”的主要手段。 在决策树学习中,为了尽可能正确的分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,这时就可能因训练样本学的“太好了”,以至于把训练集自身的一些特点当做所有数据都具有的一般性质而导致过拟合,因此,可通过主动去掉一些分支来降低过拟合的风险。
剪枝的基本策略有:
- 预剪枝
- 后剪枝
预剪枝:指在决策数生成过程中,对每个结点在划分前先进行估计,若当前的划分不能带来决策树泛化性能的提升,则停止划分并将当前结点标记为叶结点。
后剪枝:先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策数泛化性能的提升,则将该子树替换为叶结点。
如何判断决策数泛化性能是否提升?一般采用留出法,即预留一部分数据做验证集来进行性能评估。
预剪枝后后剪枝的优缺点: 预剪枝使得决策树的很多分支都没有展开,不仅降低了过拟合的风险,还显著减少了决策树的训练时间和测试时间开销。但另一方面,有些分支的当前划分虽不能提升泛化性能,但在其基础上进行的后续划分却有可能导致性能显著提高; 预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。
后剪枝通常比预剪枝的决策树保留了更多的分支。一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝的训练时间开销比预剪枝的决策树要大得多。
1.3. 连续和缺失值
1.3.1. 连续值处理
对于连续属性,使用连续属性离散化。最简单的是采用二分法对连续属性进行处理(c4.5算法使用)。
与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性。
1.3.2. 缺失值处理
需要解决两个问题:
- 如何在属性值缺失的情况下进行划分属性选择?
- 给定划分是属性,若样本在该属性上的值缺失,如何对样本进行划分?
对于问题2,若样本x在划分属性a上的取值已知,则将x划入与其取值对应的子结点,且样本权值在子结点中保持为 w x w_x wx,若样本x在划分属性a上的取值未知,则将x同事划入所有子结点,且样本权值在与属性值 a v a^v av对应的子结点中调整为 r ^ ⋅ w x \hat{r} \cdot w_x r^⋅wx;直观的看,这就是让同一个样本以不同的概率划入到不同的子结点中去。