决策树、理解信息熵、信息增益(ID3)、增益率(C4.5)、基尼指数(CART)、预剪枝、后剪枝、多变量决策树
(一)基本流程
- 决策树(decision tree): 一般的,一棵决策树包含一个根结点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集.从根结点到每个叶结点的路径对应了一个判定测试序列.决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单且直观的“分而治之”( divide-and-conquer)策略。
- 建树过程:决策树的生成是一个递归过程。在决策树基本算法中,有三种情形会导致递归返回:
- 当前结点包含的样本全属于同一类别,无需划分;
- 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;此时,将当前结点为叶结点,其类别设定为该结点所含样本最多的类别。
- 当前结点包含的样本集合为空,不能划分,则将父结点的样本分布作为当前结点的先验分布。
(二)划分选择
- 划分选择: 由上图算法,决策树学习的关键是第8行,即如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”(purity)越来越高。
- 经典属性划分方法:
- 信息增益(information gain)
- 增益率(gain ratio)
- 基尼指数(Gini index)
1.信息增益(information gain)(ID3)
首先理解下信息熵(information entropy)的概念:
- 信息熵(information entropy): 信息熵这个概念来自信息论,因为香农把热力学中的熵引入信息论中,所以信息熵又称为香农熵,信息熵是接受每条消息中包含的信息平均量这里,“消息”代表来自分布或数据流中的事件、样本或特征。(熵最好理解为不确定性的量度而不是确定性的量度,因为越随机的信源的熵越大。)来自信源的另一个特征是样本的概率分布。这里的想法是,比较不可能发生的事情,当它发生了,会提供更多的信息。(参考维基百科)
- 在决策树中,信息熵是用来度量样本集合纯度的一种常用指标。假定当前样本集合D中第k类样本所占的比例为pk(k=1,2,……,|y|),则D的信息熵定义为
E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k ( 0 ≤ E n t ( D ) ≤ l o g 2 ∣ y ∣ ) Ent(D)=-\sum_{k=1}^{|y|}p_klog_{2}^{p_{k}}\qquad (0\leq Ent(D)\leq log_{2}^{|y|}) Ent(D)=−k=1∑∣y∣pklog2pk(0≤Ent(D)≤log2∣y∣)
- Ent(D)的值越小,则D的纯度越高。
有关信息熵的具体意义,以及公式的推导,可以看b站一个up主的一个视频(下方是链接),视频讲解的很通俗易懂
信息增益(information gain):
-
- 在递归建立决策树的过程中,如何确定当前结点根据哪个特征进行结点分裂,以及如何确定分裂方式?
- 对于离散属性a有v个可能值{a1,a2,……,av},用a来对当前结点的数据集D进行划分,则会产生v个分支结点(孩子结点),其中第v个分支结点包含了D中所有在特征a上取值微av的样本,记作Dv;同样对于例如二分类的连续特征分裂结点时,一般设置阈值将数据集分为两类,产生两个分支结点。这样我们可以计算每一个分支结点即Dv的信息熵。
- 如何根据v个分支结点的信息熵来衡量在某种特征上的某种分裂方式,是否是一个好的分裂?考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重|Dv|/|D|,即样本数越多的分支结点的影响越大,于是可计算出用属性a对样本集D进行划分所获得的“信息增益”(information gain)
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来进行划分所获得的“纯度提升”越大.因此,我们可用信息增益来进行决策树的划分属性选择,即在上图4.2算法第8行选择属性a*= argmaxGain(D,a).
- ID3决策树学习算法: ID3决策树学习算法就是以信息增益为准则来选择划分属性(特征)。
2.增益率(gain ratio)(C4.5)
实际上,实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,C4.5决策树算法不直接使用信息增益,而是使用“增益率”( gain ratio)来选择最优划分属性。增益率定义如下:
G
a
i
n
R
a
t
i
o
(
D
,
a
)
=
G
a
i
n
(
D
,
a
)
I
V
(
a
)
,
I
V
(
a
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
l
o
g
2
∣
D
v
∣
∣
D
∣
GainRatio(D,a)=\frac{Gain(D,a)}{IV(a)},\\ IV(a)=-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}log_{2}^{\frac{|D^{v}|}{|D|}}
GainRatio(D,a)=IV(a)Gain(D,a),IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
- 固有值(intrinsic value): IV(a)称为属性a的固有值。
- 属性a的可能值数目越多(V越大),则IV(a)的值通常会越大。
需要注意的是:
- 增益率准则对可取数目较少的属性有所偏好,因此C4.5算法并不直接选择增益率最大的特征进行划分。而是采用了启发式:
- 先从候选划分特征中找出信息增益高于平均水平的属性。
- 再从中选出增益率最高的。
3.基尼指数(Gini index)(CART)
- CART决策树: 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的纯度越高.
- 基尼指数(Gini index): 对各分支结点的基尼值加权求和。
G
i
n
i
I
n
d
e
x
(
D
,
a
)
=
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
G
i
n
i
(
D
v
)
GiniIndex(D,a)=\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Gini(D^{v})
GiniIndex(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
在CART决策树算法中,选择使得划分后基尼指数最小的属性(特征)作为最优划分属性,即a*= argmin Gini_index(D, a)
(三)剪枝处理(pruning)
剪枝(pruning)是决策树学习算法对付过拟合的主要手段。在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断复,(原因)有时会造成决策树分支过多,(结果)这时就可能因训练样本学得“太好”了,以致于把训练集自身的一些特点当作所有数据都具有的一般性质而导致过拟合.因此,(方法)可通过主动去掉一些分支来降低过拟合的风险,这一过程就称为剪枝。
下图为训练集和验证集用来判断决策树的泛化性能以及基于表生成的未经过剪枝得到的决策树模型。(后面举例计算用到):
1.预剪枝(prepruning)
- 预剪枝(prepruning): 预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点.
预剪枝在建树过程中,对剪枝前后的泛化性能计算估计,然后判断该划分是否能提升泛化性能。
注:在预剪枝过程中,当我们在考虑一个结点是否对一个特征进行划分的时候,计算划分后的验证集精度时,只需要考虑当前结点的划分,不用考虑当前结点划分后的分支结点(孩子结点)的划分。如果西瓜书的读者仔细动手按照书上样例计算时,应该会考虑到这一点,我在计算时的想法是,可能当前结点的划分相对于不划分的精度低,但是当前结点的划分的后续的分支结点(孩子结点)的划分可能会让验证集精度大于不划分的精度。
预剪枝的优缺点:
- 优点: 1.降低了过拟合的风险 2.显著减少了决策树训练时间开销和测试时间开销。
- 缺点: 有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。
2.后剪枝(post-pruning)
- 后剪枝(post-pruning): 后剪枝是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
后剪枝先从训练集生成一棵完整决策树,依旧是开始的样例,首先,该决策树的验证集精度为42.9%,后剪枝首先考察最底部的结点⑥,若将其领衔的分支剪除,则相当于把⑥替换为叶结点。替换后的叶结点包含编号为{7,15}的训练样本,于是,该叶结点的类别标记为“好瓜”,此时决策树的验证集精度提高至57.1%.于是后剪枝策略决定剪枝。进行后剪枝后的模型如下图:
后剪枝的优缺点:
- 优点: 后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。
- 缺点: 后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
(四)多变量决策树(multivariate decision tree)
若我们把每个属性视为坐标空间中的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界。决策树所形成的分类边界有一个明显的特点:轴平行(axis-parallel),即它的分类边界由若干个与坐标轴平行的分段组成。如下图:
很显然,这样的决策树会相当复杂,要进行大量的属性测试,预测时间开销会很大。
- 多变量决策树(multivariate decision tree): 多变量决策树使用的是更复杂的划分,而不是简单的轴平行。例如斜划分决策树,非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试;换而言之,每个非叶结点是一个线性分类器。
- 与传统的“单变量决策树”(univariate decision tree)不同,在多变量决策树的学习过程中,不是为每个非叶结点寻找一个最优划分属性,而是试图建立一个合适的线性分分类器。如下图:
其他有关机器学习的博客文章: