前言
决策树模型呈树状结构,表示基于特征对实例进行分类的过程。可以从以下两个角度理解决策树模型:(1)可以把决策树看成是if-then规则的集合,其中实例中的每个特征是判断的条件。(2)可以把决策树看成是定义在特征空间与类空间的条件概率分布(给定特征的情况下类别的条件概率分布)。决策树包含以下三个内容:特征选择、决策树的生成与决策树的修剪。
决策树模型与学习
决策树模型
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部结点和叶结点。内部结点表示一个特征或属性,叶结点表示一个类。 内部结点就是属性结构的根节点与子节点,叶节点就是属性结构的最后一层也就是表示输出结果(实例的类别)。具体结构如下图:
从决策树的结构我们会提出以下两个问题:(1).特征如何选择(确定内部结点)。(2).有向边如何选择。(3).如何终止分类进而得到分类结果。
决策树的学习(生成)与剪枝
决策树的学习过程:
- 构建根节点,将所有训练数据放到根节点。
- 选择一个最优特征(特征的选择),按照这一特征将训练数据集分割成子集(将子集分割到类别中),使得各个子集有一个在当前条件下最好的分类。
- 如果这些子集已经能够被基本正确分类,那么构建叶节点(最后的类别),并将这些子集分到所对应的叶节点中去。
- 如果还有些子集不能够被基本分类,那么就对这些子集选择新的最优特征(回到步骤1),继续对其进行分割,构建相应的结点。
不断进行以上过程进行分类直到所有的实例都能够基本正确的分类或者没有合适的特征,最后每个子集都被分到叶节点上。
通过以上过程可能对训练实例能够很好的分类,但是对未知数据不一定有很好的分类能力,既可能发生过拟合的现象。我们需要对已生成的树自下而上进行剪枝,将树变得更简单,从而使它具有更好的泛化能力。具体地,就是去掉过于细分的叶结点,使其 回退到父结点,甚至更高的结点,然后将父结点或更高的结点改为新的叶结点。
决策树的学习过程
特征选择
特征选择的目的是选择对类别有分类能力的特征以构成内部结点,如果一个特征进行分类的结果和随机结果没有区别那么这个特征就是没有分类能力,经验上对其这样的特征对分类结果影响不大。实践中用信息增益和信息增益比来衡量某一特征是否具有分类能力。
信息论中使用自信息来衡量数据所含信息大大小。
自信息的定义:
I
(
m
)
=
−
l
o
g
2
m
I(m)=-log_2m
I(m)=−log2m熵的定义为自信息的期望:
H
(
p
)
=
E
x
∼
p
(
I
)
=
−
∑
i
=
1
p
i
l
o
g
(
p
i
)
H(p)=E_{x \sim p} (I)=-\sum_{i=1}p_i log(p_i)
H(p)=Ex∼p(I)=−i=1∑pilog(pi)
条件概率的熵的定义:
H
(
Y
∣
X
)
=
∑
i
=
1
n
p
i
H
(
Y
∣
X
i
=
x
i
)
H(Y|X)=\sum_{i=1}^n p_iH(Y|X_i=x_i)
H(Y∣X)=i=1∑npiH(Y∣Xi=xi)其中
p
i
=
P
(
X
=
x
i
)
,
x
=
1
,
2
,
3
,
.
.
.
,
n
p_i=P(X=x_i),x=1,2,3,...,n
pi=P(X=xi),x=1,2,3,...,n
特征A对训练数据集D的信息增益
g
(
D
,
A
)
g(D,A)
g(D,A),定义为集合
D
D
Dd的经验熵
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
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)信息增益如果比较小说明在
A
A
A的条件下
D
D
D的熵值几乎不小,即
A
A
A对
D
D
D几乎没有影响。这样的特征对结果几乎没有贡献应该被丢弃。反之信息增益很大说明特征
A
A
A具有更强的分类能力。特征选择的方法是:对训练数据集
D
D
D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征为接下来的内部结点。
对于离散数据算法如下:
设训练数据集为
D
D
D,
∣
D
∣
|D|
∣D∣表示其样本容量,即样本个数。设有
K
K
K个类
C
k
,
k
=
1
,
2
,
.
.
.
,
K
,
∣
C
k
∣
C_k,k=1,2,...,K,|C_k|
Ck,k=1,2,...,K,∣Ck∣为属于类
∣
C
k
∣
|C_k|
∣Ck∣的样本个数,
∑
k
=
1
K
∣
C
k
∣
=
∣
D
∣
\sum_{k=1}^K |C_k|=|D|
∑k=1K∣Ck∣=∣D∣。特征
A
A
A有
n
n
n个不同的取值
a
1
,
a
2
,
.
.
.
,
a
n
{a_1,a_2,...,a_n}
a1,a2,...,an,根据特征
A
A
A的取值将
D
D
D划分为
n
n
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的样本个数,
∑
i
=
1
n
∣
D
i
∣
=
∣
D
∣
\sum_{i=1}^n |D_i|=|D|
∑i=1n∣Di∣=∣D∣。记子集
∣
D
i
∣
|D_i|
∣Di∣中属于类
C
k
C_k
Ck的样本的合集为
D
i
k
D_{ik}
Dik,即
D
i
k
=
D
i
⋂
C
k
D_{ik}=D_i \bigcap C_k
Dik=Di⋂Ck,
∣
D
i
k
∣
|D_{ik}|
∣Dik∣为
D
i
k
D_{ik}
Dik的样本数量
。求信息增益算法如下:
- 计算数据集 D D 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 \frac{|C_k|}{|D|}log_2 \frac{|C_k|}{|D|} H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
- 计算特征 A A A对数据集 D D D的经验条件熵 H ( D ∣ A ) H(D|A) H(D∣A) H ( D ∣ A ) = ∑ 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 ∣ H(D|A)=\sum_{i=1}^n \frac{|D_i|}{|D|}H(D_i)=- \sum_{i=1}^n \frac{|D_i|}{|D|}\sum_{k=1}^K\frac{|D_{ik}|}{|D_i|}log_2\frac{|D_{ik}|}{|D_i|} H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
- 计算信息增益 g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
通过以上过程计算出所有特征的信息增益,然后选择最大的作为决策树的根节点。
信息增益没有绝对的意义。在分类问题困难时, 也就是说在训练数据集的经验熵大的时候,信息增益值会偏大。反之,信息增益值会偏小。 使用信息增益比可以对这一问题进行校正。这是特征选择的另一准则。 特征
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的经验熵
H
(
D
)
H(D)
H(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)
决策树的生成
ID3算法
ID3算法以信息增益作为特征选择的衡量方法,具体的方法是:
- 若 D D D中所有实例属于同属于同一个类别 C k C_k Ck,则 T T T为单节点树,并将类 C k C_k Ck作为该结点的类标记。
- 若 A = Ø A=Ø A=Ø,则 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck作为该结点的类标记
- 否则计算所有特征的信息增益,得到产生最大信息增益的特征 A g A_g Ag
- 如果 A g A_g Ag小于某一个阈值 ϵ \epsilon ϵ时,则置 T T T为单结点树,并将 D D D中实例数最大的类 C k C_k Ck 作为该结点的类标记
- 将节点上的实例划分到特征 A g A_g Ag不同取值的有向边上,将 D D D分割为若干的非空子集 D i D_i Di,将 D i D_i Di作为子节点。
- 将 D i D_i Di作为训练实例 D D D,以 A − A g A-A_g A−Ag为特征集合,递归的进行以上过程。
C4.5算法
与ID3算法区别为采用信息增益比作为特征选择的衡量方法。
决策树的剪枝
设树
T
T
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
,
.
.
.
,
K
k=1,2,...,K
k=1,2,...,K,
H
t
(
T
)
H_t(T)
Ht(T)为叶结点
t
t
t上的经验熵,
a
≥
0
a \geq 0
a≥0为参数,则决策树的损失函数定义:
C
a
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
a
∣
T
∣
C_a(T)=\sum_{t=1}^{|T|} N_tH_t(T)+a|T|
Ca(T)=t=1∑∣T∣NtHt(T)+a∣T∣其中
H
t
(
T
)
=
−
∑
k
N
t
k
N
t
log
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
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
=
−
∑
t
=
1
∣
T
∣
∑
k
=
1
K
N
t
k
log
N
t
k
N
t
C(T)=\sum_{t=1}^{|T|}N_tH_t(T)=-\sum_{t=1}^{|T|} \sum_{k=1}^{K}N_{tk} \log \frac{N_{tk}}{N_t}
C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk这是有
C
a
(
T
)
=
C
(
T
)
+
a
∣
T
∣
C_a(T)=C(T)+a|T|
Ca(T)=C(T)+a∣T∣从以上损失函数可以得到
C
(
T
)
C(T)
C(T)表示模型对训练样本的预测误差(熵值越小数据对模型来说不确定性越低,误差也就越低)。
∣
T
∣
|T|
∣T∣表示叶结点的数量,很显然
∣
T
∣
|T|
∣T∣越小说明叶结点的规模也就越小,模型的泛化能力也就越强,这是一个正则项,
a
a
a是一个超参数。
剪枝过程的算法如下:
- 计算每个叶结点的经验熵,并求出 C ( T ) C(T) C(T)
- 递归地从树的叶结点向上回缩。设一组叶结点回缩到其父节点之前与之后的整体分别为 T B T_B TB与 T A T_A TA,其对应的损失函数值分别是 C a ( T B ) C_a(T_B) Ca(TB)与 C a ( T A ) C_a(T_A) Ca(TA),如果 C a ( T A ) ≤ C a ( T B ) C_a(T_A) \leq C_a(T_B) Ca(TA)≤Ca(TB)(剪枝之后损失函数变小了最小化的过程)则进行剪枝,即将父节点变为新的叶结点。
- 进行以上过程知道损失函数不能减小为止。
CART算法
CART是分类与回归树,顾名思义该算法既可用于分类也可以用于回归,同时它也包括特征的选择、树的生成以及树的剪枝三个过程。CART假设决策树为二叉树,内部结点的特征取值为"是"和"否",对连续特征与特征多取值的特征空间处理为切分特征与切分点。
回归问题
决策树用于回归问题时实际上就是通过决策树的过程将输入空间分割若干( M M M)个单元( R 1 , R 2 , . . . , R M R_1,R_2,...,R_M R1,R2,...,RM),并且每个单元( R m R_m Rm)输出固定的值( c m c_m cm),这个值就是落在这个单元中的实例的输出值,回归树模型可表示为: f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x)=\sum_{m=1}^Mc_mI(x \in R_m ) f(x)=m=1∑McmI(x∈Rm)用平方误差 ∑ x i ∈ R m ( y i − f ( x i ) ) 2 \sum_{x_i \in R_m}(y_i-f(x_i))^2 ∑xi∈Rm(yi−f(xi))2,来表示回归树对于训练数据集的预测误差,这个值越小表明预测的越准确,易知,单元 R m R_m Rm上的 c m c_m cm的最优值 c ^ m \hat{c}_m c^m是 R m R_m Rm上的所有输入实例对应的输出的均值(确定了单元的取值( 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) c^m=ave(yi∣xi∈Rm)以上确定了两个内容:(1).确定了衡量单元(分割区域)的效果的度量—平法误差。(2).确定了分割区域所有对应的输出值—均值。(连续变量是区域内所有实例输出值的均值,离散变量是区域内所有实例对应类别的多数表决)。根据这两个内容就可以寻找最优切分特征以及最优切分点了。选择第 j j j个变量 x ( j ) x^{(j)} x(j)和它取的值 s s s作为切分变量和切分点,根据这个切分点把实例分为两个区域定义如下: R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } 和 R 2 ( j , s ) = { x ∣ x ( j ) > s } R_1(j,s)=\lbrace x|x^{(j)} \leq s \rbrace 和R_2(j,s)=\lbrace x|x^{(j)}>s \rbrace R1(j,s)={x∣x(j)≤s}和R2(j,s)={x∣x(j)>s}根据下式求得最优切分点 s s s min j , s [ min c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] \min_{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(j,s)}(y_i-c_2)^2] j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2]通过上式就能求得任意切分变量 j j j的的最优切分点 s s s,便利所有的变量就能够找到最优切分变量与最优切分点记作 ( j , s ) (j,s) (j,s)。通过 ( j , s ) (j,s) (j,s)分割为两个子区域,再对每一个子区域进行以上操作,就可以得到一个一颗回归树了。
分类问题
分类问题中假设有 K K K个类,样本点属于第 k k k类的概率为 p k p_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=1}^K p_k(1-p_k)=1-\sum_{k=1}^K p_k^2 Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2如果样本集合 D D D根据特征 A A A是否取其一可能值 a 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=\lbrace (x,y) \in D |A(x)=a \rbrace , D_2=D-D_1 D1={(x,y)∈D∣A(x)=a},D2=D−D1则在特征 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 ) 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)基尼指数 G i n i ( D ) Gini(D) Gini(D)表示集合 D D D的不确定性,基尼指数 G i n i ( D , A ) Gini(D,A) Gini(D,A)表示经 A = a A=a A=a分割后集合 D D D的不确定性。基尼指数数值越大,样本集合的不确定性也就越大,这一点与熵相似。分类算法如下:
- 设节点的训练数据集为 D D D,计算现有特征对该数据集的基尼指数。此时,对每一个特征 A A A,对其可能取的每个值 a a a,根据样本点对 A = a A=a A=a的测试为"是"或"否"将 D D D分割成 D 1 D_1 D1和 D 2 D_2 D2两部分,并计算 A = a A=a A=a时的基尼指数。
- 在所有可能的特征 A A A以及它们所有可能切分点 a a a中,选择基尼系数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
- 对两个子结点递归的进行以上操作,直至满足停止条件。
CART剪枝
剪枝算法从生成的决策树的底端剪去一些子树,使决策树变小(模型变得简单),从而能够对未知数据有更准确的预测。剪枝共分为两步:
- 首先从生成算法产生的决策树 T 0 T_0 T0底端开始不断剪枝,直到 T 0 T_0 T0的根节点,形成一个子树序列{T_0,T_1,…,T_n}
- 通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树
剪枝过程所使用的损失函数如下: C a ( T ) = C ( T ) = a ∣ T ∣ C_a(T)=C(T)=a|T| Ca(T)=C(T)=a∣T∣ 其中, T T T为任意子树,C(T)为训练数据集的预测误差(如基尼系数、平方误差等), ∣ T ∣ |T| ∣T∣为子树的叶结点个数, a a a为参数。
具体地,从整体树
T
0
T_0
T0开始剪枝。对
T
0
T_0
T0的任意内部结点
t
t
t,以
t
t
t为单结点树的损失函数是
C
a
(
t
)
=
C
(
t
)
+
a
C_a(t)=C(t)+a
Ca(t)=C(t)+a以
t
t
t为根结点的子树
T
t
T_t
Tt的损失函数是
C
a
(
T
t
)
=
C
(
T
t
)
+
a
∣
T
t
∣
C_a(T_t)=C(T_t)+a|T_t|
Ca(Tt)=C(Tt)+a∣Tt∣
定义
g
(
t
)
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}
g(t)=∣Tt∣−1C(t)−C(Tt)它表示剪枝后损失函数见效的程度。算法如下
- 设 k = 0 k=0 k=0, T = T 0 T=T_0 T=T0
- 设 a = + ∞ a=+ \infty a=+∞
- 自下而上对内部结点 t t t计算C(T_t),|T_t|以及 g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} g(t)=∣Tt∣−1C(t)−C(Tt) a = m i n ( a , g ( t ) ) a=min(a,g(t)) a=min(a,g(t))这里, T t T_t Tt表示以 t t t为结点的子树, C ( T t ) C(T_t) C(Tt)是对训练数据的预测误差, ∣ T t ∣ |T_t| ∣Tt∣是 T t T_t Tt的叶结点个数。
- 自上而下地访问内部结点 t t t,如果有 g ( t ) = a g(t)=a g(t)=a,进行剪枝,并对叶结点 t t t以多数表决法决定其类,得到树 T T T。
- 设 k = k + 1 k=k+1 k=k+1, a k = a a_k=a ak=a, T k = T T_k=T Tk=T。
- 如果 T T T不是有根结点单独构成的树,则回到步骤(3)。
- 采用交叉验证法在子树序列 T 0 , T 1 , . . . , T n T_0,T_1,...,T_n T0,T1,...,Tn中选取最优子树 T a T_a Ta。