1. 程式人生 > 其它 >決策樹知識

決策樹知識

演算法原理

決策樹(Decision Tree)是一種簡單但是廣泛使用的分類器。通過訓練資料構建決策樹,可以高效的對未知的資料進行分類。決策數有兩大優點:1)決策樹模型可以讀性好,具有描述性,有助於人工分析;2)效率高,決策樹只需要一次構建,反覆使用,每一次預測的最大計算次數不超過決策樹的深度。

如何預測

先看看下面的資料表格:

ID

擁有房產(是/否)

婚姻情況(單身,已婚,離婚)

年收入(單位:千元)

無法償還債務(是/否)

1

單身

125

2

已婚

100

3

單身

70

4

已婚

120

5

離婚

95

6

已婚

60

7

離婚

220

8

單身

85

9

已婚

75

10

單身

90

上表根據歷史資料,記錄已有的使用者是否可以償還債務,以及相關的資訊。通過該資料,構建的決策樹如下:

比如新來一個使用者:無房產,單身,年收入55K,那麼根據上面的決策樹,可以預測他無法償還債務(藍色虛線路徑)。從上面的決策樹,還可以知道是否擁有房產可以很大的決定使用者是否可以償還債務,對借貸業務具有指導意義。

基本步驟

決策樹構建的基本步驟如下:

1. 開始,所有記錄看作一個節點

2. 遍歷每個變數的每一種分割方式,找到最好的分割點

3. 分割成兩個節點N1和N2

4. 對N1和N2分別繼續執行2-3步,直到每個節點足夠“純”為止

決策樹的變數可以有兩種:

1) 數字型(Numeric):變數型別是整數或浮點數,如前面例子中的“年收入”。用“>=”,“>”,“<”或“<=”作為分割條件(排序後,利用已有的分割情況,可以優化分割演算法的時間複雜度)。

2) 名稱型(Nominal):類似程式語言中的列舉型別,變數只能重有限的選項中選取,比如前面例子中的“婚姻情況”,只能是“單身”,“已婚”或“離婚”。使用“=”來分割。

如何評估分割點的好壞?如果一個分割點可以將當前的所有節點分為兩類,使得每一類都很“純”,也就是同一類的記錄較多,那麼就是一個好分割點。比如上面的例子,“擁有房產”,可以將記錄分成了兩類,“是”的節點全部都可以償還債務,非常“純”;“否”的節點,可以償還貸款和無法償還貸款的人都有,不是很“純”,但是兩個節點加起來的純度之和與原始節點的純度之差最大,所以按照這種方法分割。構建決策樹採用貪心演算法,只考慮當前純度差最大的情況作為分割點。

量化純度

前面講到,決策樹是根據“純度”來構建的,如何量化純度呢?這裡介紹三種純度計算方法。如果記錄被分為n類,每一類的比例P(i)=第i類的數目/總數目。還是拿上面的例子,10個數據中可以償還債務的記錄比例為P(1) = 7/10 = 0.7,無法償還的為P(2) = 3/10 = 0.3,N = 2。

Gini不純度

熵(Entropy)

錯誤率

上面的三個公式均是值越大,表示越 “不純”,越小表示越“純”。三種公式只需要取一種即可,實踐證明三種公司的選擇對最終分類準確率的影響並不大,一般使用熵公式。

純度差,也稱為資訊增益(Information Gain),公式如下:

其中,I代表不純度(也就是上面三個公式的任意一種),K代表分割的節點數,一般K = 2。vj表示子節點中的記錄數目。上面公式實際上就是當前節點的不純度減去子節點不純度的加權平均數,權重由子節點記錄數與當前節點記錄數的比例決定。

停止條件

決策樹的構建過程是一個遞迴的過程,所以需要確定停止條件,否則過程將不會結束。一種最直觀的方式是當每個子節點只有一種型別的記錄時停止,但是這樣往往會使得樹的節點過多,導致過擬合問題(Overfitting)。另一種可行的方法是當前節點中的記錄數低於一個最小的閥值,那麼就停止分割,將max(P(i))對應的分類作為當前葉節點的分類。

過渡擬合

