統計學習方法筆記-決策樹

統計學習方法筆記-決策樹

很多集成學習器,他們的基本模型都是決策樹,我們經常提到的gbdt模型,它的基模型就是CRAT樹.
決策樹是什麼東西?就是我們平常所說的if-then條件,我們把它組合成樹的結構. 決策樹中有兩種結點,葉子結點和非葉子結點. 其中非葉節點代表的條件,葉子結點表示的實例所屬的類別.

我們如何生成這個決策樹呢,最主要的一點就是選擇那個特徵作爲當前樹的分割結點,這就叫做特徵選擇,有了特徵選擇就有了決策樹的生成,最後我們還有進行決策樹剪枝(後面會提到爲什麼剪枝).

之前的筆記都沒有分析書中的例子,沒有一個直觀的解釋,這次我們從這個例子出發,看一下什麼是決策樹.
現在我們有下面一張表的數據,想生成一個決策樹模型,預測某個人是否符合貸款條件.

現在假如我們通過"某種方法"構造了一顆下面的決策樹. 從下圖可以看到特徵對應的是非葉子結點,如果這個被分到這個葉節點,就預測爲這個葉節點的類別. 從圖中我們可以知道以下兩點:

  1. 每一個葉子節點都對應一條從根節點到葉節點的規則,這表示決策樹是if-then規則的集合
  2. 如果一個實例到達了某個葉節點,一定表示它滿足了從根節點到該葉子節點的所有條件,而後纔得到類別,這不就是先滿足條件再得到概率嘛,我們一般叫做條件概率分佈.
Screenshot-from-2018-12-27-17-47-01

問題來了,爲什麼我們要選擇是否有房子作爲第一個構造特徵呢?我們構造學習模型,會遵守經驗風險最小化或者似然函數極大規則,選擇損失函數,我們如何根據風險最小化,選擇特徵呢?

數據

給定訓練數據集
T={(x1,y1),(x2,y2),...,(xN,yN)}T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}
其中,xi=(xi(1),xi(2),...,xi(n))Tx_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T特徵向量,n是特徵的個數,yi{1,2,...,K}y_i \in \{1,2,...,K\}表示類別. N是樣本個數. 基於這個數據生成決策樹模型.

決策樹

常見的決策樹模型有以下三種(決策樹既可以做分類也可以做迴歸):

  1. ID3
  2. C4.5
  3. CART

先給出兩個定義,信息熵和條件熵:

信息熵表示隨機變量不確定性的度量,設隨機標量X是一個離散隨機變量,其概率分佈爲:
P(X=xi)=pi,i=1,2,...,nP(X=x_i)=p_i, i=1,2,...,n
則隨機變量X的熵定義爲:
H(X)=i=1npilogpiH(X)=-\sum_{i=1}^{n}p_ilog{p_i}
熵越大,隨機變量的不確定性就越大,當pi=1np_i=\frac{1}{n}$時,
隨機變量的熵最大等於logn,故0H(P)logn0 \leq H(P) \leq logn.

條件熵就是在給定X的條件的情況下,隨機標量Y的條件,記作H(YX)H(Y|X),可以結合貝葉斯公式進行理解,定義如下
H(YX)=i=1npiH(YX=xi)H(Y|X)=\sum_{i=1}^{n}p_iH(Y|X=x_i)
這裏pi=P(X=xi),i=1,2,...,np_i=P(X=x_i),i=1,2,...,n.
一般在基於數據的估計中,我們使用的基於極大似然估計出來的經驗熵和經驗條件熵.

model feature select 樹的類型 計算公式
ID3 {分類:信息增益} 多叉樹 g(D,A)=H(D)H(DA)g(D,A)=H(D)-H(D\|A)
C4.5 {分類:信息增益比} 多叉樹 gR(D,A)=g(D,A)HA(D)g_R(D,A)=\frac{g(D,A)}{H_A(D)}
CART {迴歸:平方誤差;分類:基尼指數} 二叉樹 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2Gini(p)=\sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^{K}p_k^2

其中, HA(D)=H(DA)H_A(D)=H(D|A).

