决策树是一种符合人类直观感觉的模型,比如有一棵决策树如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190222193640887.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hlbWszNDAyMDA2MDA=,size_16,color_FFFFFF,t_70)
上图是某女青年在决定相亲对象是时会进行的一系列决策过程。首先看对方的年龄,如果大于30岁,直接pass,如果小于等于30岁,就再看对方长得如何,长得丑,就不见,长的好看的,再继续看它的收入……以此类推,最终可以得到一颗决策树。而任何一个样本(男性)在这棵树上走一遍之后,都能够输出“见”或者“不见”的结果。那其实这就是一个分类的过程了。我们首先通过大量样本,训练出这颗决策树,先不管它分类的准确率,之后其他的样本都能通过这棵树找到自己对应的类别/结果(在这里就是见面或者不见面)。
而决策树模型的重点是,我们喂给计算机的数据,为什么它就可以得到上面那棵决策树?为什么要以年龄作为分割的根节点?要什么要以长相为左子树的根节点?也就是说,我们需要需要进行 特征选择,从而决定用哪个特征划分特征空间。
信息熵
在信息论中,熵用来表示随机变量不确定性的度量,其定义为
H
(
X
)
=
−
∑
i
=
1
n
p
i
log
p
i
H(X)=-\sum_{i=1}^np_i\log p_i
H(X)=−i=1∑npilogpi
熵越大,随机变量的不确定性就越大。那么构造一颗决策树,就是为了让决策树的叶子节点的熵降低直到为0,也就是说所有叶子节点的分类都是明确的,它的信息没有任何不确定性,这时我们就完成了决策树的构建。
条件熵
假设有随机变量X,Y,定义条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性,其定义如下:
H
(
Y
∣
X
)
=
∑
i
=
1
n
p
i
H
(
Y
∣
X
=
x
i
)
H(Y|X)=\sum_{i=1}^np_iH(Y|X=x_i)
H(Y∣X)=i=1∑npiH(Y∣X=xi)
如果熵和条件熵的概率 由数据估计(极大似然估计)得到,所对应的熵和条件熵称为经验熵和经验条件熵。
信息增益
信息增益表示得知特征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对训练集D的信息增益比
g
r
(
D
,
A
)
g_r(D,A)
gr(D,A)为其信息增益与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算法的核心是使用信息增益准则来选取特征,递归地构建决策树,直至所有特征的信息增益均很小或者没有特征为止。
该算法生成的树容易产生过拟合的现象,ID3倾向于选取取值较多的特征。因为信息增益反映的是给定条件后不确定性减少的程度,特征取值越多就意味着确定性更高,也就是条件熵越小,信息增益越大。
C4.5算法
C4.5算法同ID3算法类似,只不过在计算过程中采用信息增益比来选择特征而不是信息增益。通过引入信息增益比,一定程度上对取值比较多的特征进行惩罚,避免出现过拟合的特性,提升决策树的泛化能力。
决策树的剪枝
由于ID3和C4.5算法每次都生成整棵树,虽然能够对训练数据的分类达到很好的效果,但对未知的测试数据进行分类却没有那么好的效果,出现过拟合的现象。解决这个问题的方法是考虑决策树的复杂度,对已生成的决策树进行简化,即剪枝。
设决策树T的叶节点个数为|T|,t是树T的叶节点,该叶节点有
N
t
N_t
Nt个样本点,其中k类的样本点有
N
t
k
N_{tk}
Ntk个,
H
t
(
T
)
H_t(T)
Ht(T)为叶节点t上的经验熵,
α
≥
0
\alpha \ge 0
α≥0为参数,定义决策树的损失函数如下:
C
a
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
C_a(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha |T|
Ca(T)=t=1∑∣T∣NtHt(T)+α∣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}^KN_{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
)
+
α
∣
T
∣
C_a(T)=C(T)+\alpha |T|
Ca(T)=C(T)+α∣T∣
其中C(T)表示模型对训练数据的预测误差,|T|表示模型复杂度。较大的
α
\alpha
α促使选择较简单的模型,较小的
α
\alpha
α促使选择较复杂的模型。
决策树的剪枝算法如下:
- 计算每个节点的经验熵
- 判断一组叶节点缩回其父节点前后整棵树的损失函数值 C a ( T A ) , C a ( T B ) C_a(T_A),C_a(T_B) Ca(TA),Ca(TB),如果缩回之后的损失函数值反而更小,则进行剪枝,将父节点变为新的叶节点。
- 重复2直至不能继续为止。
最小二乘回归树
- 选择最优切分变量j和切分点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}\left[\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\right] j,smin⎣⎡c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2⎦⎤
遍历变量j,对固定的切分变量j扫描切分点s,选择使上式达到最小值的对(j,s) - 用选定的对(j,s)划分成两个区域并决定相应的输出值为区域内的样本均值。
- 继续对两个子区域调用步骤1和2,直至满足停止条件。
- 将输入空间划分为M个区域 R 1 , R 2 , . . . , R M R_1,R_2,...,R_M R1,R2,...,RM,生成决策树。
基尼指数
分类问题中,假设有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}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于给定的样本集合D,
C
k
C_k
Ck表示D中属于第k类的样本子集,其基尼指数为
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
Gini(D)=1-\sum_{k=1}^K\left(\frac{|C_k|}{|D|}\right)^2
Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
集合D根据特征A是否取某一可能值被分割成
D
1
D_1
D1和
D
2
D_2
D2两部分,则在此条件下,集合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的不确定性。基尼指数越大,样本集合的不确定性也就越大。
CART决策树
CART生成算法如下:
- 针对每个特征A的每个可能取值a,将训练数据集D分割成 D 1 D_1 D1和 D 2 D_2 D2两部分,计算此时的基尼指数。
- 选择基尼指数最小的特征及其对应的切分点作为最优特征和最优切分点,将结合切分出两个子节点。
- 对两个子节点递归调用1和2操作,直至满足停止条件(节点中的样本个数小于预定阈值/样本集的基尼指数小于预定阈值/没有更多特征)。
- 生成CART决策树。
CART剪枝
从整体
T
0
T_0
T0开始剪枝,对于
T
0
T_0
T0的任意内部节点t,以t为单节点树的损失函数是
C
a
(
t
)
=
C
(
t
)
+
a
C_a(t)=C(t)+a
Ca(t)=C(t)+a
以t为根节点的子树
T
t
T_t
Tt的损失函数是
C
a
(
T
t
)
=
C
(
T
t
)
+
α
∣
T
t
∣
C_a(T_t)=C(T_t)+\alpha |T_t|
Ca(Tt)=C(Tt)+α∣Tt∣
当
α
\alpha
α=0或者充分小时,有
C
a
(
T
t
)
<
C
a
(
t
)
C_a(T_t) \lt C_a(t)
Ca(Tt)<Ca(t)
a增大时,在某一a时,有
C
a
(
T
t
)
=
C
a
(
t
)
C_a(T_t) = C_a(t)
Ca(Tt)=Ca(t)
此时
α
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
\alpha=\frac{C(t)-C(T_t)}{|T_t|-1}
α=∣Tt∣−1C(t)−C(Tt),它们的损失函数值相同,并且t的节点更少,因此我们对
T
t
T_t
Tt进行剪枝。由此可以引出CART剪枝算法。
CART剪枝算法总结如下:
- 令k=0, T = T 0 T=T_0 T=T0, α = + ∞ \alpha=+ \infty α=+∞
- 自下而上对各内部结点t计算
C
(
T
t
)
C(T_t)
C(Tt),
∣
T
t
∣
|T_t|
∣Tt∣,以及
g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 α = min ( α , g ( t ) ) g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} \\ \alpha=\min(\alpha,g(t)) g(t)=∣Tt∣−1C(t)−C(Tt)α=min(α,g(t)) - 自上而下访问内部结点t,如果有 g ( t ) = a g(t)=a g(t)=a,则进行剪枝,并对叶节点t以多数表决法决定其分类,得到树T。
- 设k=k+1, a k = a a_k=a ak=a, T k = T T_k=T Tk=T
- 如果T不是由根节点单独构成的树,则回到步骤2.
- 采用交叉验证法在子树序列 T 0 , T 1 , . . . , T n T_0,T_1,...,T_n T0,T1,...,Tn中选取最优子树 T α T_\alpha Tα