決策樹從原理簡述到面試詳細總結

0、背景

決策樹是機器學習、數據挖掘領域一個非常常用的算法,網上相關的資料也是一大堆,原理很容易理解,但是要真正熟練運用和領悟還是需要花點功夫。本人近期有過一些面試,因此針對性地複習了一下,這裏就總結一下決策樹的一些原理和麪試中遇到的相關問題。

1、基礎知識

1.1 熵

熵其實是物理裏的一個概念,代表一個系統的混亂程度,在信息論裏用於表示一個隨機變量不確定性的度量,熵越大,不確定性越高。假設 XX 是一個離散分佈的隨機變量,取值有限,那麼 XX 的熵可以表示爲 H(p)H(p) H(p)=i=1Npilog(pi)H(p)=-\sum_{i=1}^{N}p_i\log(p_i)從定義可知,0H(p)log(n)0\le H(p)\le \log (n),右邊等號成立當且僅當 p1=p2=...=pN=1/Np_1=p_2=...=p_N=1/N

1.1.1 條件熵

假設有隨機變量 P(X,Y)P(X,Y),其聯合概率分佈爲 P(X=xi,Y=yi)=pij, i=1,2,...,n;j=,1,2,...,mP(X=x_i,Y=y_i)=p_{ij},\ i=1,2,...,n;j=,1,2,...,m,條件熵 H(YX)H(Y|X) 表示在已知隨機 XX 的條件下隨機變量 YY 的不確定性,隨機變量 XX 給定的條件下隨機變量 YY 的條件熵 H(YX)H(Y|X),給出定義 H(YX)=i=1nP(X=xi)H(YX=xi), i=1,2,...,nH(Y|X)=\sum_{i=1}^{n}P(X=x_i)H(Y|X=x_i),\ i=1,2,...,n

1.1.2 聯合熵

聯合概率分佈 P(X,Y)P(X,Y) 的經驗熵 H(X,Y)=i,jP(X=xi,Y=yj)log(P(X=xi,Y=yj))H(X,Y)=-\sum_{i,j}P(X=x_i,Y=y_j)\log(P(X=x_i,Y=y_j))

1.1.3 交叉熵

關於樣本集有兩個分佈 ppqqpp 是真實分佈,qq 是非真實分佈,如果用非真實分佈 qq 來編碼真實分佈 ppH(p,q)=ipilog(qi)H(p,q)=-\sum_{i}p_i\log(q_i)

1.1.4 KL散度

用於衡量兩個分佈 p,qp,q 的相似度 DKL(pq)=i=1npilog(piqi)=i=1npilog(pi)i=1npilog(qi)=H(p)+H(p,q)D_{KL}(p|q)=\sum_{i=1}^{n}p_i\log(\frac{p_i}{q_i})=\sum_{i=1}^{n}p_i\log(p_i)-\sum_{i=1}^{n}p_i\log(q_i)=-H(p)+H(p,q) 可以看到,KL散度是交叉熵和經驗熵的差值。

1.2 信息增益

特徵 AA 對訓練數據集 DD 的信息增益 g(D,A)g(D,A),定義爲集合 DD 的經驗熵 H(D)H(D)與特徵 AA 在給定條件下 DD 的經驗條件熵 H(DA)H(D|A) 之差 g(D,A)=H(D)H(DA)g(D,A)=H(D)-H(D|A),一般地,熵 H(Y)H(Y) 和條件熵 H(YX)H(Y|X) 之差稱爲互信息,在決策樹裏,信息增益等價於訓練數據集中類別和特徵的互信息。

1.3 信息增益率

特徵 AA 對訓練數據集 DD 的信息增益率 gR(D,A)g_{R}(D,A) 定義爲其信息增益 g(D,A)g(D,A) 與訓練數據集 DD 關於特徵 AA 的值的熵 HA(D)H_{A}(D) 之比,即 gR(D,A)=g(D,A)HA(D)g_{R}(D,A)=\frac{g(D,A)}{H_{A}(D)}其中,HA(D)=i=1nDiDlog2DiDH_{A}(D)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|}\log_{2}\frac{|D_i|}{|D|} nn 是特徵 AA 取值的個數

1.4 Gini指數