從表格中,我們總結(ID3,C4.5)決策樹算法僞代碼:

  1. 輸入:數據集D,特徵集合A,閾值e
  2. 輸出:決策樹T
  3. 如果D中所有實例輸出同一類CkC_k, 則T作爲單節點樹,並將類CkC_k作爲該節點的類標記,返回T;
  4. A=A=\varnothing,則T爲單節點樹,將D中實例數最多的類CkC_k作爲該節點的類標記,返回T;
  5. 否則,根據信息增益(ID3)或者信息增益比(C4.5)計算特徵A對D的值,選擇當前最優的特徵AgA_g;
  6. 如果AgA_g的信息增益小於閾值e,則置T爲單節點數,並將D中實例最多的類CkC_k作爲當前的類標記,返回T;
  7. 否則,根據AgA_g中的每一個不同的aia_i,根據Ag=aiA_g=a_i將D分成若干個非空子集,對於第i個子節點,以DiD_i爲數據集,以AAgA-{A_g}爲特徵集,遞歸(重複3-6)構造決策樹TiT_i,返回TiT_i.
  8. 對決策樹模型T進行剪枝.

從上述算法中,我們有三個問題,需要再次提出,並進行解釋:

  1. 爲什麼使用信息增益,越大越能得到好的模型?

上面提到過,信息熵表示數據的混亂的程度,信息增益是信息熵和條件信息熵的差值,表示的熵減少的程度,信息增益越大,代表根據我們的決策樹規則得到的數據越趨向於規整,這就是我們劃分類別的目的.

  1. 爲什麼從信息增益變到信息增益比,目的何在?

信息增益根據特徵之後的條件信息熵,這樣的話偏向於特徵取值較多的特徵的問題,因此使用信息增益比對這個問題進行校正.

  1. 爲什麼要進行剪枝?

在構造決策樹的過程中,我們的兩個停止條件是,子集只有一個類別和沒有可以選擇的特徵,這是我們全部利用了數據中的所有可以使用的信息,但是我們知道數據是可能有誤差了,而且數據不足,我們需要得到更魯棒的模型,剪枝的意義就是是的深度減小,這樣的就相當於減少規則的情況下,決策樹的性能反而不差,使其更加魯棒.

剪枝

