文章目录
决策树
是一种基本的分类和回归方法。决策树呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为是定义在特征空间和类空间上的条件概率分布。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类。
(1)决策树学习通常包括三个步骤:特征选择、决策树的生成和决策树的剪枝。
(2)由于决策树表示一个条件概率分布,所以深浅不同的决策树对应着不同复杂度的概率模型。决策树的生成对应模型的局部选择,决策树的剪枝对应于模型的全局选择。决策树的生成只考虑局部最优,决策树的剪枝则考虑全局最优
(3)决策树常见算法:ID3、C4.5、CART
(4)决策树相关的重要概念:
- 根结点(Root Node):它表示整个样本集合,并且该节点可以进一步划分成两个或多个子集。
- 拆分(Splitting):表示将一个结点拆分成多个子集的过程。
- 决策结点(Decision Node):当一个子结点进一步被拆分成多个子节点时,这个子节点就叫做决策结点。
- 叶子结点(Leaf/Terminal Node):无法再拆分的结点被称为叶子结点。
- 剪枝(Pruning):移除决策树中子结点的过程就叫做剪枝,跟拆分过程相反。
- 分支/子树(Branch/Sub-Tree):一棵决策树的一部分就叫做分支或子树。
- 父结点和子结点(Paren and Child Node):一个结点被拆分成多个子节点,这个结点就叫做父节点;其拆分后的子结点也叫做子结点。
一、特征选择:
特征选择的准则:使用某特征对数据集划分之后,各数据子集的纯度要比划分前的数据集D的纯度高(也就是不确定性要比划分前数据集D的不确定性低)。
特征选择的方法:
- 信息增益,ID3采用
- 信息增益比,C4.5采用
- GiniIndex,CART分类采用
- 平方误差最小化准则,CART回归采用
1、信息增益
熵是表示随机变量不确定性的度量。
X
X
X是一个取有限个值的离散随机变量,其概率分布为:
p
(
x
i
)
=
P
(
X
=
x
i
)
,
i
=
1
,
2
,
…
,
n
p(x_i)=P(X=x_i) ,i=1,2,…,n
p(xi)=P(X=xi),i=1,2,…,n
则随机变量
X
X
X的熵定义为 :
H
(
X
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
p
(
x
i
)
H(X) = -\sum_{i=1}^n{p(x_i) }log{p(x_i) }
H(X)=−i=1∑np(xi)logp(xi)
熵越大,随机变量的不确定性就越大。上式中的对数以2或者e为底时,熵的单位分别称作比特(bit)或者纳特(nat)。熵只依赖于X的分布,而与X的取值无关,所以也可将X的熵记作
H
(
p
)
H(p)
H(p):
H
(
p
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
p
(
x
i
)
H(p) = -\sum_{i=1}^n{p(x_i) }log{p(x_i) }
H(p)=−i=1∑np(xi)logp(xi)
从定义可以验证:
0
<
=
H
(
p
)
<
=
l
o
g
n
0<= H(p)<=logn
0<=H(p)<=logn。
随机变量X给定的条件下随机变量Y的条件熵
H
(
Y
∣
X
)
H(Y|X)
H(Y∣X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望:
H
(
Y
∣
X
)
=
∑
i
=
1
n
p
(
x
i
)
H
(
Y
∣
X
=
x
i
)
H(Y|X) = \sum_{i = 1}^np(x_i) \space H(Y|X=x_i)
H(Y∣X)=i=1∑np(xi) H(Y∣X=xi)
- p ( x i ) = P ( X = x i ) , i = 1 , 2 , … , n . p(x_i) = P(X=x_i),i = 1,2,…,n. p(xi)=P(X=xi),i=1,2,…,n.
信息增益:特征A对训练数据集D的信息增益 g ( D , A ) g(D,A) g(D,A),定义为集合D的经验嫡 H ( D ) H(D) H(D)与特征A给定条件下 D D D的经验条件嫡 H ( D ∣ A ) H(D|A) H(D∣A)之差。
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
(1)
g(D,A) = H(D) - H(D|A) \tag 1
g(D,A)=H(D)−H(D∣A)(1)
集合D的经验熵
H
(
D
)
H(D)
H(D):
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
l
o
g
2
∣
C
k
∣
∣
D
∣
H(D) = -\sum_{k=1}^K\dfrac{|C_k|}{|D|}log_2\dfrac{|C_k|}{|D|}
H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
当特征A取值较多时,其
H
(
D
∣
A
)
H(D|A)
H(D∣A)相对于特征少的条件熵也会大一些,使用信息增益选择特征时会尽可能选的是特征取值较多。这种情况并不理想。
经验条件嫡
H
(
D
∣
A
)
H(D|A)
H(D∣A):
H
(
D
∣
A
)
=
H
(
D
,
A
)
−
H
(
A
)
=
−
∑
k
,
i
p
(
c
k
,
a
i
)
l
o
g
p
(
c
k
∣
a
i
)
=
∑
i
=
1
n
p
(
a
i
)
(
−
∑
k
=
1
K
p
(
c
k
∣
a
i
)
l
o
g
p
(
c
k
∣
a
i
)
)
=
∑
i
=
1
n
p
(
a
i
)
H
(
D
∣
A
=
a
i
)
=
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
H
(
D
i
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
∑
k
=
1
K
∣
D
i
k
∣
∣
D
i
∣
l
o
g
2
∣
D
i
k
∣
∣
D
i
∣
\begin{aligned} H(D|A)&=H(D,A) - H(A) \\ &= -\sum_{k,i}p(c_k,a_i)log p(c_k|a_i)=\sum_{i=1}^np(a_i)\left(-\sum_{k=1}^K p(c_k|a_i)log p(c_k|a_i)\right)\\ &= \sum_{i = 1}^np(a_i)\space H(D|A = a_i)= \sum_{i=1}^n\dfrac{|D_i|}{|D|}H(D_i) \\ &= -\sum_{i=1}^n\dfrac{|D_i|}{|D|}\sum_{k=1}^K\dfrac{|D_{ik}|}{|D_i|}log_2\dfrac{|D_{ik}|}{|D_i|} \end{aligned}
H(D∣A)=H(D,A)−H(A)=−k,i∑p(ck,ai)logp(ck∣ai)=i=1∑np(ai)(−k=1∑Kp(ck∣ai)logp(ck∣ai))=i=1∑np(ai) H(D∣A=ai)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
- ∣ D ∣ |D| ∣D∣表示其样本容量,即样本个数
- 设有K个类 C k C_k Ck,k=1,2,…,K, ∣ C k ∣ |C_k| ∣Ck∣为属于类 C k C_k Ck的样本个数
- 根据特征A的取值 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an将D划分为n个子集 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn, ∣ D i ∣ |D_i| ∣Di∣为 D i D_i Di的样本个数。
- 记子集 D i D_i Di中属于类 C k C_k Ck的样本的集合为 D i k D_{ik} Dik。
结论:
- 信息增益值的大小是相对于训练数据集而言的,并没有绝对意义。在分类问题困难时,也就是说在训练数据集的经验嫡大的时候,信息增益值会偏大,反之,信息增益值会偏小。
- 对于数据集D而言,信息增益依赖于特征,不同的特征往往具有不同的信息增益,信息增益大的特征具有更强的分类能力。
- 信息增益表示得知特征A的信息而使得类Y的信息的不确定性减少的程度。在特征选择时,选择信息增益最大的特征。
2、信息增益比
定义:特征
A
A
A对训练数据集D的信息增益比
g
R
(
D
,
A
)
g_R(D,A)
gR(D,A)定义为其信息增益
g
(
D
,
A
)
g(D,A)
g(D,A)与训练数据集D关于特征A的值的熵
H
A
(
D
)
H_A(D)
HA(D)之比,即 :
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
(2)
g_R(D,A) = \dfrac{g(D,A)}{H_A(D)} \tag 2
gR(D,A)=HA(D)g(D,A)(2)
- H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ H_A(D) = -\sum_{i=1}^n\dfrac{|D_{i}|}{|D|}log_2\dfrac{|D_{i}|}{|D|} HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣, H A ( D ) H_A(D) HA(D)是D关于特征A的值的熵,n是特征A取值的个数,因为 0 < = H ( p ) < = l o g n 0<= H(p)<=logn 0<=H(p)<=logn,所以当n越大即特征取值越多的时候, H A ( D ) H_A(D) HA(D)也会越大,所以信息增益比能起到调节信息增益受特征取值数量的影响。
- 注意与 H ( D ∣ A ) H(D|A) H(D∣A)的区别。
在特征选择时,选择信息增益比最大的特征
3、GiniIndex
分类问题中,假设有K个类,样本点属于第k类的概率为
p
(
c
k
)
p(c_k)
p(ck),则概率分布的基尼指数定义为:
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
(
c
k
)
(
1
−
p
(
c
k
)
)
=
1
−
∑
k
=
1
K
p
(
c
k
)
2
Gini(p) = \sum_{k=1}^K\space p(c_k)(1-p(c_k)) = 1 - \sum_{k=1}^K\space p(c_k)^2
Gini(p)=k=1∑K p(ck)(1−p(ck))=1−k=1∑K p(ck)2
- p ( c k ) p(c_k) p(ck)表示选中的样本属于k类别的概率,则这个样本被分错的概率为 1 − p ( c k ) 1- p(c_k) 1−p(ck)
对于给定的样本集合D,其基尼指数为:
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
Gini(D) = 1 - \sum_{k=1}^K\space (\dfrac{|C_k|}{|D|})^2
Gini(D)=1−k=1∑K (∣D∣∣Ck∣)2
- 这里
C
k
C_k
Ck是D中属于第k类的样本,K是类的个数
如果样本集合D根据特征A是否取某一可能值a被分割成 D 1 D_1 D1和 D 2 D_2 D2两部分,即:
D 1 = { ( x , y ) ∈ D , A ( x ) = a } , D 2 = D − D 1 D_1 = \{(x,y)\in D,A(x) = a\},D_2 = D - D_1 D1={(x,y)∈D,A(x)=a},D2=D−D1
G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) (3) Gini(D,A) = \dfrac{|D_1|}{|D|}Gini(D_1) + \dfrac{|D_2|}{|D|}Gini(D_2) \tag 3 Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)(3)
基尼指数Gini(D)表示集合D的不确定性,基尼指数Gini(D,A)表示经A=a分割后集合D的不确定性。基尼指数值越大,样本集合的不确定性也就越大,这一点跟熵相似。
在特征选择时,选择基尼指数最小的特征
4、使用平方误差最小化准则进行单元划分
回归树模型表示为:
f
(
x
)
=
∑
m
=
1
M
c
m
I
(
x
∈
R
m
)
f(x) = \sum_{m=1}^M\space c_m \space I(x\in R_m)
f(x)=m=1∑M cm I(x∈Rm)
数据空间被划分成了
R
1
~
R
m
R_1~R_m
R1~Rm 单元,每个单元上有一个固定的输出值
c
m
c_m
cm。
则模型输出值与实际值的总平方误差为:
∑
m
=
1
M
∑
x
i
∈
R
m
(
y
i
−
f
(
x
i
)
)
2
\sum_{m=1}^M\sum_{x_i\in R_m}(y_i - f(x_i))^2
m=1∑Mxi∈Rm∑(yi−f(xi))2
在划分空间时,也就是在选择特征和切分点时,使用平方误差最小化准则
希望每个单元上的
c
m
c_m
cm,可以使得这个平方误差最小化,易知当
c
m
c_m
cm 为相应单元上的所有实际值的均值时,可以达到最优:
c
m
^
=
a
v
e
(
y
i
∣
x
i
∈
R
m
)
\hat{c_m} = ave(y_i|x_i\in R_m)
cm^=ave(yi∣xi∈Rm)
二、决策树的生成
1、ID3算法
输入:训练数据集D,特征集A,阈值 ε \varepsilon ε
输出:决策树T
step1: 若D中所有实例属于同一类 C k C_k Ck,则T为单节点树,并将类 C k C_k Ck作为该结点的类标记,返回T;
step2:若 A = ∅ A = \emptyset A=∅,则T为单结点树,并将D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回T;
step3:否则,计算A中各特征对D的信息增益,选择信息增益最大的特征 A g A_g Ag;
step4:如果 A g A_g Ag的信息增益小于阈值 ε \varepsilon ε,则置T为单结点树,并将D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回T;
step5:否则,对 A g A_g Ag的每一可能取值 a i a_i ai,依 A g = a i A_g = a_i Ag=ai将D分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;
step6:对第i个子结点,以 D i D_i Di为训练集,以 A − A g A - {A_g} A−Ag为特征集,递归的调用步step1- step5,得到子树 T i T_i Ti,返回 T i T_i Ti。
2、C4.5算法
输入:训练数据集D,特征集A,阈值 ε \varepsilon ε
输出:决策树T
step1: 若D中所有实例属于同一类 C k C_k Ck,则T为单节点树,并将类 C k C_k Ck作为该结点的类标记,返回T;
step2:若 A = ∅ A = \emptyset A=∅,则T为单结点树,并将D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回T;
step3:否则,计算A中各特征对D的信息增益比,选择信息增益比最大的特征 A g A_g Ag;
step4:如果 A g A_g Ag的信息增益比小于阈值 ε \varepsilon ε,则置T为单结点树,并将D中实例数最大的类 C k C_k Ck作为该结点的类标记,返回T;
step5:否则,对 A g A_g Ag的每一可能取值 a i a_i ai,依 A g = a i A_g = a_i Ag=ai将D分割为若干非空子集 D i D_i Di,将 D i D_i Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;
step6:对第i个子结点,以 D i D_i Di为训练集,以 A − A g A - {A_g} A−Ag为特征集,递归的调用步step1- step5,得到子树 T i T_i Ti,返回 T i T_i Ti。
3、CART分类树的生成
输入:训练数据集D,停止计算的条件
输出:CART决策树
根据训练数据集,从根节点开始,递归地对每个结点进行以下操作,构建二叉决策树:
step1:设结点的训练数据集为D,计算现有特征对该数据集的基尼指数,此时,对每个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或“否”将D分割成 D 1 D_1 D1和 D 2 D_2 D2两部分,利用公式(3)计算 A = a A = a A=a时的基尼指数。
step2:在所有可能的特征A以及他们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点为最优特征和最优切分点。最优特征和最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
step3:对两个子结点递归地调用step1和step2。直至满足停止条件。
step4:生成CART决策树。
算法停止条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
4、CART回归树的生成
输入:训练数据集D
输出:回归树 f ( X ) f(X) f(X)
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
step1:选择最优切分变量j和切分点s,求解:
m
i
n
∑
j
,
s
(
m
i
n
c
1
∑
x
i
∈
R
1
(
j
,
s
)
(
y
i
−
c
1
)
2
+
m
i
n
c
2
∑
x
i
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
2
)
(4)
min \sum_{j,s}(min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2 + min_{c_2}\sum_{x_i\in R_2\space (j,s)}(y_i-c_2)^2) \tag 4
minj,s∑(minc1xi∈R1(j,s)∑(yi−c1)2+minc2xi∈R2 (j,s)∑(yi−c2)2)(4)
遍历变量j,对固定的切分变量j扫描切分点s,选择使式(4)达到最小值的对
(
j
,
s
)
(j,s)
(j,s)。
step2:用选定的对
(
j
,
s
)
(j,s)
(j,s)划分区域并决定相应的输出值:
R
1
(
j
,
s
)
=
{
x
∣
x
(
j
)
<
=
s
}
,
R
2
(
j
,
s
)
=
{
x
∣
x
(
j
)
>
s
}
R_1(j,s) = \{x|x^{(j)} <=s\},R_2(j,s) = \{x|x^{(j)} > s\}
R1(j,s)={x∣x(j)<=s},R2(j,s)={x∣x(j)>s}
c
1
^
=
a
v
e
(
y
i
∣
x
i
∈
R
1
(
j
,
s
)
)
,
c
2
^
=
a
v
e
(
y
i
∣
x
i
∈
R
2
(
j
,
s
)
)
\hat{c_1} = ave(y_i|x_i\in R_1(j,s)),\space \hat{c_2} = ave(y_i|x_i\in R_2(j,s))
c1^=ave(yi∣xi∈R1(j,s)), c2^=ave(yi∣xi∈R2(j,s))
step3:继续对两个子区域调用步骤step1和step2,直至满足停止条件。
step4:将输入空间划分为M个区域
R
1
,
R
2
,
…
,
R
M
R_1,R_2,…,R_M
R1,R2,…,RM,生成决策树:
f
(
x
)
=
∑
m
=
1
M
c
m
^
I
(
x
i
∈
R
m
)
f(x) = \sum_{m=1}^M\hat{c_m}I(x_i\in R_m)
f(x)=m=1∑Mcm^I(xi∈Rm)
三、决策树的剪枝
1、ID3和C4.5使用的剪枝方法
-
决策树的生成算法容易构建过于复杂的决策树,产生过拟合。
-
决策树的剪枝:在决策树学习中将已生成的树进行简化的过程称为剪枝(pruning)。具体地,剪枝从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型.
-
决策树的剪枝往往通过极小化决策树整体的损失函数(loss fimction)或代价函数( cost function)来实现。
设树T的叶结点个数为|T|, t是树T的叶结点,该叶结点有
N
t
N_t
Nt个样本点,其中k类的样本点有
N
t
k
N_{tk}
Ntk个,k=1,2,…,K,
H
t
(
T
)
H_t(T)
Ht(T)为叶结点t上的经验嫡,
α
>
=
0
\alpha >=0
α>=0为参数,则决策树学习的损失函数可以定义为:
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
=
1
K
N
t
k
N
t
l
o
g
N
t
k
N
t
H_t(T) = -\sum_{k=1}^K \dfrac{N_{tk}}{N_t}log\dfrac{N_{tk}}{N_t}
Ht(T)=−k=1∑KNtNtklogNtNtk
第一项记作
C
(
T
)
C(T)
C(T):
C
(
T
)
=
−
∑
t
=
1
∣
T
∣
∑
k
=
1
K
N
t
k
l
o
g
N
t
k
N
t
C(T) = -\sum_{t=1}^{|T|}\sum_{k=1}^K N_{tk}log\dfrac{N_{tk}}{N_t}
C(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk
则有:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_{\alpha} (T) = C(T) + \alpha |T|
Cα(T)=C(T)+α∣T∣
C
(
T
)
C(T)
C(T)表示模型对训练数据的预测误差,经验熵的变形,越小越好,|T|表示模型复杂度,参数
α
>
=
0
\alpha>=0
α>=0控制两者之间的影响。剪枝,就是当
α
\alpha
α确定时,选择损失函数最小的模型,即损失函数最小的子树。损失函数正好表示了对模型的复杂度和训练数据的拟合两者的平衡。利用损失函数最小原则进行剪枝就是用正则化的极大似然估计进行模型选择。
剪枝算法:
输入:生成算法产生的整个树T,参数
α
\alpha
α。
输出:修剪后的子树 T α T_{\alpha} Tα
step1:计算每个结点的经验熵;
step2:递归的从树的叶结点回溯。
设一组叶结点回溯到父结点之前与之后的整体树分别为 T B T_B TB与 T A T_A TA, C ( T B ) , C ( T A ) C(T_B),C(T_A) C(TB),C(TA)表示树对训练数据的预测误差,用树的叶子数 ∣ T B ∣ 、 ∣ T A ∣ |T_B|、|T_A| ∣TB∣、∣TA∣表示树的复杂度,则树对应的损失函数值分别为 C α ( T B ) C_{\alpha}(T_B) Cα(TB)、 C α ( T A ) C_{\alpha}(T_A) Cα(TA),如果:
C α ( T A ) < = C α ( T B ) C_{\alpha}(T_A)<=C_{\alpha}(T_B) Cα(TA)<=Cα(TB)
则进行剪枝,将父结点变为新的叶结点。
C
α
(
T
A
)
=
C
(
T
A
)
+
α
∣
T
A
∣
C_{\alpha} (T_A) = C(T_A) + \alpha |T_A|
Cα(TA)=C(TA)+α∣TA∣
C
α
(
T
B
)
=
C
(
T
B
)
+
α
∣
T
B
∣
C_{\alpha} (T_B) = C(T_B) + \alpha |T_B|
Cα(TB)=C(TB)+α∣TB∣
即:
C
(
T
A
)
+
α
∣
T
A
∣
<
=
C
(
T
B
)
+
α
∣
T
B
∣
C(T_A) + \alpha |T_A| <= C(T_B) + \alpha |T_B|
C(TA)+α∣TA∣<=C(TB)+α∣TB∣
∴
C
(
T
A
)
−
C
(
T
B
)
<
=
α
(
∣
T
B
∣
−
∣
T
A
∣
)
\therefore C(T_A) - C(T_B) <= \alpha(|T_B| - |T_A|)
∴C(TA)−C(TB)<=α(∣TB∣−∣TA∣)
由上式可以看出回溯前后的叶结点的数量差 ∣ T B ∣ − ∣ T A ∣ > 0 |T_B| - |T_A| > 0 ∣TB∣−∣TA∣>0为被剪枝特征的可取值数量-1,若 α \alpha α很大,则剪枝后可能会出现训练精度急速下降的情况,即 C ( T A ) < < C ( T B ) C(T_A) << C(T_B) C(TA)<<C(TB)。
step3:返回step2,直至不能继续为止,得到损失函数最小的树 T α T_{\alpha} Tα。
所以在剪枝时, α \alpha α的选择会很重要,也是缺陷所在。
2、CART使用的剪枝方法
(1)计算局部损失函数
输入:生成算法产生的整个树 T 0 T_0 T0,traindata [ , t e s t d a t a ] [,testdata] [,testdata]
输出:修剪后的子树 T α T_{\alpha} Tα
step1:对 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∣
- 当 α = 0 \alpha=0 α=0或充分小时,有: C α ( T t ) < C α ( t ) C_{\alpha}(T_t) < C_{\alpha}(t) Cα(Tt)<Cα(t)
- 当 α = C ( t ) − C ( T t ) ∣ T t ∣ − 1 \alpha = \dfrac{C(t)-C(T_t)}{|T_t|-1} α=∣Tt∣−1C(t)−C(Tt),有: C α ( T t ) = C α ( t ) C_{\alpha}(T_t) = C_{\alpha}(t) Cα(Tt)=Cα(t)
- 当 α > C ( t ) − C ( T t ) ∣ T t ∣ − 1 \alpha > \dfrac{C(t)-C(T_t)}{|T_t|-1} α>∣Tt∣−1C(t)−C(Tt),有: C α ( T t ) > C α ( t ) C_{\alpha}(T_t) > C_{\alpha}(t) Cα(Tt)>Cα(t)
按李航统计学习方法里面说的,只需比较两个树的损失函数大小,其计算可以在局部进行,所以可以一次计算所有的结点,并把每一个结点对应的 α \alpha α存储到 α l i s t \alpha_{list} αlist。
step2: α l i s t \alpha_{list} αlist升序排列,从小到大依次取出一个 α i \alpha_i αi,找到对应的结点 a i a_i ai进行剪枝,得到对应的树为 T i T_i Ti树,存入 T l i s t T_{list} Tlist,直到最后一棵树上只有一个叶子结点,此时也是根节点的树 T n T_n Tn,循环结束。得到的 T l i s t = [ T 0 , T 1 , … , T n ] T_{list} = [T_0,T_1,…,T_n] Tlist=[T0,T1,…,Tn]
step3:用独立的数据集验证每一颗树,选择误差最小的一棵树 T α T_{\alpha} Tα。
上面是按剪枝前后局部的损失函数来选择 α \alpha α,李航书中说可以局部,那么就可以一次性把所有的结点都对应的 α \alpha\space α 计算出来。下面我按整棵树的损失函数重写了CART剪枝方法,这两种方法如果剪枝后的 α l i s t \alpha_{list} αlist一致,说明计算整棵树的损失函数和计算局部损失函数是一样的,如果是这样,那肯定是计算局部损失函数以提高计算速度,而且还可以一次找出所有结点对应的 α \alpha α。
(2)计算整棵树损失函数
输入:生成算法产生的整个树 T 0 T_0 T0,traindata [ , t e s t d a t a ] [,testdata] [,testdata]
输出:修剪后的子树 T α T_{\alpha} Tα
step1:对于当前最优决策树T,其内任一结点
t
\space t\space
t 剪枝前后的整体树分别为
T
B
T_B
TB与
T
A
T_A
TA,
C
(
T
B
)
,
C
(
T
A
)
C(T_B),C(T_A)
C(TB),C(TA)表示树对训练数据的预测误差,用树的叶子数
∣
T
B
∣
、
∣
T
A
∣
|T_B|、|T_A|
∣TB∣、∣TA∣表示树的复杂度,该节点内的叶子数为
∣
T
t
∣
|T_t|
∣Tt∣,则树对应的损失函数值分别为
C
α
(
T
B
)
C_{\alpha}(T_B)
Cα(TB)、
C
α
(
T
A
)
C_{\alpha}(T_A)
Cα(TA),则:
C
α
(
T
A
)
=
C
(
T
A
)
+
α
∣
T
A
∣
(5)
C_{\alpha} (T_A) = C(T_A) + \alpha |T_A|\tag 5
Cα(TA)=C(TA)+α∣TA∣(5)
C
α
(
T
B
)
=
C
(
T
B
)
+
α
∣
T
B
∣
(6)
C_{\alpha} (T_B) = C(T_B) + \alpha |T_B|\tag 6
Cα(TB)=C(TB)+α∣TB∣(6)
显然剪枝前的预测误差小于剪枝后的误差
C
(
T
B
)
<
C
(
T
A
)
C(T_B) < C(T_A)
C(TB)<C(TA),且有剪枝前后的叶子数之差为
∣
T
B
∣
−
∣
T
A
∣
=
∣
T
t
∣
−
1
|T_B| - |T_A| = |T_t| - 1
∣TB∣−∣TA∣=∣Tt∣−1
- 当 α = 0 \alpha=0 α=0或充分小时,有不等式: C α ( T B ) < C α ( T A ) C_{\alpha} (T_B) < C_{\alpha} (T_A) Cα(TB)<Cα(TA)
- 当 α = C ( T A ) − C ( T B ) ∣ T B ∣ − ∣ T A ∣ = C ( T A ) − C ( T B ) ∣ T t ∣ − 1 \alpha = \dfrac{C(T_A) - C(T_B)}{|T_B| - |T_A|} = \dfrac{C(T_A) - C(T_B)}{|T_t| - 1} α=∣TB∣−∣TA∣C(TA)−C(TB)=∣Tt∣−1C(TA)−C(TB),有: C α ( T B ) = C α ( T A ) C_{\alpha} (T_B) = C_{\alpha} (T_A) Cα(TB)=Cα(TA)
- 当 α > C ( T A ) − C ( T B ) ∣ T t ∣ − 1 \alpha > \dfrac{C(T_A) - C(T_B)}{|T_t| - 1} α>∣Tt∣−1C(TA)−C(TB) 时,有: C α ( T B ) > C α ( T A ) C_{\alpha} (T_B) > C_{\alpha} (T_A) Cα(TB)>Cα(TA),即剪枝后比剪枝前的损失函数小,所以对结点t剪枝。
假设当前树T有m个结点,求出m个结点对应的 α \alpha α。
step2:取最小的 α \alpha α存入 α l i s t \alpha_{list} αlist并找到对应的结点进行剪枝,得到对应的树为 T i T_i Ti树,存入 T l i s t T_{list} Tlist,并把 T i T_i Ti赋值给T作为当前最优决策树;
step3:递归执行step1和step2,直到最后一棵树上只有一个叶子结点,此时也是根节点的树 T n T_n Tn,递归结束。得到的 T l i s t = [ T 0 , T 1 , … , T n ] T_{list} = [T_0,T_1,…,T_n] Tlist=[T0,T1,…,Tn]
step4:用独立的数据集验证每一颗树,选择误差最小的一棵树 T α T_{\alpha} Tα。
四、三种决策树算法比较
1、决策树的优点和缺点
优点:
- 决策树算法中学习简单的决策规则建立决策树模型的过程非常容易理解;
- 决策树模型可以可视化,非常直观;
- 应用范围广,可用于分类和回归,而且非常容易做多类别的分类;
- 能够处理数值型和连续的样本特征。
缺点:
- 很容易在训练数据中生成复杂的树结构,造成过拟合(overfitting)。剪枝可以缓解过拟合的负作用,常用方法是限制树的高度、叶子节点中的最少样本数量;
- 学习一棵最优的决策树被认为是NP-Complete问题。实际中的决策树是基于启发式的贪心算法建立的,这种算法不能保证建立全局最优的决策树。Random Forest 引入随机能缓解这个问题。
2、ID3
ID3决策树可以有多个分支,但是不能处理特征值为连续的情况。决策树是一种贪心算法,每次选取的分割数据的特征都是当前的最佳选择,并不关心是否达到最优。
缺点:只能处理离散型属性,并且对倾向于选择取值较多的特征。
3、C4.5
C4.5算法流程与ID3相类似,只不过将信息增益改为信息增益比,以解决偏向取值较多的属性的问题,另外它可以处理连续型属性。
4、CART分类
CART是一棵二叉树,采用二元切分法,每次把数据切成两份,分别进入左子树、右子树。而且每个非叶子节点都有两个孩子,所以CART的叶子节点比非叶子多1。相比ID3和C4.5,CART应用要多一些,既可以用于分类也可以用于回归。CART分类时,使用基尼指数(Gini)来选择最好的数据分割的特征,gini描述的是纯度,与信息熵的含义相似。CART中每一次迭代都会降低GINI系数。
5、分类树 VS 回归树
-
提到决策树算法,很多想到的就是上面提到的ID3、C4.5、CART分类决策树。其实决策树分为分类树和回归树,前者用于分类,如晴天/阴天/雨天、用户性别、邮件是否是垃圾邮件,后者用于预测实数值,如明天的温度、用户的年龄等。
-
作为对比,先说分类树,我们知道ID3、C4.5分类树在每次分枝时,是穷举每一个特征属性的每一个阈值,找到使得按照feature<=阈值,和feature>阈值分成的两个分枝的熵最大的feature和阈值。按照该标准分枝得到两个新节点,用同样方法继续分枝直到所有人都被分入性别唯一的叶子节点,或达到预设的终止条件,若最终叶子节点中的性别不唯一,则以多数人的性别作为该叶子节点的性别。
-
回归树总体流程也是类似,不过在每个节点(不一定是叶子节点)都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化均方差–即(每个人的年龄-预测年龄)^2 的总和 / N,或者说是每个人的预测误差平方和 除以 N。这很好理解,被预测出错的人数越多,错的越离谱,均方差就越大,通过最小化均方差能够找到最靠谱的分枝依据。分枝直到每个叶子节点上人的年龄都唯一(这太难了)或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。
三种决策树算法比较引用自博客
未完待续……