分類問題中,假設有 KK 個類,樣本點屬於第 kk 類的概率爲 pkp_k。則概率分佈的基尼指數爲 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 基尼指數 Gini(D)Gini(D) 代表集合 DD 的不確定性,基尼指數 Gini(D,A)Gini(D,A) 表示經 A=aA=a 分割後集合 DD 的不確定性,基尼指數值越大,樣本集合的不確定性也越大。

2、決策樹

決策樹顧名思義它是一個樹狀結構的東西,通俗理解其實就是一套if else 規則,常用於分類,一個樣本進來,經過層層if else規則之後最終落到哪個葉子節點,就屬於該節點所在的類別。決策樹的由特徵選擇、樹的生成、樹的剪枝三步組成。
常見的決策樹算法有ID3,C4.5,CART

2.1 ID3算法

ID3算法的核心是在決策樹各個節點上用信息增益準則選擇特徵,遞歸地構建決策樹。具體地,從根結點開始,對結點計算所有可能的特徵的信息增益,選擇信息增益最大的特徵作爲節點的特徵,由該結點的不同取值建立子節點,在對子結點遞歸調用上述方法,構建決策樹,直到所有特徵的信息增益均很小活沒有特徵可以選擇位置,最後得到決策樹。ID3相當於是用極大似然法進行概率模型的選擇。

算法流程
輸入:訓練數據集 D,特徵集 A,閾值 ϵ\epsilon
輸出:決策樹 T

(1). 若 DD 中所有實例都屬於同一類 CkC_k,則 TT 爲單結點樹,並將類 CkC_k 作爲該結點的類標記,返回 TT;
(2). 若 AA=\varnothing,則將數據集 DD 中樣本數量最多的類別 CkC_k 作爲該結點的類標記,返回 TT;
(3). 否則按前面提到的計算信息增益的方法,計算特徵集 AA 中各個特徵對 DD 的信息增益,選擇信息增益最大的特徵 AgA_{g}
(4). 如果 AgA_g 的信息增益小於閾值 ϵ\epsilon ,則 TT 爲單結點樹,並將 DD 中實例數最大的類別 CkC_k 作爲該結點的類標記,返回 TT
(5). 否則,對 AgA_g 的每一個取值 aia_i,依 AgA_g = aia_i,將 DD 分割爲若干個不相交的非空集合 DiD_i,將 DiD_i 中實例數最大的類作爲標記,構造子結點,由結點和子結點構建樹 TT,返回 TT
(6). 對第 ii 個子結點,以 DiD_i 爲訓練集,以 AA - AgA_{g} 爲特徵集,遞歸調用(1) - (5),得到子樹 TiT_i,返回 TiT_i

注意:

  • ID3算法只能處理離散特徵
  • 特徵在不同層級之間不能反覆使用
  • 使用信息增益來做特徵選擇,容易導致偏向於選擇屬性值多的特徵,從直觀上也能理解,一個特徵屬性值越多,包含的信息也就越多,用它來做分裂結點,數據集的不確定性降低地更快。

2.2 C4.5算法

C4.5算法流程和ID3一模一樣,只是在選擇分裂的時候用信息增益率來做特徵選擇,在這裏不再贅述。

注意:

  • C4.5 算法相比於ID3 算法,它既能處理離散特徵也能處理連續特徵
  • 使用信息增益率做特徵選擇,避免了偏向選擇屬性值較多的問題
  • C4.5 在處理連續數值型屬性時,通過對數據排序之後找到類別不同的分割線作爲切分點,根據切分點把連續屬性特徵轉爲布爾型,從而將連續型變量轉換多個取之區間的離散型變量
  • C4.5 一般來說也是多叉樹

2.3 CART算法

CART全稱是分類與迴歸樹(Classify and Regression Tree),顧名思義,既可以用於分類也可以用於迴歸,CART假設樹的二叉樹,內部節點特徵取值爲 “是” 和 “否”,左邊是取值爲 “是” 的分支,右邊是取值爲 “否” 的分支。

CART算法由兩步組成:
(1)、決策樹的生成:基於訓練數據生成決策樹,生成的決策樹要儘量大
(2)、決策樹的剪枝:用驗證數據集對已生成的決策樹進行剪枝並選擇最優子樹,用損失函數最小作爲選擇標準。

2.3.1 迴歸樹的生成

算法2.3.1 (最小二乘迴歸樹)