再說爲什麼剪枝,我們構造決策樹的時候,是完全的在訓練數據上得到最優的模型. 這就是問題,這就什麼,這就過擬合,訓練誤差很小,但是驗證集上就不怎麼好用. 損失=經驗風險最小化+正則項=結構風險最小化. 構造決策樹的時候只考慮了經驗風險最小化,剪枝的時候我們考慮結構風險最小化,正則項就是樹的葉子節點個數. 重新定義損失函數,樹的葉子節點個數|T|,t是樹T的葉節點,該葉節點有NtN_t個樣本,其中k類的樣本點有NtkN_{tk}個,k=1,2,…,K, Ht(T)H_t(T)是葉子節點t經驗熵,α0\alpha \leq 0是參數,平衡經驗損失和正則項,得到計算公式如下:
Cα(T)=t=1TNtHt(T)+αTC_{\alpha}(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T|
其中,經驗熵爲:
Ht(T)=kNtkHtlogNtkHtH_t(T)=-\sum_{k}\frac{N_{tk}}{H_t}log\frac{N_{tk}}{H_t}
這是有:
Cα=C(T)+αTC_{\alpha}=C(T)+\alpha|T|
決策樹剪枝優化過程考慮了在訓練數據上的經驗風險最小化和減小模型複雜度兩個方向. 因爲加了正則項,所有我們基於貪心的思想進行剪枝,因爲當剪掉一個樹節點,雖然經驗風險增加了,但是模型複雜度降低了,我們基於兩個方面的平衡進行剪枝,如果剪掉之後,總的風險變小,就進行剪枝.
算法:
輸入: 算法產生的整個決策樹,參數α\alpha
修剪之後的樹TαT_{\alpha}

  1. 計算每個節點的經驗熵
  2. 遞歸從樹的葉節點向上回溯,假設將某個葉節點回縮到其父節點前後的整體樹對應的TBT_BTAT_A,對應的損失分別是Cα(TB)C_{\alpha}(T_B)Cα(TA)C_{\alpha}(T_A),如果:
    Cα(TA)Cα(TB)C_{\alpha}(T_A) \leq C_{\alpha}(T_B)
    表示,剪掉之後,損失減小,就進行剪枝.
  3. 重複2,直到不能繼續爲止,得到損失函數最小的子樹TαT_{\alpha}. 注: 動態規劃加速,是個好方法.

CART

分類與迴歸樹(classification and regression tree, CART)與上述決策樹的不同,

  1. 既可以做分類又可以做迴歸.
  2. 是二叉樹,內部節點特徵取值,只有yes和no兩個選項
    同樣地,先進行決策樹構造,在基於驗證集上進行CART決策樹的剪枝,既然是迴歸和分類樹,我們就分別介紹迴歸和分類兩種情況.
  • 分類: gini指數
  • 迴歸: 平方誤差
    定義數據格式:
    D=(x1,y1),(x2,y2),...,(xN,yN)D={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}
    其中,xix_i是向量,當迴歸問題時,yiy_i是連續變量; 分類問題時,yiy_i是離散變量.

迴歸樹(Regerssion Tree)

算法:
在訓練數據上,根據某一個特徵將每個區域劃分爲兩個子區域並決定每個子區域的輸出值,遞歸構建二叉樹.

  1. 選擇最優切分變量j和切分點s,求解
    minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)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,對固定的切分變量j掃描所有的s,找到使得上式最小的對(j,s).
  2. 使用選定的(j,s)劃分區域並決定相應的輸出值:
    R1(j,s)={xx(j)s},R2(j,s)={xx(j)>s},R_1(j,s)=\{x|x^{(j)} \leq s \}, R_2(j,s)=\{x|x^{(j)} > s \},
    cm=1NmxiRm(j,s)yi,xRm,m=1,2c_m=\frac{1}{N_m}\sum_{x_i \in R_m(j,s)}y_i, x \in R_m, m=1,2
  3. 繼續對兩個子區域調用1和2,知道滿足條件
  4. 將輸入空間劃分爲M個區域R1,R2,...,RmR_1,R_2,...,R_m,生成決策樹:
    f(x)=m=1McmI(xRm)f(x)=\sum_{m=1}^{M}c_mI(x \in R_m)

分類樹(classification tree)

基尼指數計算公式如下:
Gini(p)=k=1Kpk(1pk)=1k=1Kpk2Gini(p)=\sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^{K}p_k^2
基於數據D,得到:
Gini(D)=1k=1Kpk2Gini(D)=1-\sum_{k=1}^{K}p_k^2
其中,CkC_k是D中所屬第k類的樣本子集,K是類的個數.
如果樣本集合D根據特徵A是否取某一可能取值a被被劃分成D1D_1D2D_2兩個部分.
D1={(x,y)DA(x)=a},D2=DD1D_1=\{(x,y) \in D | A(x)=a \}, D-2= D-D_1
在特徵A的條件下,集合D的基尼指數定義爲:
Gini(D,A)=D1DGini(D1)+D2DGini(D2)Gini(D,A)=\frac{|D_1|}{D}Gini(D_1)+\frac{|D_2|}{D}Gini(D_2)
基尼指數和熵一樣,同樣表示集合D的不確定性,基尼指數(Gini(D,A))表示根據調教A=a後的集合D的不確定性,基尼指數越大,表示數據D的不確定性越大.

算法:
輸入:訓練數據D,停止計算的條件
輸出:CART決策樹

  1. 計算所有特徵A的每一個值a對應的條件基尼指數的值,選擇最優的劃分得到D1D_1D2D_2.
  2. 遞歸對兩個數據集D1D_1D2D_2繼續調用1,知道滿足條件.
  3. 生成CART樹的分類樹.
  4. 預測的時候,根據決策樹,x落到的葉子節點對應的類別表示這個預測x的類別.

