Measure
熵
- 随机变量X的熵定位为 H ( X ) = H ( p ) = − ∑ i = 1 n p i log p i H(X) = H(p) = -\sum_{i=1}^{n}p_i\log{p_i} H(X)=H(p)=−∑i=1npilogpi. 熵只依赖于X的分布,与X的取值无关。熵用来表示随机变量不确定性的度量
- 当X只有两种取值时,
H
(
p
)
=
−
p
log
2
p
−
(
1
−
p
)
log
2
(
1
−
p
)
H(p) = -p\log_2{p}-(1-p)\log_2(1-p)
H(p)=−plog2p−(1−p)log2(1−p). 当p=0或者p=1时
H
(
p
)
=
0
H(p)=0
H(p)=0,X完全没有不确定性;当
p
=
0.5
p=0.5
p=0.5时,
H
(
p
)
=
1
H(p)=1
H(p)=1,熵取值最大,随机变量不确定性最大
条件熵
- 随机变量 ( X , Y ) (X,Y) (X,Y),其联合分布为 P ( X = x i , Y = y i ) = p i j , i = 1 , 2 , … , n , j = 1 , 2 , … , m P(X=x_i, Y=y_i)=p_{ij}, i=1,2,\ldots,n, j=1,2,\ldots,m P(X=xi,Y=yi)=pij,i=1,2,…,n,j=1,2,…,m. 条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)表示在已知随机变量 Y Y Y的不确定性,公式为 H ( Y ∣ X ) = − ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X) = -\sum_{i=1}^{n}p_iH(Y|X=x_i) H(Y∣X)=−∑i=1npiH(Y∣X=xi)
- 当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所得到的熵和条件熵分别称为经验熵和经验条件熵
信息增益
- 定义:特征A对训练数据集D的信息增益 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是discriminative feature,那么
H
(
D
∣
A
)
H(D|A)
H(D∣A)会非常小。原因在于A等于某个值的时候D处于同一类的概率很大(A是discriminative feature),
H
(
D
∣
A
)
H(D|A)
H(D∣A)会非常小(变量越稳定类别越集中,条件熵
H
(
D
∣
A
)
H(D|A)
H(D∣A)就越小),导致
g
(
D
,
A
)
g(D, A)
g(D,A)会非常大。这种情况下,A应该被选中。
信息增益比
- why:以信息增益作为划分训练数据集的特征时,偏向于选择值较多的特征。(当特征A值很多的时候,某个值下包含的样本越少属于同一类的概率越高,条件熵 H ( D ∣ A ) H(D|A) H(D∣A)就越少,因此偏向于选择值较多的特征)
- 定义: g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A)=\frac{g(D, A)}{H_A(D)} gR(D,A)=HA(D)g(D,A),其中 H A ( D ) H_A(D) HA(D)为特征A的熵。
- 特点: H A ( D ) H_A(D) HA(D)作为惩罚项,一般而言对于特征取值越多的特征惩罚越大。若特征A有两种取值,样本数比例为1:9,则熵约为0.32;但是当特征A有5种取值,比例1:1:1:1:9的时候,熵约为1.04。显然倾向于选择前者。
决策树生成
ID3算法
- 根据信息增益选择特征,递归构建决策树
- 只有树的生成,容易过拟合
C4.5算法
- 与ID3类似,使用信息赠一比选择特征
决策树的剪枝
- why:只生成不剪枝,对训练集的拟合会很强,非常容易过拟合
根据loss进行剪枝
- 损失函数定义为 C α ( T ) = ∑ t = 1 ∣ T ∣ = N i H i ( T ) + α ∣ T ∣ C_\alpha(T)=\sum_{t=1}^{|T|}=N_iH_i(T)+\alpha|T| Cα(T)=∑t=1∣T∣=NiHi(T)+α∣T∣,其中T为叶结点数目, H i T H_i{T} HiT为结点T的经验熵, N i N_i Ni为 T i T_i Ti含有的样本数。显然,第二项为正则项,惩罚决策树的复杂度。
- 在一组叶子结点的每个叶子分别开始,如果剪枝后loss更小则进行剪枝,递归进行,直到剪枝后loss更大则不剪枝。
CART算法
1)CART回归树
- 回归树模型为以下公式。假设特征空间已经划分为M个单元
R
1
,
.
.
.
,
R
m
R_1,...,R_m
R1,...,Rm,并且每个单元固定输出
c
m
c_m
cm
f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) ( 1 ) f(x)=\sum_{m=1}^Mc_mI(x\in R_m)\ \ \ \ \ \ \ \ \ \ \ (1) f(x)=m=1∑McmI(x∈Rm) (1)
其中 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) - 回归树的生成
- 选择最优切分特征
j
j
j和切分点
s
s
s,求解
min j , s [ min c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min c 1 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] ( 2 ) \min_{j,s}[\min_{c1}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2+\min_{c1}\sum_{x_i\in R_2(j,s)}(y_i-c_2)^2]\ \ \ \ \ \ \ \ \ \ \ (2) j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c1minxi∈R2(j,s)∑(yi−c2)2] (2)
求解过程为遍历特征j,对固定切分特征j扫描切分点,最小化公式(2)。对于c1与c2的优化,直接令
c ^ m = a v e ( y i ∣ x i ∈ R m ) , m = 1 , 2 ( 3 ) \hat{c}_m=ave(y_i|x_i\in R_m), m=1,2\ \ \ \ \ \ \ \ \ \ \ (3) c^m=ave(yi∣xi∈Rm),m=1,2 (3)
说人话,就是先遍历特征 j j j的各种切分阈值 s s s,然后计算s划分后两个子集里边的平方误差,怎么计算呢?两个子集里边的c1和c2直接选取子集的y均值,然后计算误差。说简单点,对于每个阈值,根据阈值划分成两个子集,分别计算两个子集里边的y的方差,加起来就是这个阈值的损失值。最后对于特征j选择损失值最小的分割阈值,然后再针对特征选择最佳的特征。 - 根据1中选定的特征以及阈值 ( j , s ) (j,s) (j,s)划分成左右两颗子树,然后分别递归左右子树,直至达到停止条件
2)分类树
- gini指数: 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=1Kpk(1−pk)=1−∑k=1Kpk2,其中K是类别总数。
- 假如集合D根据特征A是否取某一可能值
a
a
a被划分为
D
1
D_1
D1和
D
2
D_2
D2,则在集合D关于特征A的基尼指数为
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{D1}{D}Gini(D1)+\frac{D2}{D}Gini(D2) Gini(D,A)=DD1Gini(D1)+DD2Gini(D2) - Gini指数越大,集合D的不确定性越大,这一点与熵类似
- CART分类树生成:
- 对于训练集合D,计算现有特征对于每个可能取值a的基尼指数
- 选择Gini指数最小的特征以及对应的取值a,从现有结点分成左右两颗子树
- 对于左右两个子树递归调用1. 2.,直到满足停止条件
3)CART剪枝(属于后剪枝,预剪枝是指那些停止条件,停止条件使树不会生长地太过分)
- 剪枝的时候,计算子树的损失函数
C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T) = C(T) + \alpha|T| Cα(T)=C(T)+α∣T∣ - 对于子树
T
0
T_0
T0的任意内部节点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∣
以t为单节点的树的损失函数为 C α ( t ) = C ( t ) + α ∣ t ∣ = C ( t ) + α C_\alpha(t) = C(t) + \alpha|t|=C(t) + \alpha Cα(t)=C(t)+α∣t∣=C(t)+α
显然, C ( t ) > C ( T t ) C(t)>C(T_t) C(t)>C(Tt)(单节点直接以多数类预测,误差比子树大)。因此,当 α \alpha α为0以及足够小的时候, C α ( T t ) < C α ( t ) C_\alpha(T_t)<C_\alpha(t) Cα(Tt)<Cα(t)。但是,当 α \alpha α增大到一定值时有 C α ( T t ) = C α ( t ) C_\alpha(T_t)=C_\alpha(t) Cα(Tt)=Cα(t)。然后 α \alpha α再增大时,就会出现 C α ( T t ) > C α ( t ) C_\alpha(T_t)>C_\alpha(t) Cα(Tt)>Cα(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),使得当
α
=
g
(
t
)
\alpha=g(t)
α=g(t)时,有
C
α
(
T
t
)
=
C
α
(
t
)
C_\alpha(T_t)=C_\alpha(t)
Cα(Tt)=Cα(t)。其中
g
(
t
)
g(t)
g(t)称为误差增益率。一个内部节点t进行剪枝以后,预测的误差必然增大,误差除以
∣
T
t
∣
−
1
|T_t|-1
∣Tt∣−1就是一个误差增益率。当选择最小的g(t)作为
α
\alpha
α时,只有一个节点t剪枝后的损失函数
C
α
(
T
t
)
C_\alpha(T_t)
Cα(Tt)是降低的,其他节点剪枝后在g(t)作为
α
\alpha
α时剪枝后都是损失函数上升的。从最优化的角度在在该g(t)作为
α
\alpha
α时只能对节点t进行剪枝,生成了树
T
1
T_1
T1。然后随着
α
\alpha
α增大,不断有节点被剪掉,直到树
T
k
T_k
Tk是一个根节点以及两个叶节点组成的树。因此
T
k
+
1
T_k+1
Tk+1由
T
k
T_k
Tk剪枝得来。
对于上图而言,当 α = g ( t 1 ) \alpha=g(t_1) α=g(t1)的时候, t 1 t_1 t1剪枝后损失函数不变,而 t 2 t_2 t2剪枝后损失函数变大,显然应该选择 t 1 t_1 t1进行剪枝。图参考: 图参考链接 - CART剪枝流程:
- 令 T = T 0 T = T_0 T=T0, T 0 T_0 T0为CART生成的决策树
- 对树 T T T自上而下对各内部节点t进行计算 C ( T t ) C(T_t) C(Tt), C ( t ) C(t) C(t), g ( t ) g(t) g(t)。选择最小的 g ( t ) g(t) g(t)的内部节点t进行剪枝,得到树 T k T_k Tk。
- 令 k = k + 1 k=k+1 k=k+1, T = T k T=T_k T=Tk
- 如果树 T k T_k Tk不是一个根节点以及两个叶节点组成的树,则返回2.
- 采用交叉验证在独立的验证集上(并不是k-folds交叉验证,只训练一次,只验证一次),在子树 T 0 , T 1 , . . . , T n T_0,T1,...,T_n T0,T1,...,Tn上选择最优子树 T α T_\alpha Tα
- 注意: T k + 1 T_k+1 Tk+1由 T k T_k Tk剪枝得来。
- CART剪枝与前边的介绍的剪枝算法不一样,前边介绍的剪枝算法剪枝时权重 α \alpha α是固定的,而CART剪枝的 α \alpha α是动态的。