决策树是一种基本的分类与回归方法,是基于树结构来进行决策即能够做回归也能做分类。一般地,一颗决策树包含有一个根节点、若干个内部结点(非叶子结点)和若干个叶节点。
如图所示,树的每个结点表示一种决策属性(选择),每个样本通过根节点通过分支往下走,最终可以得到分类结果。
树的基本结构:
- 训练
用给定的训练数据集,构造一棵决策树 - 分类
从根节点开始,按照决策树的分类属性逐层往下划分,直到叶节点,获取分类结果。
构建决策树
构建决策树要考虑以下几个问题
基本流程
首先给出西瓜书中一棵决策树的生成过程。
决策树的生成过程是一个递归与分治的过程,图中表示了整个建立决策树的过程。
其中1~16都包含在TreeGenerate(D,A)函数中,D是训练集,A表示样本所包含的属性(特征)集合。
以下是构造决策树完成结束条件,或者是TreeGenerate()递归边界:
其中1~4步表示当前节点全都属于一个类别,不需再划分,递归结束;
4~7表示若属性集A(在划分过程中,每次会选择一个最优属性进行划分,然后将其从A中删除)为空,或者,所有样本在所有属性上的取值相同,也就是测试集不能用A集合中的属性来区分,递归结束;
11~12表示划分后
D
v
D_v
Dv样本集中的样本为空,即划分完成,将分支结点标记为叶节点,递归结束;
在决策树的基本算法中,有三种情况会导致递归返回,
8选择最优的划分属性a,在下面有介绍
9~10是遍历
a
∗
a_*
a∗属性的特征(
a
∗
1
,
.
.
.
,
a
∗
v
a_*^1,...,a_*^v
a∗1,...,a∗v)将集合
D
D
D划分成
D
1
,
D
2
,
.
.
,
D
v
D_1,D_2,..,D_v
D1,D2,..,Dv,(例如西瓜有
a
∗
a_*
a∗=‘色泽’,
a
∗
a_*
a∗中有{‘青绿’,‘乌黑’,‘浅白’},可以将集合划分成
D
1
,
D
2
,
D
3
D_1,D_2,D_3
D1,D2,D3)
执行完9~10步骤若未到达递归边界,即
D
v
D_v
Dv不为空,即还可继续划分,则继续调用Treegenerate()函数,此时传入的参数应该是该子节点的数据集,并且将已经选择过的属性从A集合中删去,不再作为划分数据集的属性,
一直执行,直到到达递归边界,即满足递归结束的三个条件。
如何选择最优划分属性
- 选择根节点的过程并不是一个人为随意选择的过程。
- 随着树深度即增加,结点的熵快速降低。熵降低的速度越快越好,得到一棵高度最矮的决策树。
- 决策树的每个非叶子结点都是一次划分,上面熵值的运用就是衡量每次划分的好坏,找出最优的划分方式。
构造决策树时,求得数据集的各个属性的 G a i n Gain Gain值,选择其中最大值,作为第一个节点,依此类推,构造决策树的信息熵降为0时,此时就是理想情况
衡量几个特征(属性)的选择对决策树的泛化有没有太大影响,选取最优的属性进行划分训练集,有以下几种方法来进行特征选择:信息熵、信息增益、信息熵增率、Gini指数等,这些概念在上篇文章熵(Entropy)、信息熵增益、信息熵增率和基尼(Gini)指数中有详细解释。
上面我们看到的西瓜的属性色泽,响声等都是离散型属性(特征),我们还还需要考虑如学生分数这这样的连续型属性如何划分数据集,这里可以参考决策树中连续型值和缺失值处理。
下面需要考虑的问题时,有一种情况时我们不断的用属性对训练集进行划分,最后划分可能会将样本本身的特征而不是一般性质当做特征进行划分,导致每一个数据样本会在一个叶子结点上,即每个叶子结点是一个类别,导致分支过多,虽然这样在训练集上分类效果是很好的,但是这样构造的决策树高度过高,并且这样的树在验证集上或者泛化结果上效果并不好,就产生了过拟合,而我们构造决策树要求决策树的高度尽可能的矮,因此需要对树进行剪枝处理。
剪枝
预剪枝
- 在构建决策树的过程中,提前停止,防止过拟合,降低树的高度。
- 若当前节点的划分不能带来决策树泛化能力的提升,就停止划分并将当前节点标记为叶节点。
- 检测模型的泛化能力可以用留出法,交叉验证法等,即某个节点通过通过某属性经过一次划分后,使用验证集验证划分后的准确度,和不进行划分该节点的准确度比较,如果准确度降低,则此次划分失败,不进行划分该节点。由此降低过拟合的风险,但可能导致模型泛化能力下降,产生欠拟合的风险。
后剪枝
决策树剪好后,然后再开始剪枝,即将建好的决策树从自底向上的对非叶节点进行考察,若将该节点对应的子树替换为叶节点能够带来泛化能力的提升,则将该子树替换为叶节点。
如图首先检测第一个非叶节点D1,假设D1按照某种属性划分后,会将样本x1,x2,x3分成三个类,通过检测泛化能力发现这样划分的泛化能力并不高,于是将D1的叶子结点剪掉,x1,x2,x3重新划分到D1数据集中。
决策树的剪枝通常需要通过极小化决策树的损失函数(代价函数),类似于在线性回归过程中使用最小二乘法计算均方误差来衡量模型的好坏,设一棵决策树有叶子结点个数
∣
T
∣
|T|
∣T∣,t代表某个叶子结点,设第t个叶子结点上有
N
t
N_t
Nt个样本点,该节点上第k类样本点有
N
t
k
个
N_{tk}个
Ntk个,类别一共有
K
K
K类,
k
=
1
,
2
,
3
,
.
.
.
K
k=1,2,3,...K
k=1,2,3,...K,
H
t
(
T
)
H_t(T)
Ht(T)表示叶子结点
t
t
t的熵值,
α
\alpha
α表示一个参数,决策树的损失函数可定义为:
C
α
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=\sum_{t=1}^{|T|} N_{t} H_{t}(T)+\alpha|T|
Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣
其中:
H
t
(
T
)
=
−
∑
k
K
N
t
k
N
t
log
N
t
k
N
t
H_{t}(T)=-\sum_{k}^K \frac{N_{t k}}{N_{t}} \log \frac{N_{t k}}{N_{t}}
Ht(T)=−k∑KNtNtklogNtNtk表示叶子结点的熵值,
令:
C
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
=
−
∑
t
=
1
∣
T
∣
∑
k
=
1
K
N
t
k
log
N
t
k
N
t
,
(
即
将
各
个
叶
结
点
的
熵
值
相
加
)
C(T)=\sum_{t=1}^{|T|} N_{t} H_{t}(T)=-\sum_{t=1}^{|T|} \sum_{k=1}^{K} N_{t k} \log \frac{N_{t k}}{N_{t}},(即将各个叶结点的熵值相加)
C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk,(即将各个叶结点的熵值相加)表示模型对训练数据的误差,即模型与训练数据的拟合程度。
所以有:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=C(T)+\alpha|T|
Cα(T)=C(T)+α∣T∣
∣
T
∣
|T|
∣T∣表示决策树T的叶子结点的个数,同时也代表了模型的复杂度,参数
α
\alpha
α作为罚项,来控制拟合程度与模型复杂度之间的影响,较大的
α
\alpha
α促使选择较简单的模型 (树), 较小的
α
\alpha
α促使选择较复杂的模型 (树).
α
\alpha
α=0意味只考虑模型与训练数据的拟合程度, 不考虑模型的夏杂度.
剪枝, 就是当
α
\alpha
α确定时, 选择损失函数最小的模型,即损失函数最小的子树 当
α
\alpha
α值确定时 ,子树越大, 往往与训练数据的拟合越好, 但是模型的复杂度就越高 ;相反, 子树越小. 模型的复杂度就越低 但是往往与训练数据的拟合不好, 损失函数
C
α
(
T
)
C_{\alpha}(T)
Cα(T)正好表示了对两者的平衡。
可以看出 决策树生成只考虑了通过提高信息增益 (或信息堵益比) 对训练数据进行更好的拟合;而决策树剪枝通过优化损失函数还考虑了减小模型复杂度,决策树生成学习局部的模型, 而决策树剪枝学习整体的模型。
上式定义的损失函数的极小化等价于正则化的极大似然估计. 所以, 利用损失函数最小原则进行剪枝就是用正则化的极大似然估计进行模型选择。
主要过程:
要求:
输入:一棵决策树T,和参数
α
\alpha
α
输出:修剪后的子树
T
α
T_{\alpha}
Tα
- (1),计算每个结点的熵值。
- (2),递归的从叶结点向上回缩,设一组叶结点回缩到其父结点之前与之后的整体树分别为 T B T_B TB与 T A T_A TA, 其对应的损失函数值分别是 C α ( T A ) C_{\alpha}\left(T_{A}\right) Cα(TA)与 C α ( T B ) C_{\alpha}\left(T_{B}\right) Cα(TB), 如果
C
α
(
T
A
)
⩽
C
α
(
T
B
)
C_{\alpha}\left(T_{A}\right) \leqslant C_{\alpha}\left(T_{B}\right)
Cα(TA)⩽Cα(TB)
则进行剪枝. 即将父结点变为新的叶结点.
- (3), 返回(2),直至不能继续为止, 得到损失函数量小的子树 T α T_{\alpha} Tα.