在开始介绍决策树的基本算法之前,首先要了解一下决策树算法中的所使用到的损失函数。
几乎所有的决策树算法的思想都是一样的:不断地对数据集进行划分,而决定如何划分的标准是使得数据的“不确定性”减小的越多越好,就意味着该划分能够获得越多信息。接下来介绍一下常用的两种度量标准:
1.信息熵
公式: H ( y ) = − ∑ k = 1 K p k l o g p k H\left ( y \right )=-\sum_{k=1}^{K}p_{k}logp_{k} H(y)=−∑k=1Kpklogpk
对于具体的、随机变量y生成的数据集 D = { y 1 , . . . , y N } D=\left \{ y_{1},...,y_{N} \right \} D={y1,...,yN}而言,在实际操作中通常会利用经验熵来估计真正的信息熵:
H ( y ) = H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g ∣ C k ∣ ∣ D ∣ H\left ( y \right )=H\left ( D \right )=-\sum_{k=1}^{K}\frac{\left | C_{k} \right |}{\left | D \right |}log\frac{\left | C_{k} \right |}{\left | D \right |} H(y)=H(D)=−∑k=1K∣D∣∣Ck∣log∣D∣∣Ck∣
这里假设随机变量y的取值空间为 { c 1 , . . . , c K } \left \{ c_{1},...,c_{K} \right \} {c1,...,cK}, p k p_{k} pk表示y取 c k c_{k} ck的概率: p k = p ( y = c k ) p_{k}=p\left ( y=c_{k} \right ) pk=p(y=ck); ∣ C k ∣ \left | C_{k} \right | ∣Ck∣代表由随机变量y中类别为 c k c_{k} ck的样本的个数, ∣ D ∣ \left | D \right | ∣D∣代表D的总样本个数(亦即 ∣ D ∣ = N \left | D \right |=N ∣D∣=N)。可以看到,经验公式背后的思想其实就是“频率估计概率”。
接下来阐述一下为什么信息熵能够用来度量数据的不确定性。
很直观地来看,如果随机变量取到每一个类别 p k p_{k} pk的概率都是一样的,亦即y完全没有规律可循,此时的由y生成出来的数据 { y 1 , . . . , y N } \left \{ y_{1},...,y_{N} \right \} {y1,...,yN}的不确定性是在取值空间为 { c 1 , . . . , c K } \left \{ c_{1},...,c_{K} \right \} {c1,...,cK}、样本数为N的数据中最大的。
而当随机变量完全属于某一类别,即存在某个 k ∗ k^{*} k∗,使得 p ( y = c k ∗ ) = 1 p\left ( y=c_{k^{*}} \right )=1 p(y=ck∗)=1, p ( y = c k ) = 0 , ∀ k ≠ k ∗ p\left ( y=c_{k} \right )=0,\forall k\neq k^{*} p(y=ck)=0,∀k̸=k∗,此时y产生数据的不确定性最小。
而信息熵公式恰好满足以上性质,以简单的K=2的情况来看,其函数图像就像一个倒扣的碗,当p=0.5时H(y)达到最大,p=0或1时H(y)为0。
2.基尼系数
G i n i ( y ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini\left ( y \right )=\sum_{k=1}^{K}p_{k}\left ( 1-p_{k} \right )=1-\sum_{k=1}^{K}p_{k}^{2} Gini(y)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2
同样可以利用经验基尼系数来进行估计:
G i n i ( y ) = G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini\left ( y \right )=Gini\left ( D \right )=1-\sum_{k=1}^{K}\left ( \frac{\left | C_{k} \right |}{\left | D \right |} \right )^{2} Gini(y)=Gini(D)=1−∑k=1K(∣D∣∣Ck∣)2
可以证明,基尼系数拥有与信息熵同样的性质,即 p 1 = p 2 = . . . = p K = 1 K p_{1}=p_{2}=...=p_{K}=\frac{1}{K} p1=p2=...=pK=K1时,Gini(y)取得最大值,当存在 k ∗ k^{*} k∗使得 p k ∗ = 1 p_{k^{*}}=1 pk∗=1时,Gini(y)=0。
在了解了不确定性的度量标准后,决策树应该如何利用这些标准?这就不得不提到一个概念——信息的增益是针对随机变量y和描述该变量的特征来定义的,此时数据集 D = { ( x 1 , y 1 ) , . . . , ( x N , y N ) } D=\left \{ \left ( x_{1},y_{1} \right ),...,\left ( x_{N},y_{N} \right ) \right \} D={(x1,y1),...,(xN,yN)},其中 x i = ( x i ( 1 ) , . . . , x i ( n ) ) T x_{i}=\left ( x_{i}^{\left ( 1 \right )},...,x_{i}^{\left ( n \right )} \right )^{T} xi=(xi(1),...,xi(n))T是描述 y i y_{i} yi的特征向量,n则是特征个数。可以先研究单一特征情况,该特征为A,数据集 D = { ( A 1 , y 1 ) , . . . , ( A N , y N ) } D=\left \{ \left (A_{1},y_{1} \right ),...,\left ( A_{N},y_{N} \right ) \right \} D={(A1,y1),...,(AN,yN)};此时所谓的信息增益,反映的就是特征A所能给我们带来的关于y的“信息量”的大小。
因此在这里引入条件熵 H ( y ∣ A ) H\left ( y\mid A \right ) H(y∣A)的概念来定义信息的增益:所谓信息熵,就是根据特征A的不同取值 { a 1 , . . . , a m } \left \{ a_{1},...,a_{m} \right \} {a1,...,am}对y进行限制后,先对这些被限制的y分别计算信息熵,再把这些信息熵(一共有m个)根据特征取值本身的概率加权求和,从而得到总的条件熵。换句话说,条件熵是由被A不同取值限制的各个部分的y的不确定性以取值本身的概率作为权重加总得到的。
所以,条件熵 H ( y ∣ A ) H\left ( y\mid A \right ) H(y∣A)越小,意味着y被A限制后的总的不确定性越小,从而意味着A更能够帮助我们做出决策。
数学定义如下:
H ( y ∣ A ) = ∑ j = 1 m p ( A = a j ) H ( y ∣ A = a j ) H\left ( y\mid A \right )=\sum_{j=1}^{m}p\left ( A=a_{j} \right )H\left ( y\mid A=a_{j} \right ) H(y∣A)=∑j=1mp(A=aj)H(y∣A=aj)
其中
H ( y ∣ A = a j ) = − ∑ k = 1 K p ( y = c k ∣ A = a j ) l o g p ( y = c k ∣ A = a j ) H\left ( y\mid A=a_{j} \right )=-\sum_{k=1}^{K}p\left ( y=c_{k}\mid A=a_{j} \right )logp\left ( y=c_{k}\mid A=a_{j} \right ) H(y∣A=aj)=−∑k=1Kp(y=ck∣A=aj)logp(y=ck∣A=aj)
同样可以用经验条件熵来估计真正的条件熵:
H ( y ∣ A ) = H ( y ∣ D ) = ∑ j = 1 m ∣ D j ∣ D ∑ k = 1 K ∣ D j k ∣ D j l o g ∣ D j k ∣ D j H\left ( y\mid A \right )=H\left ( y\mid D \right )=\sum_{j=1}^{m}\frac{\left | D_{j} \right |}{D}\sum_{k=1}^{K}\frac{\left | D_{jk} \right |}{D_{j}}log\frac{\left | D_{jk} \right |}{D_{j}} H(y∣A)=H(y∣D)=∑j=1mD∣Dj∣∑k=1KDj∣Djk∣logDj∣Djk∣
这里的 D j D_{j} Dj表示在 A = a j A=a_{j} A=aj限制下的数据集。通常可以记 D j D_{j} Dj中的样本 y i y_{i} yi满足 y i A = a j y_{i}^{A}=a_{j} yiA=aj,公式中的 ∣ D j k ∣ \left | D_{jk} \right | ∣Djk∣则代表着 D j D_{j} Dj中第k类样本的个数。
从条件熵的直观含义,信息的增益可以自然地定义为:
g ( y , A ) = H ( y ) − H ( y ∣ A ) g\left ( y,A \right )=H\left ( y \right )-H\left ( y\mid A \right ) g(y,A)=H(y)−H(y∣A)
这里的 g ( y , A ) g\left ( y,A \right ) g(y,A)常被称为互信息。ID3算法就是利用它作为特征选择标准的。但是,如果简单地以互信息作为标准的话,会存在偏向于选择取值较多的特征,也就是m比较大的特征的问题。
为了解决该问题,可以给m一个惩罚,由此可以得到信息增益比的概念,该概念对应着C4.5算法:
g R ( y , A ) = g ( y , A ) H A ( y ) g_{R}\left ( y,A \right )=\frac{g\left ( y,A \right )}{H_{A}\left ( y \right )} gR(y,A)=HA(y)g(y,A)
其中 H A ( y ) H_{A}\left ( y \right ) HA(y)是y关于A的熵,它的定义为:
H A ( y ) = − ∑ j = 1 m p ( y A = a j ) l o g p ( y A = a j ) H_{A}\left ( y \right )=-\sum_{j=1}^{m}p\left ( y^{A}=a_{j} \right )logp\left ( y^{A}=a_{j} \right ) HA(y)=−∑j=1mp(yA=aj)logp(yA=aj)
同样可以用经验熵来进行估计:
H A ( y ) = H A ( D ) = − ∑ j = 1 m ∣ D j ∣ ∣ D ∣ l o g ∣ D j ∣ ∣ D ∣ H_{A}\left ( y \right )=H_{A}\left ( D \right )=-\sum_{j=1}^{m}\frac{\left | D_{j} \right |}{\left | D \right |}log\frac{\left | D_{j} \right |}{\left | D \right |} HA(y)=HA(D)=−∑j=1m∣D∣∣Dj∣log∣D∣∣Dj∣
需要指出的是,只需要类比上述的过程,同样可以使用基尼系数来定义信息的增益。具体而言,可以先定义条件基尼系数:
G i n i ( y ∣ A ) = ∑ j = 1 m p ( A = a j ) G i n i ( y ∣ A = a j ) Gini\left ( y\mid A \right )=\sum_{j=1}^{m}p\left ( A=a_{j} \right )Gini\left ( y\mid A=a_{j} \right ) Gini(y∣A)=∑j=1mp(A=aj)Gini(y∣A=aj)
其中
G i n i ( y ∣ A = a j ) = 1 − ∑ k = 1 K p 2 ( y = c k ∣ A = a j ) Gini\left ( y\mid A=a_{j} \right )=1-\sum_{k=1}^{K}p^{2}\left ( y=c_{k}\mid A=a_{j} \right ) Gini(y∣A=aj)=1−∑k=1Kp2(y=ck∣A=aj)
同样可以用经验条件基尼系数来进行估计:
G i n i ( y ∣ A ) = G i n i ( y ∣ D ) = ∑ j = 1 m ∣ D i ∣ ∣ D ∣ [ 1 − ∑ k = 1 K ( ∣ D j k ∣ ∣ D j ∣ ) 2 ] Gini\left ( y\mid A \right )=Gini\left ( y\mid D \right )=\sum_{j=1}^{m}\frac{\left | D_{i} \right |}{\left | D \right |}\left [ 1-\sum_{k=1}^{K}\left ( \frac{\left | D_{jk} \right |}{\left | D_{j} \right |} \right )^{2} \right ] Gini(y∣A)=Gini(y∣D)=∑j=1m∣D∣∣Di∣[1−∑k=1K(∣Dj∣∣Djk∣)2]
信息的增益则自然地定义为
g G i n i ( y , A ) = G i n i ( y ) − G i n i ( y ∣ A ) g_{Gini}\left ( y,A \right )=Gini\left ( y \right )-Gini\left ( y\mid A \right ) gGini(y,A)=Gini(y)−Gini(y∣A)
CART算法通常应用这种定义。
这里介绍三个比较基本的决策树算法:
它们的核心思想都是一致的:算法通过不断划分数据集来生成决策树,其中每一步的划分能够使当前的信息增益达到最大。
直观上可以这样想像一个决策树的生成过程:
事实上,几乎所有决策树算法的主要过程都与上述一致,区别仅表现在度量信息增益和划分数据的方法不同上。
1.ID3
输入:训练数据集 D = { ( x 1 , y 1 ) , . . . , ( x N , y N ) } D=\left \{ \left ( x_{1},y_{1} \right ),...,\left ( x_{N},y_{N} \right ) \right \} D={(x1,y1),...,(xN,yN)}
过程:
将数据集D喂给一个node;
若D中的所有样本同属于类别 c k c_{k} ck,则该node不再继续生成,将其类别标记为 c k c_{k} ck类;
若 x i x_{i} xi已经是0维向量,亦即已没有可选特征,则将此时D中样本个数最多的类别 c k c_{k} ck作为该node的类别;
否则,按照互信息定义的信息增益:
g ( y , x ( j ) ) = H ( y ) − H ( y ∣ x ( i ) ) g\left ( y,x^{\left ( j \right )} \right )=H\left ( y \right )-H\left ( y\mid x^{\left ( i \right )} \right ) g(y,x(j))=H(y)−H(y∣x(i))
来计算第j维特征的信息增益,然后选择使得信息增益最大的特征 x ( j ) x^{\left ( j \right )} x(j)作为划分标准,亦即:
j ∗ = a r g m a x j g ( y , x ( j ) ) j^{*}=argmax_{j}g\left ( y,x^{\left ( j \right )} \right ) j∗=argmaxjg(y,x(j))
若 x ( j ) x^{\left ( j \right )} x(j)满足停止条件,则不再继续生成并则将此时D中样本个数最多的类别 c k c_{k} ck作为类别标记;
否则,依 x ( j ) x^{\left ( j \right )} x(j)的所有可能取值 { a 1 , . . . , a m } \left \{ a_{1},...,a_{m} \right \} {a1,...,am}将数据集D划分为 { D 1 , . . . , D m } \left \{ D_{1},...,D_{m} \right \} {D1,...,Dm},使:
( x i , y i ) ∈ D ⇔ x i ( j ∗ ) = a j , ∀ i = 1 , . . . , N \left ( x_{i},y_{i} \right )\in D\Leftrightarrow x_{i}^{\left ( j^{*} \right )}=a_{j},\forall i=1,...,N (xi,yi)∈D⇔xi(j∗)=aj,∀i=1,...,N
同时,将 x 1 , . . . , x m x_{1},...,x_{m} x1,...,xm 的第 j ∗ j^{*} j∗维去掉,使它们成为n-1维的特征向量
对每个 D j D_{j} Dj从(1)开始调用算法。
输出:原始数据对应的node。
其中算法第(5)步的“停止条件”(也可以称为“预剪枝”)有许多提法,常用的是如下两种:
这两种停止条件的提法通用于C4.5和CART。
2.C4.5
C4.5使用信息增益比作为信息增益的度量,从而缓解了ID3算法会倾向于选择m比较大的特征A作为划分依据这个问题;也正因如此,C4.5算法可以处理ID3算法比较难处理的混合型数据。我们先来看看它在离散型数据上的算法:
过程:
C4.5采用二分类问题的解决方案处理连续型特征。具体而言,当二分类问题和决策树结合起来时,在连续的情况下我们通常把他转述为:
Y 1 = { y : y A < a 1 } , Y 2 = { y : y A ≥ a 1 } Y_{1}=\left \{ y:y^{A}< a_{1} \right \},Y_{2}=\left \{ y:y^{A}\geq a_{1} \right \} Y1={y:yA<a1},Y2={y:yA≥a1}
一般而言,如何处理连续性特征这个问题会归结为如何选择“二分标准”这个问题。C4.5中的做法如下:
需要指出的是,C4.5具有一个比较糟糕的性质:由信息增益比的定义可知,如果是二分的话,它会倾向于把数据集分成很不均匀的两份;因为此时 H A ( y ) H_{A}\left ( y \right ) HA(y)将非常小,导致 g R ( y , A ) g_{R}\left ( y,A \right ) gR(y,A)很大。举个例子:如果当前划分标准为连续特征,那么C4.5可能会倾向于直接选择 v 1 , v 2 , v 3 v_{1},v_{2},v_{3} v1,v2,v3等作为二分标准。这样会带来一种后果,决策树倾向于往深处发展,造成过拟合。
3.CART
CART既可作分类也可作回归。CART一般使用基尼增益作为信息信息增益的度量,其一大特色就是它假设了最终生成的决策树为二叉树,亦即它在处理离散型特征时也会通过决出二分标准来划分数据。
而对于回归问题,之前的分类问题的损失为数据的不确定性,而在回归问题中,一种常见的做法就是将损失定义为平方损失:
L ( D ) = ∑ i = 1 N I ( y i ≠ f ( x i ) ) [ y i − f ( x i ) ] 2 L\left ( D \right )=\sum_{i=1}^{N}I\left ( y_{i}\neq f\left ( x_{i} \right ) \right )\left [ y_{i}-f\left ( x_{i} \right ) \right ]^{2} L(D)=∑i=1NI(yi̸=f(xi))[yi−f(xi)]2
这里的I是示性函数,f是我们的模型、 f ( x i ) f\left ( x_{i} \right ) f(xi)是 x i x_{i} xi在我们模型下的预测输出, y i y_{i} yi是真实输出。在分类问题中决策树是一个划分规则的序列,在回归问题中也差不多。具体而言,设序列一共会将输入空间划分为 R 1 , . . . , R M R_{1},...,R_{M} R1,...,RM(这M个子空间彼此不相交),则:
对于回归问题,模型可以表示为:
f ( x i ) = ∑ m = 1 M c m I ( x i ∈ R m ) f\left ( x_{i} \right )=\sum_{m=1}^{M}c_{m}I\left ( x_{i}\in R_{m} \right ) f(xi)=∑m=1McmI(xi∈Rm)
这里 c m = a r g m i n c L m ( c ) = a r g m i n c ∑ ( x i , y i ) ∈ R m ( y i − c ) 2 c_{m}=argmin_{c}L_{m}\left ( c \right )= argmin_{c}\sum _{\left ( x_{i},y_{i} \right )\in R_{m}}\left ( y_{i}-c \right )^{2} cm=argmincLm(c)=argminc∑(xi,yi)∈Rm(yi−c)2。那么由一阶条件:
∂ L m ( c ) ∂ c = 0 ⇔ − 2 ∑ ( x i , y i ) ∈ R m ( y i − c m ) = 0 \frac{\partial L_{m}\left ( c \right )}{\partial c}=0\Leftrightarrow -2\sum _{\left ( x_{i},y_{i} \right )\in R_{m}}\left ( y_{i}-c_{m} \right )=0 ∂c∂Lm(c)=0⇔−2∑(xi,yi)∈Rm(yi−cm)=0
可解得 c m = a v g ( y i ∣ ( x i , y i ) ∈ R m ) = 1 ∣ R m ∣ ∑ ( x i , y i ∈ R m ) y i c_{m}=avg\left ( y_{i}\mid \left ( x_{i},y_{i} \right )\in R_{m} \right )= \frac{1}{\left | R_{m} \right |}\sum _{\left ( x_{i},y_{i}\in R_{m} \right )}y_{i} cm=avg(yi∣(xi,yi)∈Rm)=∣Rm∣1∑(xi,yi∈Rm)yi
解决回归问题时,我们会在特征和二分选择选好后,通过求解:
( j ∗ , p ∗ ) = a r g m i n j , p [ ∑ x i < p ( y i − c j p ( 1 ) ) 2 + ∑ x i ≥ p ( y i − c j p ( 1 ) ) 2 ] \left ( j^{*},p^{*} \right )=argmin_{j,p}\left [ \sum _{x_{i}< p}\left ( y_{i}-c_{jp}^{\left ( 1 \right )} \right )^{2}+\sum _{x_{i}\geq p}\left ( y_{i}-c_{jp}^{\left ( 1 \right )} \right )^{2} \right ] (j∗,p∗)=argminj,p[∑xi<p(yi−cjp(1))2+∑xi≥p(yi−cjp(1))2]
来选取划分标准。
为了解决决策树算法中存在的过拟合问题,通常采用“预剪枝”或“后剪枝”。”预剪枝“就是前面算法所提到的”停止条件“。而”后剪枝“是指在决策树生成完毕后再对其进行修建,把多余的节点修剪掉。换句话说,后剪枝是从全局出发,通过某种标准对一些node进行局部剪枝,这样能减少决策树中node的数目,从而有效地降低模型复杂度。
因此问题的关键在于如何定出局部剪枝的标准。通常来说有两种做法:
因此,我们又遇到一个关键问题,如何定量分析决策树中一个node的复杂度:一个直观的做法是直接使用该node下属叶节点的个数作为复杂度。