《机器学习》——第四章 决策树
一、基本流程
决策树是一类常见的机器学习方法。其中关于西瓜问题的一棵决策树如下图所示,
一般的,一棵决策树包含了一个根结点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,决策树的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其采用的思想是分而治之
其采用的基本算法是
决策树的生成过程是一个递归的过程(这个时候让我想起了一个典型的递归模型——汉诺塔)
二、划分选择
从上面的图4.2中可以看出,其最重要的一步是第8行,即如何选择最优划分属性,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的"纯度"越来越高
2.1 信息增益
“信息熵"是度量样本集合纯度最常用的一种指标,假定当前样本集合D中第
k
k
k类样本所占的比例为
p
k
(
k
=
1
,
2
,
.
.
.
,
∣
y
∣
)
p_k(k=1,2,...,|y|)
pk(k=1,2,...,∣y∣),则D的信息熵定义为
∑
k
=
1
∣
y
∣
p
k
log
2
p
k
\sum_{k=1}^{\left| y \right|}{p_k\log _2p_k}
k=1∑∣y∣pklog2pk
E
n
t
(
D
)
Ent(D)
Ent(D)的值越小,则
D
D
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{\left|D^v\right|}{D}Ent(D^v)
Gain(D,a)=Ent(D)−v=1∑VD∣Dv∣Ent(Dv)
一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的"纯度提升"越大
- 著名的 I D 3 ID3 ID3决策树算法就是以信息增益为准则进行划分属性
- 书上所举的选西瓜的例子,大概就是通过使用信息增益选出具有代表性的特征,固定这个特征作为根节点,从此出发去寻找在这个条件下,其他特征的信息增益,一步一步构建出这样的一棵决策树
2.2 增益率
在前面中,我们有意的避开了数据集中的编号,其实编号有种在python的dataframe中是索引的意思,即每一行具有代表性的一个特征值,若使用该特征值作为我们决策树分类的结果,对于这个数据集来说,是一个很棒的学习模型,但是其泛化能力也是最弱的,这个学习器是不能够对新样本进行有效预测的
因此引入了一个全新的概念"增益率",增益率的定义如下,
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)}
Gain_ratio(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{\left|D^v\right|}{\left|D\right|}log_2\frac{\left|D^v\right|}{\left|D\right|}
IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
- 著名的C4.5决策树算法使用的是增益率而不是信息增益
- 启发式:先从候选属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的
2.3 基尼系数
基尼系数的定义如下
G
i
n
i
(
D
)
=
∑
k
=
1
∣
y
∣
∑
k
′
≠
k
p
k
p
k
′
Gini(D)=\sum_{k=1}^{\left| y \right|}{\sum_{k'\ne k}{p_k}p_{k'}}
Gini(D)=k=1∑∣y∣k′=k∑pkpk′
直观来说,
G
i
n
i
(
D
)
Gini(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)
Gini_index(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
选择基尼指数最小的属性作为最优划分属性
三、剪枝处理
剪枝是决策树学习算法对付"过拟合"的主要手段,因为有时候决策树把原来的训练样本学习得太好了,以至其在新样本中无法得出准确的结果,产生过拟合现象
3.1 预剪枝
预剪枝是指在决策树生成过程中,对每一个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点
预剪枝基于信息增益,选取属性"脐部"来对训练集进行划分
预剪枝流程如下图所示
3.2 后剪枝
后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点
后剪枝流程如下图所示
四、连续与缺失值
4.1 连续值处理
在前面的几节中,我们采用的数据类型都是离散型的,然而在现实生活中,常常会遇到带有连续值的属性
对连续值采用的最简单的策略是二分法
通俗点来说,就是将大于某个值的那部分数据归为一组,其他的归为另外一组,对信息增益的公式进行一定的改进后,变为
G
a
i
n
(
D
,
a
)
=
max
t
∈
T
a
G
a
i
n
(
D
,
a
,
t
)
=
m
a
x
t
∈
T
a
E
n
t
(
D
)
−
∑
λ
∈
{
−
,
+
}
∣
D
t
λ
∣
∣
D
∣
E
n
t
(
D
t
λ
)
Gain(D,a)=\underset{t\in T_a}{\max}Gain\left( D,a,t \right)\\ =\underset{t\in T_a}{max}Ent(D)-\sum_{\lambda \in \left\{ -,+ \right\}}{\frac{\left| D_{t}^{\lambda} \right|}{\left| D \right|}Ent\left( D_{t}^{\lambda} \right)}
Gain(D,a)=t∈TamaxGain(D,a,t)=t∈TamaxEnt(D)−λ∈{−,+}∑∣D∣∣∣Dtλ∣∣Ent(Dtλ)
需要注意的是,与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性
4.2 缺失值处理
在书中,周志华老师提出了我们需要解决的两个问题
- 如何在属性值缺失的情况下进行划分属性选择?
- 给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分
五、多变量决策树
若将每一个树形视为坐标空间中的一个坐标轴,则d个属性描述的样本对应了d维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界
但是其存在一定的缺陷,当分类边界的每一段都与坐标轴平行,这样的分类结果具有很好的解释性,但是如果分类边界过于复杂化,一来会带来开销过大,二来决策树也会很复杂,这就引出了我们今天的主角多变量决策树
按照书中所提到的东西,加上我自己的个人概括,即原来是硬生生的对数据进行划分,即通过横线与竖线,有点类似于在(运筹学中的匈牙利算法,在查找独立零元素,以及寻找最少的直线去覆盖独立零元素的那种硬生生的把正例和负例区分出来),相反,多变量决策树,则是通过试图建立一个合适的线性分类器,使得能够让原来横竖的阶梯型直线,转化为曲线比较平缓,在书中给出了这样的一张示例图
六、总结
在第四章的学习中,我对决策树有了一定的了解,当然基于之前在学校中学习数据结构的时候,学过许许多多关于树和图的基本知识,有二叉树,二叉搜索树,二叉平衡树,决策树是在这些树基础上,通过对属性的不断划分从而从根结点一直往下到叶子结点,同时我之前对基尼系数也不太了解,学习完本章节后,我对基尼系数也有了一定的了解,纯度,信息增益,信息熵,增益率等概念都相当于重新的认识了一遍,决策树算法ID3、C4.5、CART、随机森林等算法