採用上面演算法生成的決策樹在事件中往往會導致過濾擬合。也就是該決策樹對訓練資料可以得到很低的錯誤率,但是運用到測試資料上卻得到非常高的錯誤率。過渡擬合的原因有以下幾點:

  • 噪音資料:訓練資料中存在噪音資料,決策樹的某些節點有噪音資料作為分割標準,導致決策樹無法代表真實資料。
  • 缺少代表性資料:訓練資料沒有包含所有具有代表性的資料,導致某一類資料無法很好的匹配,這一點可以通過觀察混淆矩陣(Confusion Matrix)分析得出。
  • 多重比較(Mulitple Comparition):舉個列子,股票分析師預測股票漲或跌。假設分析師都是靠隨機猜測,也就是他們正確的概率是0.5。每一個人預測10次,那麼預測正確的次數在8次或8次以上的概率為,只有5%左右,比較低。但是如果50個分析師,每個人預測10次,選擇至少一個人得到8次或以上的人作為代表,那麼概率為,概率十分大,隨著分析師人數的增加,概率無限接近1。但是,選出來的分析師其實是打醬油的,他對未來的預測不能做任何保證。上面這個例子就是多重比較。這一情況和決策樹選取分割點類似,需要在每個變數的每一個值中選取一個作為分割的代表,所以選出一個噪音分割標準的概率是很大的。

優化方案1:修剪枝葉

決策樹過渡擬合往往是因為太過“茂盛”,也就是節點過多,所以需要裁剪(Prune Tree)枝葉。裁剪枝葉的策略對決策樹正確率的影響很大。主要有兩種裁剪策略。

前置裁剪在構建決策樹的過程時,提前停止。那麼,會將切分節點的條件設定的很苛刻,導致決策樹很短小。結果就是決策樹無法達到最優。實踐證明這中策略無法得到較好的結果。

後置裁剪決策樹構建好後,然後才開始裁剪。採用兩種方法:1)用單一葉節點代替整個子樹,葉節點的分類採用子樹中最主要的分類;2)將一個字數完全替代另外一顆子樹。後置裁剪有個問題就是計算效率,有些節點計算後就被裁剪了,導致有點浪費。

優化方案2:K-Fold Cross Validation

首先計算出整體的決策樹T,葉節點個數記作N,設i屬於[1,N]。對每個i,使用K-Fold Validataion方法計算決策樹,並裁剪到i個節點,計算錯誤率,最後求出平均錯誤率。這樣可以用具有最小錯誤率對應的i作為最終決策樹的大小,對原始決策樹進行裁剪,得到最優決策樹。

優化方案3:Random Forest

Random Forest是用訓練資料隨機的計算出許多決策樹,形成了一個森林。然後用這個森林對未知資料進行預測,選取投票最多的分類。實踐證明,此演算法的錯誤率得到了經一步的降低。這種方法背後的原理可以用“三個臭皮匠定一個諸葛亮”這句諺語來概括。一顆樹預測正確的概率可能不高,但是集體預測正確的概率卻很高。

準確率估計

決策樹T構建好後,需要估計預測準確率。直觀說明,比如N條測試資料,X預測正確的記錄數,那麼可以估計acc = X/N為T的準確率。但是,這樣不是很科學。因為我們是通過樣本估計的準確率,很有可能存在偏差。所以,比較科學的方法是估計一個準確率的區間,這裡就要用到統計學中的置信區間(Confidence Interval)。

設T的準確率p是一個客觀存在的值,X的概率分佈為X ~ B(N,p),即X遵循概率為p,次數為N的二項分佈(Binomial Distribution),期望E(X) = N*p,方差Var(X) = N*p*(1-p)。由於當N很大時,二項分佈可以近似有正太分佈(Normal Distribution)計算,一般N會很大,所以X ~ N(np,n*p*(1-p))。可以算出,acc =X/N的期望E(acc) = E(X/N) = E(X)/N = p,方差Var(acc) = Var(X/N) = Var(X) / N2= p*(1-p) / N,所以acc ~ N(p,p*(1-p)/N)。這樣,就可以通過正太分佈的置信區間的計算方式計算執行區間了。

正太分佈的置信區間求解如下:

1) 將acc標準化,即

2) 選擇置信水平α= 95%,或其他值,這取決於你需要對這個區間有多自信。一般來說,α越大,區間越大。

3) 求出 α/2和1-α/2對應的標準正太分佈的統計量(均為常量)。然後解下面關於p的不等式。acc可以有樣本估計得出。即可以得到關於p的執行區間