在信息论中,熵用来表示随机变量不确定性的度量,其定义为
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倾向于选取取值较多的特征。因为信息增益反映的是给定条件后不确定性减少的程度,特征取值越多就意味着确定性更高,也就是条件熵越小,信息增益越大。
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 α促使选择较复杂的模型。
决策树的剪枝算法如下:
分类问题中,假设有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生成算法如下:
从整体 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剪枝算法总结如下: