一、决策树
1.1 基本思想
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部结点和叶结点。内部结点表示一个特征或属性,叶结点表示一个类。
用决策树分类,从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归的对实例进行测试并分配,直至达到叶结点,最后将实例分到叶结点的类中。
决策树学习通过包括3个步骤:特征选择、决策树的生成和决策树的修剪。
1.2 特征选择
特征选择,即选取某个特征,然后根据这个特征对实例点进行分类。那么该如何选择特征呢?
1.2.1 熵
熵表示随机变量不确定性的度量。设
X
X
X是一个取有限个值的离散随机变量,其概率分布为:
P
(
X
=
x
i
)
=
p
i
,
i
=
1
,
2
,
⋯
,
n
(1)
P(X=x_i)=p_i, i=1,2,\cdots,n\tag1
P(X=xi)=pi,i=1,2,⋯,n(1)
则随机变量
X
X
X的熵为:
H
(
X
)
=
−
∑
i
=
1
n
p
i
log
p
i
(2)
H(X)=-\sum\limits_{i=1}^np_i\log p_i\tag2
H(X)=−i=1∑npilogpi(2)
若
p
i
=
0
p_i=0
pi=0,定义
p
i
log
p
i
=
0
p_i\log p_i=0
pilogpi=0。根据定义,随机变量
X
X
X的熵与
X
X
X的取值无关,只取决于
X
X
X的分布,因此有时也记作
H
(
p
)
=
−
∑
i
=
1
n
p
i
log
p
i
(3)
H(p)=-\sum\limits_{i=1}^np_i\log p_i\tag3
H(p)=−i=1∑npilogpi(3)
熵越大,随机变量的不确定性越大。
1.2.2 条件熵
设有随机变量
(
X
,
Y
)
(X, Y)
(X,Y),其联合概率分布为
P
(
X
=
x
i
,
Y
=
y
j
)
=
p
i
j
,
i
=
1
,
2
,
⋯
,
n
(4)
P(X=x_i, Y=y_j)=p_{ij}, i=1, 2, \cdots, n\tag4
P(X=xi,Y=yj)=pij,i=1,2,⋯,n(4)
条件熵
H
(
Y
∣
X
)
H(Y|X)
H(Y∣X)表示在已知随机变量
X
X
X的条件下随机变量
Y
Y
Y的不确定性。随机变量
X
X
X给定的条件下随机变量
Y
Y
Y的条件熵定义为
H
(
Y
∣
X
)
=
∑
i
=
1
n
p
i
H
(
Y
∣
X
=
x
i
)
(5)
H(Y|X)=\sum\limits_{i=1}^np_iH(Y|X=x_i)\tag5
H(Y∣X)=i=1∑npiH(Y∣X=xi)(5)
这里
p
i
=
P
(
X
=
x
i
)
,
i
=
1
,
2
,
⋯
,
n
p_i=P(X=x_i), i=1, 2, \cdots, n
pi=P(X=xi),i=1,2,⋯,n
1.2.3 信息增益
信息增益表示得知特征 X X X的信息而使得类 Y Y Y的信息的不确定性减少的程度。
特征
A
A
A对训练集
D
D
D的信息增益
g
(
D
,
A
)
g(D,A)
g(D,A),定义为集合
D
D
D的经验熵
H
(
D
)
H(D)
H(D)与特征
A
A
A给定条件下
D
D
D的经验条件熵
H
(
D
∣
A
)
H(D|A)
H(D∣A)之差,即
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
(6)
g(D,A)=H(D)-H(D|A)\tag6
g(D,A)=H(D)−H(D∣A)(6)
这里经验熵是指熵中的概率由数据估计得到的。
信息增益大的特征具有更强的分类能力,因此选取信息增益最大的特征。
1.2.4 信息增益比
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题(从公式出发,信息增益是整个数据集的经验熵与特征a对整个数据集的经验条件熵的差值,信息增益越大即经验条件熵越小。从概念来讲,信息增益反映的给定一个条件以后不确定性减少的程度(由于特征a而使得数据集的分类不确定性减少的程度) , 必然是分得越细的数据集确定性更高,也就是条件熵越小,信息增益越大)。使用信息增益比则可以对这一问题进行校正。
详见如何理解C4.5算法解决了ID3算法的偏向于选择取值较多的特征问题
特征
A
A
A对训练数据集
D
D
D的信息增益比
g
R
(
D
,
A
)
g_R(D, A)
gR(D,A)定义为信息增益
g
(
D
,
A
)
g(D, A)
g(D,A)与训练数据集
D
D
D关于特征
A
A
A的值的熵
H
A
(
D
)
H_A(D)
HA(D)之比,即
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
(7)
g_R(D, A)=\frac{g(D, A)}{H_A(D)}\tag7
gR(D,A)=HA(D)g(D,A)(7)
其中,
H
A
(
D
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
log
2
∣
D
i
∣
∣
D
∣
H_A(D)=-\sum\limits_{i=1}^n\frac{|D_i|}{|D|}\log_2\frac{|D_i|}{|D|}
HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
1.3 决策树生成
1.3.1 ID3算法
ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归的生成决策树。具体方法是:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点,再对子结点递归的调用以上方法,构建决策树,直至所有特征的信息增益都很小或没有特征可以选择为止。
1.3.2 C4.5算法
C4.5算法与ID3算法类似,所不同的是:C4.5算法选用信息增益比作为特征选择的准则。
1.3.3 对比
1.4 决策树的剪枝
剪枝就是将树生成的不必要子树剪掉,减少叶子节点数量,降低树模型的复杂度。
总体来说,剪枝可分为预剪枝和后剪枝
1.4.1 预剪枝
预剪枝是指在完全正确分类前,决策树会较早的停止树的生长。而终止树继续向下生长的方法有很多,可总结为通用的停止和更严格的停止两种。
通用的停止:
- 如果所有样本均属于一类,就停止
- 如果样本的所有特征值都相同,就停止
更严格的停止:
- 树达到一定深度
- 节点内包含的样本点小于给定的阈值
- 信息增益或信息增益比小于给定的阈值
- 看划分前后的泛化性能(在独立的验证集上)是否有提升,也就是如果划分后泛化性能有提升,则划分;否则,不划分
1.4.2 后剪枝
后剪枝首先通过完全分裂构造完整的决策树,允许过拟合,然后采取一定的策略来进行剪枝。
常用的后剪枝策略包括:
比较项目和剪枝方法 | 代价—复杂度剪枝(CCP) | 降低错误剪枝(REP) | 悲观错误剪枝(PEP) |
---|---|---|---|
是否需要独立验证集 | 不需要 | 需要 | 不需要 |
剪枝方式 | 自底向上 | 自底向上 | 自顶向下 |
误差估计 | 标准误差 | 独立剪枝集 | 连续性校正 |
计算复杂度 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n ) O(n) O(n) |
- 代价—复杂度剪枝:在原有的经验损失函数(经验熵)上加入正则项,正则参数是树的叶子节点个数
设树的叶结点的个数为 ∣ 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 , ⋯ , K k=1,2,\cdots,K k=1,2,⋯,K, H t ( T ) H_t(T) Ht(T)为叶结点 t t t上的经验熵, α ≥ 0 \alpha\ge0 α≥0为参数,则决策树学习的损失函数可以定义为 C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ (8) C_{\alpha}(T)=\sum\limits_{t=1}^{|T|}N_tH_t(T)+\alpha |T|\tag8 Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣(8) 其中,经验熵为 H t ( T ) = − ∑ k N t k N t log N t k N t (9) H_t(T)=-\sum_{k}\frac{N_{tk}}{N_{t}}\log \frac{N_{tk}}{N_{t}}\tag9 Ht(T)=−k∑NtNtklogNtNtk(9)
将 ( 8 ) (8) (8)式中右端第一项记作 C ( T ) C(T) C(T),那么 C α ( T ) = C ( T ) + α ∣ T ∣ (10) C_{\alpha}(T)=C(T)+\alpha |T|\tag{10} Cα(T)=C(T)+α∣T∣(10)
其中, C ( T ) C(T) C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度, ∣ T ∣ |T| ∣T∣表示模型复杂度,参数 α ≥ 0 \alpha\ge0 α≥0控制两者之间的影响。较大的 α ≥ 0 \alpha\ge0 α≥0促使选择较简单的树模型。剪枝就是当 α ≥ 0 \alpha\ge0 α≥0确定时,选择损失函数最小的模型,即损失函数最小的子树。 ( 8 ) (8) (8)式或 ( 10 ) (10) (10)式定义的损失函数的极小化等价于正则化的极大似然估计。所以,利用损失函数最小原则进行剪枝就是用正则化的极大似然估计进行模型选择。
- 降低错误剪枝:最简单粗暴的一种后剪枝方法,就是看剪枝前后,验证集上的误差精度,以此决定是否剪枝
- 悲观错误剪枝:把一颗子树(具有多个叶子节点)的分类用一个叶子节点来替代的话,误判率肯定是上升的(这是很显然的,同样的样本子集,如果用子树分类可以分成多个类,而用单颗叶子节点来分的话只能分成一个类,多个类肯定要准确一些)。于是我们需要把子树的误判计算加上一个经验性的惩罚因子。
对于一个叶子节点,它覆盖了 N N N个样本,其中有 E E E个错误,那么该叶子节点的错误率为 ( E + 0.5 ) / N (E+0.5)/N (E+0.5)/N。这个 0.5 0.5 0.5就是惩罚因子。
\quad
那么对于一颗子树,它有 L L L个叶子节点,那么该子树的剪枝前的误判率估计为 ( ∑ E + 0.5 ∗ L ) / ∑ N (\sum E+0.5*L)/\sum N (∑E+0.5∗L)/∑N。剪枝后内部节点变成了叶子节点,其误判个数 J J J也需要加上一个惩罚因子,所以剪枝后的误判率估计为 ( J + 0.5 ) / ∑ N (J+0.5)/\sum N (J+0.5)/∑N。
\quad
1.4.3 对比
预剪枝
-
优点:
- 更快
- 能降低过拟合
-
缺点:
- 尽管有些分支的划分不能提升泛化性能,但是后续划分可能使性能显著提高,由于预剪枝没有展开这些分支,带来了欠拟合的风险。
后剪枝:
- 优点:后剪枝通常比预剪枝保留更多的分支,欠拟合风险小
- 缺点:后剪枝是在决策树构造完成后进行的,其训练时间的开销会大于预剪枝。
二、CART算法
CART算法,分类与回归树,是应用广泛的决策树学习方法。CART同样由特征选择、树的生成和树的剪枝组成。CART是在给定输入随机变量 X X X条件下输出随机变量 Y Y Y的条件概率分布的学习方法。CART假设决策树是二叉树,内部节点特征的取值为“是”和“否”,左分支为“是”的分支。这样的决策树等价于递归的二分每个特征。
CART由以下两步组成:
- 决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大
- 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,此时可用损失函数最小作为剪枝的标准。
2.1 CART生成
决策树的生成就是递归的构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选择,生成二叉树。
以分类树为例。
基尼指数:假设有
K
K
K个类,样本点属于第
k
k
k类的概率为
p
k
p_k
pk,则概率分布的基尼指数定义为
G
i
n
i
(
p
)
=
∑
i
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
i
=
1
K
p
k
2
(11)
Gini(p)=\sum\limits_{i=1}^Kp_k(1-p_k)=1-\sum\limits_{i=1}^Kp_k^2\tag{11}
Gini(p)=i=1∑Kpk(1−pk)=1−i=1∑Kpk2(11)
对于给定的样本集合
D
D
D,其基尼指数为
G
i
n
i
(
D
)
=
1
−
∑
i
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
(12)
Gini(D)=1-\sum\limits_{i=1}^K(\frac{|C_k|}{|D|})^2\tag{12}
Gini(D)=1−i=1∑K(∣D∣∣Ck∣)2(12)
其中,
C
k
C_k
Ck是
D
D
D中属于第
k
k
k类的样本子集。基尼指数
G
i
n
i
(
D
)
Gini(D)
Gini(D)表示集合
D
D
D的不确定性,基尼指数值越大,样本集合的不确定性也就越大。
如果样本集合 D D D根据特征 A A A是否取某一可能值 a a a被分割成 D 1 D_1 D1和 D 2 D_2 D2两部分,那么在特征 A A A的条件下,集合 D D D的基尼指数定义为 G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) (13) Gini(D, A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)\tag{13} Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)(13)
关于基尼指数:
- 基尼指数和熵类似,都是越大,集合的不确定性越大。
- G i n i ( D , A ) Gini(D, A) Gini(D,A)表示经过特征 A A A分割后集合 D D D的不确定性,所以 G i n i ( D , A ) Gini(D, A) Gini(D,A)越小越好;而信息增益是经过特征 A A A分割后集合不确定性下降的程度,所以越大越好。总之,就是让经过特征分割后的集合,不确定性最小。
为什么选用基尼指数?
- 运算速度比熵快。前面说到过,熵由于取对数,所以运算比较慢。而基尼指数只有平方运算,而且还只是二分类,所以更快
- 性能和熵模型接近。对 ln x \ln x lnx在 x = 1 x=1 x=1处进行一阶泰勒展开,有 ln x = − 1 + x + o ( x ) \ln x=-1+x+o(x) lnx=−1+x+o(x),所以熵 = − ∑ i = 1 n p i ln p i = − ∑ i = 1 n p i ( − 1 + p i ) = ∑ i = 1 n p i ( 1 − p i ) =-\sum\limits_{i=1}^np_i\ln p_i=-\sum\limits_{i=1}^np_i(-1+p_i)=\sum\limits_{i=1}^np_i(1-p_i) =−i=1∑npilnpi=−i=1∑npi(−1+pi)=i=1∑npi(1−pi)=基尼指数。所以基尼指数可以理解为熵模型的一阶泰勒展开
CART生成算法:
从根节点开始,递归的对每个结点进行以下操作,构建二叉决策树:
- 设训练集为 D D D,对每一个特征 A A A,对其可能取的每一个值 a a a,将数据集分为 D 1 D_1 D1和 D 2 D_2 D2两部分,再根据 ( 13 ) (13) (13)计算 A = a A=a A=a时的基尼指数
- 在所有可能的特征 A A A以及它们所有可能的切分点 a a a中,选择基尼指数最小的特征及其对应的切分点作为最优特征和最优切分点,从现结点生成两个子结点,将数据集进行分配
- 对两个子结点递归的调用1和2
- 生成CART决策树
算法停止的条件是结点中的样本数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
2.2 CART回归树生成
2.4 CART剪枝
CART剪枝算法由两步组成:首先从生成的决策树 T 0 T_0 T0底端开始不断剪枝,直到 T 0 T_0 T0的根节点,形成一个子树序列 { T 0 , T 1 , ⋯ , T n } \{T_0, T_1, \cdots, T_n\} {T0,T1,⋯,Tn};然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
2.4.1 生成子树
在剪枝过程中,计算子树的损失函数:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_\alpha(T)=C(T)+\alpha|T|
Cα(T)=C(T)+α∣T∣
其中,
T
T
T为任意子树,
C
(
T
)
C(T)
C(T)是对训练数据的预测误差(如基尼指数),衡量训练数据的拟合程度;
∣
T
∣
|T|
∣T∣为子树的叶节点个数,衡量树的复杂度;
α
≥
0
\alpha\ge0
α≥0为参数,衡量拟合程度与树的复杂度,
α
\alpha
α越小,越不考虑树的复杂度,所以子树
T
T
T可以越大,当
α
=
0
\alpha=0
α=0时,子树就是完全树。当
α
→
∞
\alpha\to\infty
α→∞时,子树就是一个根节点。
那么如何找到合适的 α \alpha α呢?最好的办法就是将 α \alpha α从 0 0 0取到正无穷, 0 = α 0 < α 1 < ⋯ < α n < ∞ 0=\alpha_0\lt \alpha_1\lt\cdots\lt\alpha_n\lt\infty 0=α0<α1<⋯<αn<∞,产生一系列的区间 [ α i , α i + 1 ) , i = 0 , ⋯ , n [\alpha_i,\alpha_{i+1}), i=0,\cdots,n [αi,αi+1),i=0,⋯,n;在每一个 [ α i , α i + 1 ) [\alpha_i,\alpha_{i+1}) [αi,αi+1)中,子树 T i T_i Ti是最优的,所以就能得到一个子树序列 { T 0 , T 1 , ⋯ , T n } \{T_0, T_1, \cdots, T_n\} {T0,T1,⋯,Tn}
2.4.2 选择子树
利用独立的验证数据集,测试子树序列 { T 0 , T 1 , ⋯ , T n } \{T_0, T_1, \cdots, T_n\} {T0,T1,⋯,Tn}中各课子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。
2.5 优缺点
- 优点:
- 简单直观,生成的决策树很直观
- 既可用于分类,又可用于回归
- 可以交叉验证的剪枝来选择模型,从而提高泛化能力。
- 对类别不平衡的数据依旧表现不错(它使用基于类变量的划分规则去创建分类树,因此可以强制地将不同类别的样本分开。)
- 缺点:
- 决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决
- 决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进
参考:《统计学习方法》李航 著