輸入:數據集 DD,特徵集合 AA
輸出:迴歸樹 f(x)f(x)
在訓練數據集所在的輸入空間中,遞歸地將每個區域劃分爲兩個子區域,並決定每個子區域上的輸出值,構建二叉決策樹
(1). 選擇最優的切分變量 jj 和切分點 ss,求解 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}] 遍歷變量 jj,對固定的切分變量 jj ,掃描切分點 ss,找到使得上式最小的 (j,s)(j,s)
(2). 用固定的 (j,s)(j,s) 劃分區域,並決定相應的輸出值 R1(j,s)={x  x(j)s},R2(j,s)={x  x(j)>s}R_{1}(j,s)=\{x\ |\ x^{(j)}\le s\} ,R_{2}(j,s)=\{x\ |\ x^{(j)}\gt s\} c^m=1NxiRm(j,s)yi,xRm,m=1,2\hat c_{m}=\frac{1}{N}\sum_{x_i\in R_{m}(j,s)}y_i,x\in R_{m},m=1,2 (3). 繼續對兩個子區域調用(1),(2),直到滿足停止條件。
(4). 將輸入空間分成 MM 個區域 R1,R2,...,RMR_1,R_2,...,R_M,生成決策樹 f(x)=m=1Mc^mI(xRm)f(x)=\sum_{m=1}^{M}\hat c_{m}I(x \in R_m)

2.3.2 分類樹的生成

分類樹用基尼指數做特徵選擇,同時決定該特徵的最優二值切分點。
在特徵 AA 的條件下,集合 DD 的基尼指數定義爲 Gini(D,A)=D1DGini(D1)+D2DGini(D2)()Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) \quad \quad \quad (*)
(1). 設結點的訓練數據集爲 DD,計算現有特徵對該數據集的基尼係數,此時,對每一個特徵 AA,對其可能取的每個值 aa,根據樣本點對 A=aA=a 的測試爲 “是” 或者 “否”,將 DD 分割成 D1,D2D_1,D_2 兩部分,利用 ()(*) 式計算 AA = aa 的基尼係數。
(2). 在所有的可能 AA 以及他們所有可能的切分點 aa 中,選擇基尼指數最小的特徵及其對應的切分點作爲最優特徵和最優切分點,依最優特徵和最優切分點,從現結點生成兩個子節點,將訓練數據集依特徵分配到兩個子節點中去。
(3). 對兩個子節點遞歸調用 (1)、(2),直至滿足停止條件
(4). 生成CART決策樹

注意:

  • CART既可以做分類也可以做迴歸
  • 不同於ID3、C4.5可以是多叉樹,CART只能是二叉樹
  • ID3和C4.5的特徵是不能在不同層級之間複用的,而CART可以
  • C4.5通過剪枝來平衡模型的準確性和泛化能力,而CART直接利用全部數據發現所有可能的樹進行對比

2.4 決策樹的剪枝

決策樹生成算法遞歸地生成決策樹,直到滿足停止條件,這種情況下,對於訓練集的數據會有較好的預測,但是對於測試集往往效果不理想,容易產生過擬合,因此要對決策樹進行剪枝,簡化樹狀結構,提高泛化能力。

剪枝分爲預剪枝和後剪枝。
預剪枝:在樹的構建生長階段進行剪枝,如果結點滿足信息Gini指數小於閾值或者該結點的樣本樹量少於多少,則不對該結點繼續細分。
後剪枝:在樹完全生長後再從葉子結點逐個往上剪枝,利用測試集數據驗證剪枝前後,樹的損失函數是否有變化。如果剪枝後損失函數減小,那說明剪枝是提高了模型泛化能力,否則不能剪枝。