CART剪枝

從上面兩個算法的不同可以看出,只是在label的設置和決策節點選擇的方式不同,整個架構依然是決策樹的常用的架構. 而且上面的樹的構建過程,都是基於訓練數據的經驗風險最小化,沒有使用帶有正則項的結構風險最小化,這樣的模型容易發生過擬合,爲了不讓模型過擬合,我們需要進行模型的剪枝.

CART樹的剪枝有很多難點和有意思的地方讓我們開慢慢解開這層面紗
CART剪枝算法有兩步組成:

  1. 從生成算法產生的決策樹T0T_0底端開始不斷剪枝,直到T0T_0的根節點,形成一個子樹序列{T0,T1,...,Tn}\{T_0,T_1,...,T_n\}.
  2. 通過交叉驗證的方法在獨立的驗證數據集上堆子序列進行測試,得到最優子樹

損失函數:
Cα(T)=C(T)+αTC_{\alpha}(T)=C(T)+\alpha|T|
其中,T爲任意子樹,C(T)C(T)是在訓練數據上的預測誤差,|T|是樹的葉子節點的個數,α0\alpha \geq 0是參數,Cα(T)C_{\alpha}(T)是參數α\alpha是的子樹T的整體的損失,參數α\alpha是平衡訓練數據擬合程度和模型複雜度的權重.
對於固定的α\alpha,一定存在使損失函數Cα(T)C_{\alpha}(T)最小的子樹,將其記作TαT_{\alpha}. 我們可以理解爲每一個α\alpha都對應一個最有子樹和最小損失.

而且已經得到證明,可以用遞歸的方法對樹進行剪枝. 將α\alpha從小增大,0=α0<α1<...<αn<+0=\alpha_0<\alpha_1<...<\alpha_n<+\infty,產生一系列的區間[αi,αi+1),i=0,1,...,n[\alpha_i,\alpha_{i+1}),i=0,1,...,n;剪枝得到的子樹序列對應着區間α[αi,αi+1),i=0,1,...,n\alpha \in [\alpha_i,\alpha_{i+1}),i=0,1,...,n的最有子樹序列{T0,T1,...,Tn}\{T_0,T_1,...,T_n\}.

我們給出算法:
輸入: CART算法生成的決策樹T_0.
輸出: 最優的決策樹T_{\alpha}

  1. 設k=0, T=T0T_0.
  2. α=+\alpha=+\infty.
  3. 自下而上地對各個內部節點t計算C(Tt),TtC(T_t),|T_t|以及
    g(t)=C(t)C(Tt)Tt1g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}
    α=min(α,g(t))\alpha=min(\alpha,g(t))
    這裏,TtT_t表示以t爲根節點的子樹,C(Tt)C(T_t)是對訓練數據的預測誤差,Tt|T_t|TtT_t的葉子節點個數.
  4. 自上而下地訪問內部節點t,如果有g(t)=αg(t)=\alpha,進行剪枝,並堆葉節點t以多數表決方法決定其類(分類,迴歸使用平均值),得到樹T.
  5. k=k+1,α=α,Tk=Tk=k+1,\alpha=\alpha,T_k=T.
  6. 如果T不是由根節點單獨構成的樹,則回到步驟4.
  7. 採用交叉驗證法在子樹序列{T0,T1,...,Tn}\{T_0,T_1,...,T_n\}中選取最優子樹TαT_{\alpha}.

接下面,我們不去看算法,來看書中給的一段文字的截圖,這裏截圖是因爲我要畫圖,進行比較解釋,圖中自由理論(哈哈):

cart

看懂這個圖之後,再看算法一氣呵成,因爲我們假設每一次得到的樹都有可能是最優的,所以不能直接去最後一個樹,要使用交叉驗證選擇最有的決策樹結構.

總結

決策樹用途相當廣泛,而且有很多變形,看着簡單其實不易,需要看看探索每一個知識點. 目前機器學習,人工智能如此火熱,需要進行理論實踐學習等多方面的結合方能立於不敗之地.

注:生活如此,問題不大. 喵~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章