ch05: 决策树
决策树(decision tree)是一种基本的分类与回归方法。可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。
- 学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型.
- 决策树学习通常包括 3 个步骤:特征选择、决策树的生成和决策树的修剪.
- 预测时,对新的数据,利用决策树模型进行分类.
1. 决策树模型与学习
决策树模型
- 定义:
- 分类决策树模型是一种描述对实例进行分类的树形结构.
- 决策树由结点(node)和有向边(directed edge)组成.
- 结点有两种类型:内部结点(internal node)和叶结点(leaf node).
- 内部结点表示一个特征或属性,叶结点表示一个类.
决策树学习
- 决策树学习本质上是从训练数据集中归纳出一组分类规则.我们需要的是一个与训练数据矛盾较小的决策树,同时具有很好的泛化能力.
- 决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程.
- 以上方法生成的决策树可能对训练数据有很好的分类能力,但对未知的测试数据却未必有很好的分类能力,即可能发生过拟合现象.
- 我们需要对已生成的树自下而上进行剪枝,将树变得更简单,从而使它具有更好的泛化能力.具体地,就是去掉过于细分的叶结点,使其回退到父结点,甚至更高的结点,然后将父结点或更高的结点改为新的叶结点.
- 如果特征数量很多,也可以在决策树学习开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征.
可以看出,决策树学习算法包含特征选择、决策树的生成与决策树的剪枝过程.
2. 特征选择
特征选择在于选取对训练数据具有分类能力的特征.这样可以提高决策树学习的效率.通常特征选择的准则是信息增益或信息增益比.
信息增益
- 熵(entropy)
-
表示随机变量不确定性的度量.
-
设 X 是一个取有限个值的离散随机变量,在它的熵定义为
H ( p ) = − ∑ i = 1 n p i l o g p i H(p)=-\sum_{i=1}^np_ilog\,p_i H(p)=−i=1∑npilogpi熵只依赖于X的分布
-
熵越大,随机变量的不确定性就越大.且值满足
0 ≤ H ( p ) ≤ l o g n 0\le H(p)\le log\,n 0≤H(p)≤logn- 当随机变量完全没有不确定性时,相应的熵最小等于0
- 当随机变量的取值等概率分布时,相应的熵最大
-
条件熵 H( Y | X ) 表示在已知随机变量 X 的条件下随机变量Y 的不确定性.定义为 X 给定条件下Y 的条件概率分布的熵对 X 的数学期望
H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X)=\sum^n_{i=1}p_iH(Y|X=x_i) H(Y∣X)=i=1∑npiH(Y∣X=xi) -
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy).
- 信息增益(information gain)
-
表示得知特征 X 的信息而使得类Y 的信息的不确定性减少的程度.
-
特征 A 对训练数据集 D 的信息增益 g(D, A) ,定义为集合 D 的经验熵 H(D) 与特征 A 给定条件下 D 的经验条件熵 H(D|A) 之差,即
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A) -
信息增益大的特征具有更强的分类能力.
- 信息增益的算法
-
输入:训练数据集D和特征A
-
输出:特征 A 对训练数据集 D 的信息增益 g(D, A)
-
步骤:
(1)计算数据集 D 的经验熵 H(D)
H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g 2 ∣ C k ∣ ∣ D ∣ H(D)=-\sum^K_{k=1}\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|} H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣(2)计算特征 A 对数据集 D 的经验条件熵 H(D|A)
H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) H ( D i ) = − ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣ l o g 2 ∣ D i k ∣ ∣ D i ∣ H(D|A)=\sum^n_{i=1}\frac{|D_i|}{|D|}H(D_i)\\H(D_i)=-\sum^K_{k=1}\frac{|D_{ik}|}{|D_i|}log_2\frac{|D_{ik}|}{|D_i|} H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)H(Di)=−k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣(3)计算信息增益
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
信息增益比
信息增益值的大小是相对于训练数据集而言的,并没有绝对意义.在分类问题困难时,也就是说在训练数据集的经验熵大的时候,信息增益值会偏大.反之,信息增益值会偏小.使用**信息增益比(information gain ratio)**可以对这一问题进行校正.
定义:特征 A 对训练数据集 D 的信息增益比定义为其信息增益与训练数据集 D 的经验熵比:
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
(
D
)
g_R(D,A)=\frac{g(D,A)}{H(D)}
gR(D,A)=H(D)g(D,A)
3. 决策树的生成
ID3 算法
ID3 算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树.相当于用极大似然法进行概率模型的选择.
- 输入:训练数据集 D,特征集 A,阈值 ε
- 输出:决策树 T
- 步骤
(1)若 D 中所有实例属于同一类 ,则 T 为单结点树,并将该类作为该结点的类标记,返回 T;
(2)若 A为空集,则 T 为单结点树,并将 D 中实例数最大的类作为该结点的类标记,返回 T;
(3)否则,计算 A 中各特征对 D 的信息增益,选择值最大的特征 Ag;
(4)如果 Ag 的信息增益小于阈值 ε ,则置 T 为单结点树,并将 D中实例数最大的类作为标记,返回 T;
(5)否则,对 Ag 的每一可能值 ai,依 Ag=ai 将D分割为若干非空子集 Di,将 Di 中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树 T,返回 T;
(6)对第 i 个子结点,以 Di 为训练集,以 A-{Ag} 为特征集,递归地调用步 (1) ~步 (5),得到子树 Ti ,返回 Ti .
ID3 算法只有树的生成,所以该算法生成的树容易产生过拟合.
C4.5的生成算法
改进:在生成的过程中,用信息增益比来选择特征.
4. 决策树的剪枝
过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树.解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化,简化的过程称为剪枝(pruning). 具体地,剪枝从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型.
- 损失函数
决策树的剪枝往往通过极小化决策树整体的损失函数来实现
设树 T 的叶结点个数为 | T |,t 是树 T 的叶结点,该叶结点有 Nt 个样本点,其中 k 类的样本点有 Ntk 个,Ht(T) 为叶结点 t 上的经验熵,α ≥ 0为参数,则决策树学习的损失函数可以定义为
C
α
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
C_α(T)=\sum^{|T|}_{t=1}N_tH_t(T)+α|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
)
+
α
∣
T
∣
C
(
T
)
=
−
∑
t
=
1
∣
T
∣
∑
k
N
t
k
l
o
g
N
t
k
N
t
C_α(T)=C(T)+\alpha|T|\\C(T)=-\sum^{|T|}_{t=1}\sum_kN_{tk}log\frac{N_{tk}}{N_t}
Cα(T)=C(T)+α∣T∣C(T)=−t=1∑∣T∣k∑NtklogNtNtk
- C(T) 表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,|T| 表示模型复杂度,参数α ≥0控制两者之间的影响.较大的α促使选择较简单的模型(树),较小的α促使选择较复杂的模型(树).α=0意味着只考虑模型与训练数据的拟合程度,不考虑模型的复杂度.
- 剪枝,就是当 α 确定时,选择损失函数最小的模型,即损失函数最小的子树.
- 树的剪枝算法
- 输入:生成算法产生的整个树 T,参数 α;
- 输出:修剪后的子树 Tα
- 步骤:
(1)计算每一个结点的经验熵;
(2)递归地从树的叶结点向上回缩;
设一组叶结点回缩到其父结点之前与之后的整体树分别为 TB 与 TA ,如果TA的损失函数值小于TB,则进行剪枝,即将父结点变为新的叶结点
(3)返回(2),直至不能继续为止;
5. CART算法
分类与回归树(classification and regression tree,CART)模型是应用广泛的决策树学习方法.同样由特征选择、树的生成及剪枝组成,既可以用于分类也可以用于回归.
- CART 是在给定输入随机变量 X 条件下输出随机变量Y 的条件概率分布的学习方法.
- CART 假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支.
- 这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布.
- CART 算法由以下两步组成:
(1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
(2)决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准.
CART生成
决策树的生成就是递归地构建二叉决策树的过程.对回归树用平方误差最小化准则,对分类树用**基尼指数(Gini index)**最小化准则,进行特征选择,生成二叉树.
- 回归树的生成
-
一个回归树对应着输入空间(即特征空间)的一个划分以及在划分的单元上的输出值.假设已将输入空间划分为 M 个单元 R1, R2,…, Rm ,并且在每个单元 Rm 上有一个固定的输出值 cm ,于是回归树模型可表示为
f ( x ) = ∑ m − 1 M c m I ( x ∈ R m ) f(x)=\sum^M_{m-1}c_mI(x\in R_m) f(x)=m−1∑McmI(x∈Rm) -
当输入空间的划分确定时,可以用平方误差来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值.易知,单元 Rm 上的 cm 的最优值 c ^ m \hat c_m c^m 是 Rm 上的所有输入实例 xi 对应的输出 yi 的均值
-
输入空间的划分采用启发式的方法,选择第 j 个变量和它取的值 s ,作为切分变量(splitting variable)和切分点(split-ting point),并定义两个区域 R1 和 R2 分别表示小于 s 和大于 s,然后遍历变量 j ,对固定的切分变量 j 扫描切分点 s ,找到最优切分点 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 ] \underset{j,s}{min}[\underset{c_1}{min}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2+\underset{c_2}{min}\sum_{x_i\in R_2(j,s)}(y_i-c_2)^2] j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2]其中,c1、c2分别表示两个区域的平均值;将R1和R2两个区域的平方误差最小值相加,就表示当前划分的误差,该误差最小,也就是找到了最优解
-
当我们得到所有变量的最优切分点后,再计算每个变量的平方误差,找到最优的切分变量 j,构成一个对(j,s)
-
依次将输入空间划分为两个区域,接着对每个区域重复上述划分过程,直到满足停止条件,生成一棵回归树,通常称为最小二乘回归树(least squaresregression tree)
-
最小二乘回归树的生成算法
-
输入:训练数据集D
-
输出:回归树 f(x)
-
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
(1)选择最优切分变量 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 ] \underset{j,s}{min}[\underset{c_1}{min}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2+\underset{c_2}{min}\sum_{x_i\in R_2(j,s)}(y_i-c_2)^2] j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2](2)用选定的对 ( j, s ) 划分区域并决定相应的输出值
(3)继续对两个子区域调用步骤 (1),(2),直至满足停止条件.
(4)将输入空间划分为 M 个区域 R1, R2,…, Rm ,生成决策树:
f ( x ) = ∑ m − 1 M c m I ( x ∈ R m ) f(x)=\sum^M_{m-1}c_mI(x\in R_m) f(x)=m−1∑McmI(x∈Rm)
-
- 分类树的生成
-
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点.
-
基尼指数:
- 分类问题中,假设有 K 个类,样本点属于第 k 类的概率为 pk ,则概率分布的基尼指数定义为
G i n i ( p ) = ∑ k = 1 k p k ( 1 − p k ) = 1 − ∑ k = 1 k p k 2 Gini(p)=\sum^k_{k=1}p_k(1-p_k)=1-\sum^k_{k=1}p_k^2 Gini(p)=k=1∑kpk(1−pk)=1−k=1∑kpk2
对于二分类问题,若样本点属于第 1 个类的概率是 p ,则概率分布的基尼指数为
G i n i ( p ) = 2 p ( 1 − p ) Gini(p)=2p(1-p) Gini(p)=2p(1−p)-
对于给定的样本集合 D ,其基尼指数为
G i n i ( D ) = 1 − ∑ k = 1 k ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=1-\sum^k_{k=1}(\frac{|C_k|}{|D|})^2 Gini(D)=1−k=1∑k(∣D∣∣Ck∣)2 -
如果样本集合 D 根据特征 A 是否取某一可能值 a 被分割成 D1和 D2 两部分,则在特征 A 的条件下,集合 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 ) Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2) -
基尼指数Gini(D)表示集合 D 的不确定性,基尼指数Gini(D,A )表示经 A=a 分割后集合 D 的不确定性.基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似.
- 分类问题中,假设有 K 个类,样本点属于第 k 类的概率为 pk ,则概率分布的基尼指数定义为
-
CART生成算法
- 输入:训练数据集D,停止计算的条件
- 输出:CART决策树
- 步骤:
(1)设结点的训练数据集为 D ,计算现有特征对该数据集的基尼指数.此时,对每一个特征 A ,对其可能取的每个值 a ,根据样本点对 A = a 的测试为“是”或“否”将 D 分割成 D1和 D2 两部分,计算 A = a 时的基尼指数.
(2)在所有可能的特征 A 以及它们所有可能的切分点 a 中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点.依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去.
(3)对两个子结点递归地调用(1),(2),直至满足停止条件.
(4)生成 CART 决策树.
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征.
CART剪枝
(详细过程可参考:https://www.bilibili.com/video/BV1No4y1o7ac?p=58&vd_source=d57b2df928037367dfb7f5027819b5ec&t=1.4 )
CART 剪枝算法从“完全生长”的决策树的底端剪去一些子树,使决策树变小(模型变简单),从而能够对未知数据有更准确的预测.
CART 剪枝算法由两步组成:
- 首先从生成算法产生的决策树T0 底端开始不断剪枝,直到T0 的根结点,形成一个子树序列 {T0,T1,…,Tn} ;
- 然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树.
- 剪枝,形成一个子树序列
-
在剪枝过程中,计算子树的损失函数:
C α ( T ) = C ( T ) + α ∣ T ∣ C_α(T)=C(T)+\alpha|T| Cα(T)=C(T)+α∣T∣- 其中,T 为任意子树,C(T) 为对训练数据的预测误差(如基尼指数),|T| 为子树的叶结点个数,α≥0 为参数,权衡训练数据的拟合程度与模型的复杂度.
- α越小,强调的是模型的拟合程度,等于0表示一颗完整的树(未进行剪枝);α越大,强调的是泛化能力,无穷大时表示一颗单结点树
-
剪枝的条件:
-
剪枝前的损失函数
C α ( T t ) = C ( T t ) + α ∣ T t ∣ C_α(T_t)=C(T_t)+\alpha|T_t| Cα(Tt)=C(Tt)+α∣Tt∣ -
剪枝后的损失函数
C α ( t ) = C ( t ) + α C_\alpha(t)=C(t)+\alpha Cα(t)=C(t)+α -
α趋于0,树越复杂,误差越小,因此剪枝前误差小于剪枝后(注重拟合,在训练集上损失比较小)
-
当α增大时,存在剪枝前后损失函数值相等,此时 t 的结点少,因此 t 比 Tt 更可取,对 Tt 进行剪枝
α = C ( t ) − C ( T t ) ∣ T t ∣ − 1 α=\frac{C(t)-C(T_t)}{|T_t|-1} α=∣Tt∣−1C(t)−C(Tt)
-
- 在剪枝得到的子树序列 {T0,T1,…,Tn} 中通过交叉验证选取最优子树Tα
具体地,利用独立的验证数据集,测试子树序列 {T0,T1,…,Tn} **** 中各棵子树的平方误差或基尼指数.平方误差或基尼指数最小的决策树被认为是最优的决策树.在子树序列中,每棵子树 T0,T1,…,Tn 都对应于一个参数 α . 所以,当最优子树Tk 确定时,对应的αk 也确定了,即得到最优决策树Tα .