這裏介紹一下李航老師《統計學習方法》裏的剪枝方法。
決策樹的剪枝往往是通過最小化決策樹整體的損失函數來實現。設樹 TT 的葉子結點個數爲 T|T|tt 是樹 TT 的葉子結點,該葉子結點有 NtN_{t} 個樣本,其中第 kk 類的樣本個數爲 Ntk,k=1,2,...,KN_{tk},k=1,2,...,KHt(T)H_{t}(T) 爲葉子結點 tt 上的經驗熵,α0\alpha \ge 0 爲參數,則決策樹定義的損失函數可以定義爲:
Cα(T)=t=1TNtHt(T)+αT(1)C_{\alpha}(T)=\sum_{t=1}^{|T|}N_{t}H_{t}(T)+\alpha |T| \quad\quad\quad\quad\quad\quad (1)
其中經驗熵爲 Ht(T)=kNtkNtlogNtkNt(2)H_{t}(T)=-\sum_{k}\frac{N_{tk}}{N_{t}}\log \frac{N_{tk}}{N_t} \quad\quad\quad\quad\quad\quad\quad (2) 損失函數裏,我們記右端第一項爲 C(T)=t=1TNtHt(T)=t=1TkNtklogNtkNt(3)C(T)=\sum_{t=1}^{|T|}N_{t}H_{t}(T)=-\sum_{t=1}^{|T|}\sum_{k}N_{tk}\log \frac{N_{tk}}{N_t} \quad\quad\quad\quad\quad (3)此時有 Cα(T)=C(T)+αTC_{\alpha}(T)=C(T)+\alpha |T| (4) 式中 C(T)C(T) 表示模型對訓練數據的預測誤差,即模型與訓練數據的擬合程度,T|T| 表示模型的複雜度,參數 α0\alpha\ge0 控制兩者之間的影響,可以看到,當 α\alpha 較大時,會促使選擇較簡單的模型,T|T| 會比較小,而 α\alpha 較大時,會偏向於選擇較爲複雜的模型。
剪枝,就是在確定 α\alpha 的時候選擇損失函數最小的子樹,當 α\alpha 確定時,子樹越大,對訓練數據擬合越好,但是模型越複雜,相反,子樹越小,對訓練數據擬合差一些,但是模型相對簡單。因此損失函數表示了對兩者的平衡。

算法 2.4.1 (樹的剪枝算法)
輸入:生成算法產生的整個樹 TT,參數 α\alpha
輸出:修剪後的子樹 TαT_{\alpha}

(1). 計算每個結點的經驗熵
(2). 遞歸地從樹的葉子結點向上回縮,設一組葉結點回縮到其父節點之前與之後的樹分別爲 TBT_BTAT_{A},其對應的損失函數值分別爲 Cα(TB),Cα(TA)C_{\alpha}(T_B), C_{\alpha}(T_A),如果 Cα(TB)Cα(TA)C_{\alpha}(T_B)\le C_{\alpha}(T_A),則進行剪枝,將父節點變成葉子結點
(3). 返回 (2),直到不能進行剪枝爲止,得到損失函數最小的子樹 TαT_{\alpha}

3、常見面試題

1.簡述決策樹的原理

2.簡述決策樹的構建過程

3.信息增益率有什麼優缺點?
是對信息增益的一種改進,對屬性值多的樣本做一下懲罰,避免分類的時候偏向於優先劃分屬性值多的特徵;
另外如果樣本中某一個特徵下的值沒有重複的,ID3中使用信息增益更偏向於將每個樣本各自分爲一類,這樣的方式是不合理的,用信息增益率可以避免這個問題。

4.如何對決策樹進行剪枝?
預剪枝和後剪枝

5.爲什麼決策樹需要進行剪枝?
防止過擬合

6.C4.5對ID3做了哪些改進?
將信息增益改成了信息增益率;可以處理連續型特徵

7.C4.5決策樹算法如何處理連續數值型屬性?
通過對數據排序之後找到類別不同的分割線作爲切分點,根據切分點把連續屬性特徵轉爲布爾型,從而將連續型變量轉換多個取之區間的離散型變量

8.C4.5與CART的區別
C4.5只能做分類,CART既可以做分類也可以做迴歸,分類的時候用Gini指數,迴歸的時候用平方差。
C4.5可以是多叉樹,而CART只能是二叉樹
C4.5的特徵在每個層級之間不會複用,CART的每個特徵可以複用。
C4.5通過剪枝來平衡模型的準確性和泛化能力,而CART直接利用全部數據發現所有可能的樹進行對比

9.簡述一下分類樹和迴歸樹

10.CART如何生成迴歸樹?

11.CART樹對離散特徵取值數目>=3的特徵如何處理?
因爲CART樹是二叉樹,所以對於樣本的有N>=3個取值的離散特徵的處理時也只能有兩個分支,這就要通過組合人爲的創建二取值序列並取GiniGain最小者作爲樹分叉決策點。如某特徵值具有[‘young’,’middle’,’old’]三個取值,那麼二分序列會有如下3種可能性(空集和滿集在CART分類中沒有意義):

