最近一段時間在Coursera上學習Data Analysis,裏面有個assignment涉及到了決策樹,所以參考了一些決策樹方面的資料,現在將學習過程的筆記整理記錄於此,作爲備忘。
(示例中 擁有房產(是/否))作爲label
label就是結論,由feature->label
假設這是一個結算過程
y=f(x)
那麼,轉換成語言就是
label=f(feature)
算法原理
決策樹(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)。這樣,就可以通過正太分佈的置信區間的計算方式計算執行區間了。
正太分佈的置信區間求解如下:
2) 選擇置信水平α= 95%,或其他值,這取決於你需要對這個區間有多自信。一般來說,α越大,區間越大。
3) 求出 α/2和1-α/2對應的標準正太分佈的統計量 和 (均爲常量)。然後解下面關於p的不等式。acc可以有樣本估計得出。即可以得到關於p的執行區間
參考資料
[1] 《數據挖掘導論》Chapter 4 Classification:Basic Concepts, Decision Trees, and Model Evaluation,Pang-Ning Tan & Micheal Steinbach & Vipin Kumar著
[2] Data Analyis, Lectures in Week 6,7 at Coursera
[3] 《集體智慧編程》Chapter 7 Modeling with Decision Tree,Toby Segaran著
[4] 《Head First Statistics》 Chapter 12 置信區間的構造, Dawn Griffiths 著