树及其组合算法部分其余内容,个人笔记博客传送门
树及其组合算法二:
决策树
基本知识介绍 |
决策树是机器学习的核心算法之一,可以用于实现预测。
1 什么是决策树。
决策树的名字来源于其分析结果的展示方式,类似于一棵倒置的树,分为回归树和分类树,它是数据反复分组
的图形化体现。决策树的每个节点都对应一条推理规则,决策树能够基于叶节点的推理规则实现对新数据的分类预测或回归预测。
可以用树深度(最远的叶节点离根节点的距离)
来度量决策树模型复杂度的标准。下图中最远的叶节点到根节点的距离为2,所以该树深度为2。
2 决策树的分类边界和回归线(面)
-
分类边界
决策树随着数据的反复分组而生长,如果待分类的样本有p个属性特征,可以将分类树的“生长”过程看作是对p维特征空间的划分过程
,原p维特征空间被划分为m个矩形区域,所有矩形区域的边相互平行或垂直。每个节点的推理规则与矩形区域一一对应。
多个矩形区域边界(直线)的连接可以形成一个不规则的分类边界(曲线),可以有效地解决非线性分类
预测问题。分类决策树的深度越大,相邻的矩形区域就越多.
分类树算法的核心是找到用于划分的特征以及划分的界限,选择的原则是使得划分后的子区域中样本观测点尽量“纯正”。对于样本观测点的“纯正”程度的衡量通常采用信息增益(ID3算法),信息增益率(C4.5算法)或基尼系数gini(CART分类树算法)。 -
回归边界
回归树的生长过程也可以看做是对p维特征空间的划分,回归树的构建重点也是选择划分点(包括划分的特征以及划分的阈值)
。与分类树稍微不同的地方是, 分类树它的叶节点输出值是类别,而回归树的叶节点输出值为一个平均值。
回归树的树深度越大相邻回归平面越多,平面的平滑连接可以形成一个不规则的回归曲面(非线性回归
)。
如上图举例,假设样本共有
x
1
x_1
x1和
x
2
x_2
x2两个特征属性,样本对于的
y
y
y是数值型数据。现在需要根据样本的输入属性
x
1
,
x
2
x_1,x_2
x1,x2预测样本的属性
y
y
y。在构建回归决策树时,按照平方和误差最小
的原则,依次选择划分点使得划分之后的两个类别异质性低
。根据样本集生成的决策树的可视化树形图如上图所示,那么,其实上述回归树的叶节点的输出值为平均值
。更具体来看,①不满足
x
1
>
30
x_1>30
x1>30条件的样本有4个(
y
1
,
y
2
,
y
3
,
y
4
y_1,y_2,y_3,y_4
y1,y2,y3,y4),因此上图中最右边一个叶节点的输出值为
Y
‾
(
1
)
=
y
1
+
y
2
+
y
3
+
y
4
4
\overline{Y}^{(1)}=\frac{y_1+y_2+y_3+y_4}{4}
Y(1)=4y1+y2+y3+y4;②满足条件
x
1
>
30
x_1>30
x1>30且满足
x
2
<
45
x_2<45
x2<45的样本共有3个,对应的
y
y
y值为
y
5
,
y
6
,
y
7
y_5,y_6,y_7
y5,y6,y7,可以计算该叶节点的输出值
Y
‾
(
2
)
=
y
5
+
y
6
+
y
7
3
\overline{Y}^{(2)}=\frac{y_5+y_6+y_7}{3}
Y(2)=3y5+y6+y7;③满足条件
x
1
>
30
x_1>30
x1>30但是不满足
x
2
<
45
x_2<45
x2<45的样本共有3个,对应的
y
y
y值为
y
8
,
y
9
,
y
10
y_8,y_9,y_{10}
y8,y9,y10,可以计算该叶节点的输出值为
Y
‾
(
3
)
=
y
8
+
y
9
+
y
10
3
\overline{Y}^{(3)}=\frac{y_8+y_9+y_{10}}{3}
Y(3)=3y8+y9+y10。
3 决策树的主要思想
决策树的主要思想是使用多个线性分类器的组合将样本分隔开,决策树的每个节点都是一个推理规则,白话点来讲就是一个问题,每个问题的回答都相当于一个线性分类器(判断某特征值是否超过某阈值。)对这一系列的问题的回答就是对线性分类器的组合,最终形成的分界面也是一些超平面的组合。
这里补充一点关于线性分类器和非线性分类器的内容:
线性分类器使用线性的函数表达式对样本进行分类,划分边界为直线或超平面
。
非线性分类器中引入了非线性函数来提升分类效果,划分边界为曲面或多个超平面的组合
。
4 构造决策树的算法
决策树的算法分为三种,ID3算法,C4.5算法,CART算法。其中ID3算法和C4.5算法是分类树算法,可以生成二叉树或多叉树;CART算法(classification and regression tree)可以用来构造分类树和回归树,只能生成二叉树。
(1)ID3算法(只用于分类树)
选择划分点时采用的原则是使得划分后的子类纯度更高,这里对纯度的衡量,采用的是信息论中的信息增益
,选择信息增益较大的特征进行划分。
信息增益简单来讲就是划分前节点的复杂度与划分后子节点复杂度之间的差值:
G
a
i
n
(
D
,
a
)
=
G
a
i
n
(
D
)
−
∑
i
=
1
m
∣
D
i
∣
∣
D
∣
G
a
i
n
(
D
i
)
Gain(D,a)=Gain(D)-\sum_{i=1}^{m}\frac{|D_{i}|}{|D|}Gain(D_{i})
Gain(D,a)=Gain(D)−i=1∑m∣D∣∣Di∣Gain(Di)
其中Gain(D)是划分前节点的复杂度,根据某个划分点a将该节点划分为m个子节点,
G
a
i
n
(
D
i
)
Gain(D_{i})
Gain(Di)表示子节点
i
i
i的复杂度,
∣
D
i
∣
|D_{i}|
∣Di∣表示第
i
i
i个子节点中所含样本数,
D
D
D表示父节点中所含总样本数。
对于复杂度的衡量采用信息熵
来衡量。信息熵取值为正,以二分类为例,如果集合中只含有一类则信息熵为0,若两类的数量相同则信息熵为1(因为公式中对数的底数为2
)。定义:
E
n
t
r
o
p
y
(
Y
)
=
−
∑
i
p
i
l
o
g
2
(
p
i
)
Entropy(Y)=-\sum_{i}p_{i}log_{2}( p_{i})
Entropy(Y)=−i∑pilog2(pi)
p
i
=
n
i
n
1
+
.
.
.
+
n
k
p_{i}=\frac{n_{i}}{n_{1}+...+n_{k}}
pi=n1+...+nkni
如果样本一共可以分为
k
k
k类,那么
p
i
p_{i}
pi表示该该节点Y中第
i
i
i类所占的比例。
条件熵
:在给定信息X下,原集合的熵值
E
n
t
r
o
p
y
(
Y
∣
X
)
=
∑
x
∈
X
p
(
x
)
E
n
t
r
o
p
y
(
Y
∣
X
=
x
)
Entropy(Y|X)=\sum_{x \in X} p(x)Entropy(Y|X=x)
Entropy(Y∣X)=x∈X∑p(x)Entropy(Y∣X=x)
注:这里的p(x)是划分后子节点中样本数占原父节点样本数的比例。条件熵可以看作子节点的信息熵的加权和,权重即子节点所占父节点的比例。
其实,信息增益可以看作是信息熵减去条件熵。
举例说明
G
a
i
n
(
D
)
=
−
[
3
7
l
o
g
2
(
3
7
)
+
4
7
l
o
g
2
(
4
7
)
]
=
0.985
Gain(D)=-[\frac{3}{7}log_{2}(\frac{3}{7})+\frac{4}{7}log_{2}(\frac{4}{7})]=0.985
Gain(D)=−[73log2(73)+74log2(74)]=0.985
E
n
t
(
D
,
X
=
阴
)
=
−
[
1
3
l
o
g
2
(
1
3
)
+
2
3
l
o
g
2
(
2
3
)
]
=
0.918
Ent(D,X=阴)=-[\frac{1}{3}log_{2}(\frac{1}{3})+\frac{2}{3}log_{2}(\frac{2}{3})]=0.918
Ent(D,X=阴)=−[31log2(31)+32log2(32)]=0.918
E
n
t
(
D
,
X
=
晴
)
=
−
[
1
2
l
o
g
2
(
1
2
)
+
1
2
l
o
g
2
(
1
2
)
]
)
=
1
Ent(D,X=晴)=-[\frac{1}{2}log_{2}(\frac{1}{2})+\frac{1}{2}log_{2}(\frac{1}{2})])=1
Ent(D,X=晴)=−[21log2(21)+21log2(21)])=1
G
a
i
n
(
D
,
天
气
)
=
0.985
−
(
3
7
∗
0.918
+
4
7
∗
1
)
Gain(D,天气)=0.985-(\frac{3}{7}*0.918+\frac{4}{7}*1)
Gain(D,天气)=0.985−(73∗0.918+74∗1)=0.02
则选择天气这个特征进行划分是信息增益为0.02。
这里可以注意到一个重要的规律,如果分裂的子节点个数越多,那么子节点复杂度加权之和 ∑ i ∣ D i ∣ ∣ D ∣ G a i n ( D i ) \sum_{i}\frac{|D_{i}|}{|D|}Gain(D_{i}) ∑i∣D∣∣Di∣Gain(Di)越小这个规律可以这样理解,考虑采用普通的“样本编号”来进行划分,那么每个子节点中只含有一类,这个子节点的信息熵就为0,那么所有的子节点信息熵加权和也为0,这时信息增益最大,而ID3算法选取信息增益最大的样本特征进行划分。
(2)C4.5算法(只用于分类树)
为了解决ID3算法中倾向于选择有多个子节点的特征属性,C4.5算法中引入了信息增益率
的概念,选择信息增益率较大的特征进行划分。
G
a
i
n
_
r
a
t
i
o
(
D
,
a
)
=
G
a
i
n
(
D
,
a
)
E
n
t
(
a
划
分
的
节
点
结
构
)
Gain\_ratio(D,a)=\frac{Gain(D,a)}{Ent(a划分的节点结构)}
Gain_ratio(D,a)=Ent(a划分的节点结构)Gain(D,a)
E
n
t
(
a
划
分
的
节
点
结
构
)
=
−
∑
i
=
1
m
∣
D
i
∣
∣
D
∣
l
o
g
2
(
∣
D
i
∣
∣
D
∣
)
Ent(a划分的节点结构)=-\sum_{i=1}^{m}\frac{|D_{i}|}{|D|}log_{2}(\frac{|D_{i}|}{|D|})
Ent(a划分的节点结构)=−i=1∑m∣D∣∣Di∣log2(∣D∣∣Di∣)
参考上面的例子,
E
n
t
(
天
气
划
分
的
节
点
结
构
)
=
−
[
3
7
l
o
g
2
(
3
7
)
+
4
7
l
o
g
2
(
4
7
)
]
=
0.985
Ent(天气划分的节点结构)=-[\frac{3}{7}log_{2}(\frac{3}{7})+\frac{4}{7}log_{2}(\frac{4}{7})]=0.985
Ent(天气划分的节点结构)=−[73log2(73)+74log2(74)]=0.985
G
a
i
n
_
r
a
t
i
o
(
D
,
天
气
)
=
0.02
0.985
Gain\_ratio(D,天气)=\frac{0.02}{0.985}
Gain_ratio(D,天气)=0.9850.02
对于信息增益率来说,如果所选择的特征属性划分的子节点过多,那么
E
n
t
(
a
划
分
的
节
点
结
构
)
Ent(a划分的节点结构)
Ent(a划分的节点结构)会很大,相应的信息增益率就会变小。
但是这里值得注意的是信息增益率可能会对子节点数目较少的属性有偏好,因此C4.5算法首先计算各属性的信息增益,其中超过平均值的属性才进一步计算增益率来选择最优属性
(3)CART算法(分类树)
CART算法可以用于分类树,也可以用于回归树。当CART算法用来构造分类树时,选择划分点的原理类似于ID3和C4.5算法,都是选取特征属性以及对于的阈值使得划分后的子类“纯度”较高,异质性较低。这里对“纯度”的衡量采用基尼系数gini
,选择基尼系数较小的特征进行划分。
说到基尼系数gini,通常对这个名词的使用是在经济学中,用来衡量一个国家的贫富差距,基尼系数越大,贫富差距越大,gini系数超过0.4时贫富差距已经很悬殊了,正常的基尼系数应该在0.2-0.4之间,理想状态下基尼系数gini为0,此时没有贫富差距。基尼系数主要反映的是样本的差异性,当基尼系数越小说明样本间的差异就越小,样本的纯度高。
G
i
n
i
(
D
)
=
1
−
∑
i
p
i
2
Gini(D)=1-\sum_{i}p_{i}^{2}
Gini(D)=1−i∑pi2
G
i
n
i
(
D
,
a
)
=
∑
j
=
1
m
∣
D
i
∣
∣
D
∣
G
i
n
i
(
D
i
)
Gini(D,a)=\sum_{j=1}^{m}\frac{|D_{i}|}{|D|}Gini(D_{i})
Gini(D,a)=j=1∑m∣D∣∣Di∣Gini(Di)
这里
m
m
m取值应该为2,因为CART算法只能构造二叉树,它是通过自顶向下的递归二分策略实现空间区域的划分。
(4)CART算法(回归树)
当CART算法用于回归树时,不是用“纯度”来衡量划分,而是用混乱度来选择划分的特征,通常用最小绝对偏差LAD
或最小二乘偏差LSD
或平方误差和(李航的书《统计学习方法》)
作为衡量指标,最常用的是平方误差和,选取平方误差和最小的特征属性进行划分。
m
i
n
j
,
s
[
m
i
n
c
1
∑
x
i
∈
R
1
(
y
i
−
c
1
)
2
+
m
i
n
c
2
∑
x
i
∈
R
2
(
y
i
−
c
2
)
2
]
min_{j,s}\quad [min_{c_1} \sum _{x_i\in R_1}(y_i-c_1)^2+min_{c_2} \sum _{x_i\in R_2}(y_i-c_2)^2]
minj,s[minc1xi∈R1∑(yi−c1)2+minc2xi∈R2∑(yi−c2)2]
c
^
1
=
a
v
e
(
y
i
∣
x
i
∈
R
1
)
\hat{c}_1=ave(y_{i}|x_i\in R_1)
c^1=ave(yi∣xi∈R1)
c
^
2
=
a
v
e
(
y
i
∣
x
i
∈
R
2
)
\hat{c}_2=ave(y_{i}|x_i\in R_2)
c^2=ave(yi∣xi∈R2)
举例说明
现有样本集中有4个样本,每个样本有2个输入属性和一个输出的属性,现在要构造决策树以实现以后给定
x
1
,
x
2
x_1,x_2
x1,x2能预测样本对于的
y
y
y属性值。
现在供选择的特征属性有
x
1
x_1
x1和
x
2
x_2
x2;对于特征属性
x
1
x_1
x1还需要选择划分阈值,这里将阈值取为(1.5,2.5,3.5)这里取小数的原因是避免有
x
1
x_1
x1属性取值恰好等于阈值的情况,阈值不一定是1.5,2.5,3.5也可以是其他小数,只要满足第一个阈值在区间(1,2)内,第二个阈值在(2,3)区间内…;对于特征属性
x
2
x_2
x2也需要选择划分阈值,这里将阈值取为(15,20,25)。
首先,计算在不同特征属性j和不同阈值s条件下,划分后子类中的均值。然后计算各个子类的平方误差之和,选择平方误差之和最小时对应的划分点。在这里,最小平方误差和为298.67,对应的划分点为,选择特征属性
x
2
x_2
x2阈值为25进行划分,满足条件
x
2
>
25
x_2>25
x2>25的划为一个子节点,不满足条件的划为另一个子节点。
5 决策树剪枝
决策树的树深度达到最大,分类边界或回归面最不规则,模型复杂度最高,可能带来的问题是模型过拟合。避免决策树过拟合的有效方式为剪枝pruning,分为:
预修剪
和后修剪
。
预修剪(参数控制):①最大树深度②最小样本量③最小异质性下降值(大概就是前面所说的“纯度”和“混乱度”)
后修剪:按照从叶节点向根节点的方向,逐层剪掉某些节点分枝的过程。
先介绍一种简单的决策树学习的剪枝算法(参数 α \alpha α已知)。
参考李航的书《统计学习方法》
原理:决策树的剪枝往往通过极小化决策树整体的损失函数(loss function)或代价函数(cost function)来实现。换句话来说,剪枝,就是当 α \alpha α确定时,选择损失函数最小的模型。
基本公式和符号:这里关注的都是叶节点。设树
T
T
T的叶节点个数
为
∣
T
∣
|T|
∣T∣,
t
t
t是树$T$的叶节点
,该叶节点的样本点个数
为
N
t
N_t
Nt,其中第
k
k
k类样本点的个数为
N
t
k
N_{tk}
Ntk,
k
=
1
,
2
,
3
,
4...
K
k=1,2,3,4...K
k=1,2,3,4...K;
H
t
(
T
)
H_t(T)
Ht(T)为叶节点t上的经验熵
,
α
≥
0
\alpha \geq 0
α≥0为参数,则决策树学习的损失函数可以定义为
C
α
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha |T|
Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣
其中经验熵(这个就是信息熵的公式)为
H
t
(
T
)
=
−
∑
k
N
t
k
N
t
l
o
g
N
t
k
N
t
H_t(T)=-\sum_k \frac{N_{tk}}{N_t} log \frac{N_{tk}}{N_t}
Ht(T)=−k∑NtNtklogNtNtk
令右边第一项为
C
(
T
)
C(T)
C(T)则有
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=C(T)+\alpha |T|
Cα(T)=C(T)+α∣T∣
其中
C
(
T
)
C(T)
C(T)表示树T中模型对训练数据的预测误差 ,即模型与训练数据的拟合程度, |T|表示模型复杂度,参数
α
\alpha
α控制两者之间的影响。
α
\alpha
α较大,则模型复杂度对损失函数的贡献度高,倾向于选择更简单的模型;
α
\alpha
α较大,则模型复杂度对损失函数的贡献度低,相对来说训练误差对损失函数的贡献度更高,倾向于选择更复杂的树。
剪枝算法:
输入:生成算法产生的整个决策树
T
T
T,参数
α
\alpha
α。
输出:修剪后的子树
T
α
T_{\alpha}
Tα
①计算每个节点的经验熵
。
②递归地从树的叶节点向上
回缩
设一组叶节点未回缩到父节点时整体树为
T
B
T_B
TB;叶节点回缩到父节点,即剪掉这些叶节点时整体树为
T
A
T_A
TA。
若
C
α
(
T
A
)
≤
C
α
(
T
B
)
C_{\alpha}(T_A) \leq C_{\alpha}(T_B)
Cα(TA)≤Cα(TB)则进行剪枝。
该不等式等价于
C
(
T
A
)
−
C
(
T
B
)
∣
T
B
∣
−
∣
T
A
∣
≤
α
\frac{C(T_A)-C(T_B)}{|T_B|-|T_A|}\leq \alpha
∣TB∣−∣TA∣C(TA)−C(TB)≤α
③返回步骤②,直至不能继续为止,得到最小子树
T
α
T_{\alpha}
Tα。
另外单独介绍CART剪枝( α \alpha α未知)
参考李航的书《统计学习方法》
Breiman等人证明:可以使用递归
的方法对树进行剪枝,具体分为两个阶段。
-
第一阶段:剪枝,形成一个子树序列。
具体地,从整体树 T 0 T_0 T0开始剪枝。对 T 0 T_0 T0的任意中间节点
t t t,以 t t t为单节点树的损失函数是
C α ( t ) = C ( t ) + α C_{\alpha}(t)=C(t)+\alpha Cα(t)=C(t)+α
以 t t t为根节点的子树 T t T_t Tt的损失函数为
C α ( T t ) = C ( T t ) + α ∣ T t ∣ C_{\alpha}(T_t)=C(T_t)+\alpha|T_t| Cα(Tt)=C(Tt)+α∣Tt∣
当 α \alpha α为0或者极小的时候,有不等式
C α ( T t ) < C α ( t ) C_{\alpha}(T_t)< C_{\alpha}(t) Cα(Tt)<Cα(t)
当 α \alpha α继续增大时,有
C α ( T t ) = C α ( t ) C_{\alpha}(T_t)=C_{\alpha}(t) Cα(Tt)=Cα(t)
此时满足 T t T_t Tt与 t t t有相同的损失函数值,而 t t t的节点少,因此 t t t比 T t T_t Tt更可取,对 T t T_t Tt进行剪枝。
对 T 0 T_0 T0中每个中间节点
计算:
α = C ( t ) − C ( T t ) ∣ T t ∣ − 1 等 价 于 C α ( T t ) = C α ( t ) \alpha=\frac{C(t)-C(T_t)}{|T_t|-1}\quad 等价于C_{\alpha}(T_t)=C_{\alpha}(t) α=∣Tt∣−1C(t)−C(Tt)等价于Cα(Tt)=Cα(t)
得到一系列 α t \alpha_t αt,找到最小的 α t \alpha_t αt,在 T 0 T_0 T0中剪掉 T t T_t Tt,得到子树 T 1 T_1 T1,同时将最小的 α \alpha α设为 α 1 \alpha_1 α1。此时 T 1 T_1 T1为参数区间[ α 1 \alpha_1 α1, α 2 \alpha_2 α2)内的最优子树。 -
第二个阶段:在剪枝得到的子树序列 T 0 , T 1 , T 2 , . . . T n T_0,T_1,T_2,...T_n T0,T1,T2,...Tn中通过交叉验证选取最优子树 T α T_{\alpha} Tα
具体地,利用独立的验证数据集,测试子树序列 T 0 , T 1 , . . . T n T_0,T_1,...T_n T0,T1,...Tn中各棵子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每棵子树 T 0 , T 1 , . . . T n T_0,T_1,...T_n T0,T1,...Tn都对应一个参数 α 1 , α 2 , . . . α n \alpha_1,\alpha_2,...\alpha_n α1,α2,...αn。所以,当最优子树 T k T_k Tk确定时,对应的 α k \alpha_k αk也确定了,即得到最优决策树 T α T_{\alpha} Tα。
6 决策树算法的代码实现
代码好多好多,看相关参考资料6
相关参考资料 |
1.这个大佬写得好详细啊,条理清晰,白话易懂,但是信息增益部分的公式好像有点问题,链接附上:决策树系列。
2.代码实现决策树多分类,使用python自带的iris数据集,借助ID3算法,参考博客链接附上:机器学习五(sklearn决策树——多分类)
3.代码实现回归树的预测实现,使用python自带波士顿房价数据集,参考博文链接附上:回归树预测和机器学习之路: python 回归树 DecisionTreeRegressor 预测波士顿房价
4.回归树的基本原理概述https://blog.csdn.net/weixin_40604987/article/details/79296427
5.极客时间,试读4节,参考决策树CART部分https://time.geekbang.org/column/article/78659
6.代码代码https://blog.csdn.net/z962013489/article/details/80024574