[((‘young’,), (‘middle’, ‘old’)), ((‘middle’,), (‘young’, ‘old’)), ((‘old’,), (‘young’, ‘middle’))]

採用CART算法,就需要分別計算按照上述List中的二分序列做分叉時的Gini指數,然後選取產生最小的GINIGain的二分序列做該特徵的分叉二值序列參與樹構建的遞歸。

12.決策樹對缺失值如何處理?

  1. 如何在屬性值缺失的情況下進行劃分屬性的選擇?(比如“色澤”這個屬性有的樣本在該屬性上的值是缺失的,那麼該如何計算“色澤”的信息增益?)
  2. 給定劃分屬性,若樣本在該屬性上的值是缺失的,那麼該如何對這個樣本進行劃分?(即到底把這個樣本劃分到哪個結點裏?)

第一個問題只需要對缺失屬性值的樣本進行統計,計算該屬性值不缺失的樣本比例 ρ\rho,在計算信息增益時乘上 ρ\rho 即可
第二個問題若樣本 xx 在劃分屬性 aa 上取值缺失,則將 xx 同時劃入所有子節點,只不過此時要調整樣本 xx 的權重,換句話說就是讓這個樣本以不同的概率劃分到不同的子節點中。

詳細參考:https://blog.csdn.net/zhaomengszu/article/details/80775554
13.如果決策樹屬性用完了仍未對決策樹完成劃分應該怎麼辦?
多數表決

14.如何避免決策樹的過擬合?
剪枝、減少特徵、增加樣本

15.決策樹需要進行歸一化處理嗎?
不需要,因爲決策樹是一種概率模型,它們不關心變量的值,而是關心變量的分佈和變量之間的條件概率。數值縮放不會影響決策樹的分裂點位置。

16.常用的決策樹一定是二叉樹嗎?二叉決策樹與多分支決策樹相比各有什麼特點?
不一定。C4.5和ID3都是多叉樹,

17.你認爲在一棵決策樹構建過程中較爲耗時的步驟是什麼?
選取劃分屬性

18.你正在一個時間序列數據集上工作,開始用決策樹算法,因爲你知道它在所有類型數據上的表現都不錯。後來,你嘗試了時間序列迴歸模型,並得到了比決策樹模型更高的精度。這種情況會發生嗎?爲什麼?

19.決策樹在選擇特徵進行分類時一個特徵被選擇過後,之後還會選擇到這個特徵嗎?
ID3和C4.5的特徵在層級之間不重複,但CART是會複用的

20.和其他模型比,決策樹有哪些優點和缺點?

  1. 簡單直觀,生成的決策樹很直觀。
  2. 基本不需要預處理,不需要提前歸一化,處理缺失值。
  3. 使用決策樹預測的代價是O(log2m\log_{2}m)。 m爲樣本數。
  4. 既可以處理離散值也可以處理連續值。很多算法只是專注於離散值或者連續值。
  5. 可以處理多維度輸出的分類問題。
  6. 相比於神經網絡之類的黑盒分類模型,決策樹在邏輯上可以得到很好的解釋
  7. 可以交叉驗證的剪枝來選擇模型,從而提高泛化能力。
  8. 對於異常點的容錯能力好,健壯性高。

我們再看看決策樹算法的缺點:

  1. 決策樹算法非常容易過擬合,導致泛化能力不強。可以通過設置節點最少樣本數量和限制決策樹深度來改進。
  2. 決策樹會因爲樣本發生一點點的改動,就會導致樹結構的劇烈改變。這個可以通過集成學習之類的方法解決。
  3. 尋找最優的決策樹是一個NP難的問題,我們一般是通過啓發式方法,容易陷入局部最優。可以通過集成學習之類的方法來改善。
  4. 有些比較複雜的關係,決策樹很難學習,比如異或。這個就沒有辦法了,一般這種關係可以換神經網絡分類方法來解決。
  5. 如果某些特徵的樣本比例過大,生成決策樹容易偏向於這些特徵。這個可以通過調節樣本權重來改善。

參考資料:
[1]. https://www.zhihu.com/question/41252833
[2]. 《統計學習方法》-- 李航
[3]. https://blog.csdn.net/qq_32742009/article/details/81840904

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