决策树入门学习
python代码可参照作品决策树python实现
1. 什么是决策树
决策树(Decision Tree)是一类常见的机器学习方法,它是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。同时决策树是一种十分常用的分类方法。它是一种监督学习,所谓监督学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。
例如,我们要对“这是好瓜吗?”这一问题进行决策时,通常会进行一系列的判断:
首先,我们先看它是什么颜色,如果是青绿色
那么,看它根蒂是什么形态,如果是蜷缩
再判断,听敲击声音,如果声音浊响
最终得出决策:这是好瓜
我们最终得出结论‘是’与‘不是’好瓜,决策过程中判断问题的节点为“测试”,每一个测试的结果或是导出进一步的判断问题,或是导出最终结果。
2. 划分依据
西瓜有多种属性,所以如何选择第一个判定属性非常重要,我们怎么分类才能让该属性下的样本尽可能是同一类别,我们将采用以下三种依据:
2.1 信息增益
首先需要了解什么是信息熵(information entro)
信息熵:度量样本集合纯度最常用的指标。
假设当前样本集合
D
D
D中第
k
k
k类样本所占比例为
p
k
(
k
=
1
,
2
,
3
,
.
.
.
.
,
∣
y
∣
)
p_k (k=1,2,3,....,\vert y \vert)
pk(k=1,2,3,....,∣y∣),则
D
D
D的信息熵定义为:
Ent
(
D
)
=
−
∑
k
=
1
∣
Y
∣
p
k
log
2
p
k
\operatorname{Ent}(D)=-\sum_{k=1}^{|\mathcal{Y}|} p_{k} \log _{2} p_{k}
Ent(D)=−k=1∑∣Y∣pklog2pk
其中
E
n
t
(
D
)
Ent(D)
Ent(D)值越小,
D
D
D的纯度越高,越集中。
假定离散属性
a
a
a有
V
V
V个可能取值
a
1
,
a
2
,
a
3
.
.
.
.
.
a
v
{a_1,a_2,a_3.....a_v }
a1,a2,a3.....av,我们若用
a
a
a来对样本集合
D
D
D来进行划分,则会产生
V
V
V个分支结点,其中第
v
v
v个分支结点包含
D
D
D中所有在属性
a
a
a上取值为
a
v
a_v
av的样本,记做
D
v
D_v
Dv。则信息增益公式如下:
Gain
(
D
,
a
)
=
Ent
(
D
)
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
Ent
(
D
v
)
\operatorname{Gain}(D, a)=\operatorname{Ent}(D)-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Ent}\left(D^{v}\right)
Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
一般而言,信息增益越大,则意味着使用属性
a
a
a来划分所获得的“纯度提升”越大。常见算法ID3。
2.2 增益率
由于权重的存在,信息增益准则对包含数目较多的属性有偏好。为了减少这种不“客观”的判定,我们选择”增益率“来划分属性。常见算法C4.5。
增益率公式如下:
Gain_ratio
(
D
,
a
)
=
Gain
(
D
,
a
)
IV
(
a
)
\operatorname{ Gain\_ratio }(D, a)=\frac{\operatorname{Gain}(D, a)}{\operatorname{IV}(a)}
Gain_ratio(D,a)=IV(a)Gain(D,a)
其中
IV
(
a
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
log
2
∣
D
v
∣
∣
D
∣
\operatorname{IV}(a)=-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \log _{2} \frac{\left|D^{v}\right|}{|D|}
IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
这里
I
V
(
a
)
IV(a)
IV(a)称之为属性
a
a
a的固有值。通常情况下,
a
a
a越大,固有值越大。这样就减小了上面信息增益对包含数目多的属性的偏好。但是尴尬的是,似乎减少的太多了。注意增益率对包含数目较少的属性有偏好,C4.5使用了一种启发式:先找出信息增益高于平均水平的,然后再选出增益率最高的。
2.3 基尼指数
CART决策树使用的“基尼指数”划分属性。
数据集
D
D
D的纯度可用基尼值来度量:
Gini
(
D
)
=
∑
k
=
1
∣
Y
∣
∑
k
′
≠
k
p
k
p
k
′
=
1
−
∑
k
=
1
∣
Y
∣
p
k
2
\begin{aligned} \operatorname{Gini}(D) &=\sum_{k=1}^{|\mathcal{Y}|} \sum_{k^{\prime} \neq k} p_{k} p_{k^{\prime}} \\ &=1-\sum_{k=1}^{|\mathcal{Y}|} p_{k}^{2} \end{aligned}
Gini(D)=k=1∑∣Y∣k′=k∑pkpk′=1−k=1∑∣Y∣pk2
基尼指数越小,则数据集D的纯度越高。
同理,属性
a
a
a的基尼指数如下:
Gini_index
(
D
,
a
)
=
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
Gini
(
D
v
)
\text { Gini\_index }(D, a)=\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Gini}\left(D^{v}\right)
Gini_index (D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
我们需要选择基尼指数最小的属性作为划分的依据。
3. 剪枝处理
为了防止训练过程中将自身的一些特点当作所有数据都具有的一般性质导致过拟合,此时造成决策树分支过多,需要进行主动剪枝处理。剪枝基本策略包括“预剪枝”与“后剪枝”。
3.1 预剪枝
预剪枝(prepruning):决策树生成过程中,对每个结点在划分前进行估计,如果不能达到理想状态,将此结点标记为叶结点。
预剪枝策略:限制深度、叶子结点个数、叶子结点样本数、信息增益量等。
3.2 后剪枝
后剪枝(postpruning):先生成一颗完整的决策树,然后自底向上非叶子结点与该结点对应的子树进行考察,如果能达到更好的效果,则该子树替换为叶子结点。
后剪枝策略:通过一定的衡量标准
C
α
(
T
)
=
C
(
T
)
+
α
⋅
∣
T
leaf
∣
C_{\alpha}(T)=C(T)+\alpha \cdot\left|T_{\text {leaf }}\right|
Cα(T)=C(T)+α⋅∣Tleaf ∣叶子节点越多,损失越大
3.3 优缺点
优点:小规模数据集有效
缺点:处理连续变量不好,类别较多时,错误增加的比较快,不能处理大量数据。
4. 连续与缺失值
4.1 连续值处理
常基于离散属性生成决策树,那么遇到连续属性时如何生成决策树,由于连续属性可取值数目不是有限,所以需要对连续属性进行离散化处理。
最简单的是采用二分法对连续属性进行处理,C4.5采用的机制。
有数据集
D
D
D 和连续属性
a
a
a ,比如西瓜的密度和甜度这种连续属性,
a
a
a在数据
D
D
D上有若干取值,记为
{
α
1
,
α
2
,
.
.
.
,
α
n
}
\{\alpha_1,\alpha_2 ,...,\alpha_n\}
{α1,α2,...,αn} 基于划分点
t
t
t可以把
D
D
D 分为包含正负样本的两个子集,即
t
t
t为阈值。对于划分点
t
t
t,我们可以取这样一个集合
T
a
=
{
a
i
+
a
i
+
1
2
∣
1
⩽
i
⩽
n
−
1
}
,
T_{a}=\left\{\frac{a^{i}+a^{i+1}}{2} \mid 1 \leqslant i \leqslant n-1\right\},
Ta={2ai+ai+1∣1⩽i⩽n−1},
即每个都是相邻两个属性取值的平均值,这样就可以将等同为离散情况下的属性值来进行划分。基于此将信息增益计算公式改为下面公 式,取使得信息增益最大的
t
t
t作为划分点。
Gain
(
D
,
a
)
=
max
t
∈
T
a
Gain
(
D
,
a
,
t
)
=
max
t
∈
T
a
Ent
(
D
)
−
∑
λ
∈
{
−
,
+
}
∣
D
t
λ
∣
∣
D
∣
Ent
(
D
t
λ
)
\begin{aligned} \operatorname{Gain}(D, a) &=\max _{t \in T_{a}} \operatorname{Gain}(D, a, t) \\ &=\max _{t \in T_{a}} \operatorname{Ent}(D)-\sum_{\lambda \in\{-,+\}} \frac{\left|D_{t}^{\lambda}\right|}{|D|} \operatorname{Ent}\left(D_{t}^{\lambda}\right) \end{aligned}
Gain(D,a)=t∈TamaxGain(D,a,t)=t∈TamaxEnt(D)−λ∈{−,+}∑∣D∣∣
∣Dtλ∣
∣Ent(Dtλ)
其中
G
a
i
n
(
D
,
a
,
t
)
Gain(D,a,t)
Gain(D,a,t)是样本集
D
D
D基于划分点
t
t
t二分后的信息增益,于是选择使
G
a
i
n
(
D
,
a
,
t
)
Gain(D,a,t)
Gain(D,a,t)最大化的划分点。
4.2 缺失值处理
现实中常遇到属性值缺失的不完整样本,那么需要对其进行相应的处理。
需要解决的两个问题
(1)如何在属性值缺失的情况下进行划分属性选择?
(2)给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?
问题(1)解决
给定训练集
D
D
D 和属性
a
a
a, 令
D
~
\tilde{D}
D~ 表示
D
D
D 中在属性
a
a
a 上没有缺失值的样本子 集。显然我们仅可根据
D
~
\tilde{D}
D~ 来判断属性
a
a
a 的优劣。假定属性
a
a
a 有
V
V
V 个 可取值
{
a
1
,
a
2
,
…
,
a
V
}
\left\{a^{1}, a^{2}, \ldots, a^{V}\right\}
{a1,a2,…,aV}, 令
D
~
v
\tilde{D}^{v}
D~v 表示
D
~
\tilde{D}
D~ 中在属性
a
a
a 上取值为
a
v
a^{v}
av 的样本子集,
D
~
k
\tilde{D}_{k}
D~k
D
~
=
⋃
v
=
1
V
D
~
v
\tilde{D}=\bigcup_{v=1}^{V} \tilde{D}^{v}
D~=⋃v=1VD~v 。假定我们为每个样本
x
x
x 赋予一个权重
w
x
w_{x}
wx, 并定义
ρ
=
∑
x
∈
D
ˉ
w
x
∑
x
∈
D
w
x
,
p
~
k
=
∑
x
∈
D
ˉ
k
w
x
∑
x
∈
D
ˉ
w
x
(
1
⩽
k
⩽
∣
Y
∣
)
,
r
~
v
=
∑
x
∈
D
ˉ
v
w
x
∑
x
∈
D
ˉ
w
x
(
1
⩽
v
⩽
V
)
.
\begin{aligned} \rho &=\frac{\sum_{x \in \bar{D}} w_{x}}{\sum_{x \in D} w_{x}}, \\ \tilde{p}_{k} &=\frac{\sum_{x \in \bar{D}_{k}} w_{x}}{\sum_{x \in \bar{D}} w_{x}} \quad(1 \leqslant k \leqslant|\mathcal{Y}|), \\ \tilde{r}_{v} &=\frac{\sum_{x \in \bar{D}^{v}} w_{x}}{\sum_{x \in \bar{D}^{w_{x}}}} \quad(1 \leqslant v \leqslant V) . \end{aligned}
ρp~kr~v=∑x∈Dwx∑x∈Dˉwx,=∑x∈Dˉwx∑x∈Dˉkwx(1⩽k⩽∣Y∣),=∑x∈Dˉwx∑x∈Dˉvwx(1⩽v⩽V).
属性
a
,
ρ
a, \rho
a,ρ 表示无缺失值样本所占的比例,
p
ˉ
k
\bar{p}_{k}
pˉk 表示无缺失值样本中 第
k
k
k 类所占的比例,
r
~
v
\tilde{r}_{v}
r~v 则表示无缺失值样本中在属性
a
a
a 上取值
a
v
a^{v}
av 的样本所占 的比例.
显然,
∑
k
=
1
∣
Y
∣
p
~
k
=
1
,
∑
v
=
1
V
r
~
v
=
1
\sum_{k=1}^{|Y|} \tilde{p}_{k}=1, \sum_{v=1}^{V} \tilde{r}_{v}=1
∑k=1∣Y∣p~k=1,∑v=1Vr~v=1.
信息增益的推广
基于上述定义, 我们可将信息增益的计算式推广为
Gain
(
D
,
a
)
=
ρ
×
Gain
(
D
~
,
a
)
=
ρ
×
(
Ent
(
D
~
)
−
∑
v
=
1
V
r
~
v
Ent
(
D
~
v
)
)
\begin{aligned} \operatorname{Gain}(D, a) &=\rho \times \operatorname{Gain}(\tilde{D}, a) \\ &=\rho \times\left(\operatorname{Ent}(\tilde{D})-\sum_{v=1}^{V} \tilde{r}_{v} \operatorname{Ent}\left(\tilde{D}^{v}\right)\right) \end{aligned}
Gain(D,a)=ρ×Gain(D~,a)=ρ×(Ent(D~)−v=1∑Vr~vEnt(D~v))其中信息熵公式可推广为如下所示:
Ent
(
D
ˉ
)
=
−
∑
k
=
1
∣
Y
∣
p
~
k
log
2
p
~
k
\operatorname{Ent}(\bar{D})=-\sum_{k=1}^{|\mathcal{Y}|} \tilde{p}_{k} \log _{2} \tilde{p}_{k}
Ent(Dˉ)=−k=1∑∣Y∣p~klog2p~k
问题(2)解决
若样本
x
x
x 在划分属性
a
a
a 上的取值已知, 则将
x
x
x 划入与其取值对 应的子结点, 且样本权值在子结点中保持为
w
x
w_{x}
wx。若样本
x
\boldsymbol{x}
x 在划分属性
a
a
a 上的取 值末知, 则将
x
\boldsymbol{x}
x 同时划入所有子结点, 且样本权值在与属性值
a
v
a^{v}
av 对应的子结点 中调整为
r
ˉ
v
⋅
w
x
\bar{r}_{v} \cdot w_{x}
rˉv⋅wx 。
这就是让同一个样本以不同的概率划入到不同的子结点中去。
5. 多变量决策树
5.1 分类边界
把每个属性看做空间中的一个坐标轴,样本的
n
n
n个属性则对应映射成为
n
n
n维空间中的一个数值点,所以对于整个数据集的分类任务等价于找到一个合适的分类边界。而决策树的分类边界由于自身的判定特点,分类边界都由若干个与坐标轴平行的分段组成。如下图所示:
对应的决策树如下图所示:
5.2 斜划分
在多变量决策树中, 非叶结点不再是仅对某个属性, 而是对属性的线性组合进行测试。
每个非叶结点是一个形如
∑
i
=
1
d
w
i
a
i
=
t
\sum_{i=1}^{d} w_{i} a_{i}=t
∑i=1dwiai=t 的线性分类器, 在多变量决策树的学习过程中, 通过建立合适的线性分类器进行训练。
其中
w
i
w_{i}
wi 是属性
a
i
a_{i}
ai 的权重,
w
i
w_{i}
wi 和
t
t
t 可在该结点所含的样本集和属性集上学得。
线性分类器构成的多变量决策树
多变量决策树对应的分类边界