1. 決策樹
決策樹 (Decision tree,DT) 是一種基本的分類與回歸方法。它是一個樹形結構,對於指定特征空間上的數據點來說,總能順着決策樹的根節點一步步分配到子節點最終到達葉節點,而葉節點表示了該數據點所屬的分類。在每一次分配到子節點的過程中可以看作是對數據點中特有的特征屬性值進行的 if-then 判斷。
決策樹可以認為是 if-then 規則的集合,也可以認為時定義在特征空間與類空間上的條件概率分布。其主要優點是模型具有可讀性,分類速度快。如何得到該決策樹叫做決策樹學習,決策樹學習時,利用訓練數據,根據損失函數最小化的原則建立決策樹模型。預測試,對新的數據,利用決策樹模型進行分類。
數據類型
特征可以連續和離散
因變量分類時是離散,回歸時是連續
策樹優點
1)簡單直觀,生成的決策樹很直觀。
2)基本不需要預處理,不需要提前歸一化,處理缺失值。
3)使用決策樹預測的代價是O(log2m)。 m為樣本數。
4)既可以處理離散值也可以處理連續值。很多算法只是專注於離散值或者連續值。
5)可以處理多維度輸出的分類問題。
6)相比於神經網絡之類的黑盒分類模型,決策樹在邏輯上可以得到很好的解釋
7)可以交叉驗證的剪枝來選擇模型,從而提高泛化能力。
8) 對於異常點的容錯能力好,健壯性高。
決策樹局限性
1)決策樹算法非常容易過擬合,導致泛化能力不強。可以通過設置節點最少樣本數量和限制決策樹深度來改進。
2)決策樹會因為樣本發生一點點的改動,就會導致樹結構的劇烈改變。這個可以通過集成學習之類的方法解決。
3)尋找最優的決策樹是一個NP難的問題,我們一般是通過啟發式方法,容易陷入局部最優。可以通過集成學習之類的方法來改善。
4)有些比較復雜的關系,決策樹很難學習,比如異或。這個就沒有辦法了,一般這種關系可以換神經網絡分類方法來解決。
5)如果某些特征的樣本比例過大,生成決策樹容易偏向於這些特征。這個可以通過調節樣本權重來改善。
例子:
(表1)
根據以上決策樹,現在給你一個實例:{色澤:青綠,根蒂:稍蜷,敲聲:清脆,紋理:清晰,臍部:稍凹,觸感:光滑},來判斷該瓜是否是好瓜。其過程是:臍部(稍凹)-->根蒂(稍蜷)-->色澤(青綠)-->好瓜。
以上是由決策樹來進行分類的過程。而決策樹的學習(構建)通常是一個遞歸地選擇最優特征的過程。那么構建決策樹時如何選擇特征作為划分點(即選擇哪個特征作為根節點或者選擇哪個特征作為非葉子節點)?當訓練數據量大、特征數量較多時構建的決策樹可能很龐大,這樣的決策樹用來分類是否好?
由這些問題我們可以知道,構建決策樹的三個要點:
(1)特征選擇
(2)決策樹的生成
(3)決策樹修剪
2. 決策樹算法
- ID3:信息增益(存在的問題:每個數據都有一個ID特征(1,2,3,…,14),根據該特征分類之后的熵值恆為 0 ,但是實際上根據這個特征分類毫無意義)
- C4.5:信息增益率(是ID3的升級,考慮自身熵值)
- CART:使用GINI系數來作為衡量標准
2.1 ID3算法
基於ID3算法的決策樹構建,其選擇特征的准則是信息增益。信息增益(information gain)表示得知特征 XX的信息而使得類 YY 的信息的不確定性減少的程度。也就是說,信息增益越大,通過特征 XX ,就越能夠准確地將樣本進行分類;信息增益越小,越無法准確進行分類。
在介紹信息增益之前,我們需要先對熵進行一下講解。
(1) 熵(Entropy)
熵是度量樣本集合純度最常用的一種指標,它是信息的期望值。我們首先了解一下什么是信息。由《機器學習實戰》中定義:
而熵計算的是所有類別所有可能值包含的信息期望值,其公式為:

其中 N 為類別個數。
現在使用例子,來理解熵的計算:
(1)對於最終分類(是否為好瓜),計算其信息熵:
由上表(1)可看出,一共有17個樣本,屬於好瓜的有8個樣本,壞瓜的有9個樣本,因此其熵為:
(2)對於特征“色澤”,計算其信息熵:
由於特征“色澤”取值有:{青綠,烏黑,淺白}。若使用該屬性對 DD進行划分,可得到3個子集,分別記為: D1(色澤=青綠), D2 (色澤=烏黑), D3 (色澤=淺白)。
(2)信息增益(information gain)
信息增益,由《統計學習方法》中定義:
(3)算法步驟
ID3算法遞歸地構建決策樹,從根節點開始,對所有特征計算信息增益,選擇信息增益最大的特征作為節點的特征,由該特征的不同取值建立子節點;再對子節點遞歸地調用以上方法構建決策樹;知道所有特征的信息增益均很小或者沒有特征可以選擇為止。最后得到一個決策樹。
在算法中(C4.5也是),有三種情形導致遞歸返回:
(1)當前節點包含的樣本全屬於同一類別,無需划分。
(2)當前屬性集為空,或是所有樣本在所有屬性上取值相同,無法划分。(此時將所含樣本最多的類別設置為該葉子節點類別)
(3)當前節點包含的樣本集合為空,不能划分。(將其父節點中樣本最多的類別設置為該葉子節點的類別)
2.2 C4.5算法
實際上,信息增益准則對可取值書目較多的屬性有所偏好,例如如果將前面表格中的第一列ID也作為特征的話,它的信息增益將達到最大值,而這樣做顯然不對,會造成過擬合。為了減少這種偏好可能帶來的不利影響,C4.5算法中將采用信息增益比來進行特征的選擇。信息增益比准則對可取值數目較少的屬性有所偏好。接下來,我們首先對信息增益比進行介紹。
(1)信息增益比(增益率)
(2)算法步驟
C4.5算法同ID3算法過程相似,僅在選擇特征時,使用信息增益比作為特征選擇准則。
2.3 剪枝處理
通過驗證集進行剪枝;
針對於在第1部分提到的最后一個問題:當訓練數據量大、特征數量較多時構建的決策樹可能很龐大,這樣的決策樹用來分類是否好?答案是否定的。決策樹是依據訓練集進行構建的,當決策樹過於龐大時,可能對訓練集依賴過多,也就是對訓練數據過度擬合。從訓練數據集上看,擬合效果很好,但對於測試數據集或者新的實例來說,並不一定能夠准確預測出其結果。因此,對於決策樹的構建還需要最后一步----即決策樹的修剪。
決策樹的修剪,也就是剪枝操作,主要分為兩種:
(1)預剪枝(Pre-Pruning)
(2)后剪枝(Post-Pruning)
接下來我們將詳細地介紹這兩種剪枝方法。
(1)預剪枝(Pre-Pruning)
預剪枝是指在決策樹生成過程中,對每個節點在划分前先進行估計,若當前節點的划分不能帶來決策樹泛化性能的提升,則停止划分並將當前節點標記為葉節點。
我們使用例子進一步理解預剪枝的過程:
將本文開始的西瓜數據集表划分成兩部分,一部分作為訓練集用來構建決策樹,一部分作為驗證集用來進行決策樹的剪枝。具體划分見下圖:
使用ID3算法進行決策樹的構建,即使用信息增益進行特征的選擇。首先選擇特征“臍部”作為決策樹根節點,如何判斷該節點是否需要剪枝,需要對剪枝前后驗證集精度進行比較。由“臍部”這個特征將產生三個分支“凹陷”、“稍凹”、“平坦”,並認定其分支結果(可采用多數表決法,當分類數量相當時,任選一類即可),如下圖:
可有由圖中看出,該決策樹有點過於簡單,雖然降低的過擬合的風險,但是由於其基於“貪心”的本質禁止了其它分支的展開,給預剪枝決策樹帶來了欠擬合的風險。
(2) 后剪枝(Post-Pruning)
后剪枝是指先從訓練集生成一棵完整的決策樹,然后自底向上地對非葉節點進行考察,若將該節點對應的子樹替換為葉節點能帶來決策能力的提升,則將該子樹替換成葉節點。
我們使用例子進一步理解后剪枝的過程:
同樣適用1中的划分數據集。針對已建立好的決策樹,我們首先對“紋理”特征節點進行處理,判斷其是否需要剪枝,見下圖。
后剪枝決策樹通常比預剪枝決策樹保留了更多的分支,一般情況下,后剪枝決策樹欠擬合的風險很小,其泛化能力往往優於預剪枝預測數。但由於其是基於創建完決策樹之后,再對決策樹進行自底向上地剪枝判斷,因此訓練時間開銷會比預剪枝或者不剪枝決策樹要大。
2.4 CART算法
接下來將以一個實際的例子對CART進行介紹:
從以下的思路理解CART:
分類樹?回歸樹?
分類樹的作用是通過一個對象的特征來預測該對象所屬的類別,而回歸樹的目的是根據一個對象的信息預測該對象的屬性,並以數值表示。
CART既能是分類樹,又能是決策樹,如上表所示,如果我們想預測一個人是否已婚,那么構建的CART將是分類樹;如果想預測一個人的年齡,那么構建的將是回歸樹。
分類樹和回歸樹是怎么做決策的?
假設我們構建了兩棵決策樹分別預測用戶是否已婚和實際的年齡,如圖1和圖2所示:
圖1表示一棵分類樹,其葉子節點的輸出結果為一個實際的類別,在這個例子里是婚姻的情況(已婚或者未婚),選擇葉子節點中數量占比最大的類別作為輸出的類別;
圖2是一棵回歸樹,預測用戶的實際年齡,是一個具體的輸出值。怎樣得到這個輸出值?一般情況下選擇使用中值、平均值或者眾數進行表示,圖2使用節點年齡數據的平均值作為輸出值。
CART如何選擇分裂的屬性?
分裂的目的是為了能夠讓數據變純,使決策樹輸出的結果更接近真實值。那么CART是如何評價節點的純度呢?如果是分類樹,CART采用GINI值衡量節點純度;如果是回歸樹,采用樣本方差衡量節點純度。節點越不純,節點分類或者預測的效果就越差。
CART如何分裂成一棵二叉樹?
節點的分裂分為兩種情況,連續型的數據和離散型的數據。
CART對連續型屬性的處理與C4.5差不多,通過最小化分裂后的GINI值或者樣本方差尋找最優分割點,將節點一分為二,在這里不再敘述,詳細請看C4.5。
對於離散型屬性,理論上有多少個離散值就應該分裂成多少個節點。但CART是一棵二叉樹,每一次分裂只會產生兩個節點,怎么辦呢?很簡單,只要將其中一個離散值獨立作為一個節點,其他的離散值生成另外一個節點即可。這種分裂方案有多少個離散值就有多少種划分的方法,舉一個簡單的例子:如果某離散屬性一個有三個離散值X,Y,Z,則該屬性的分裂方法有{X}、{Y,Z},{Y}、{X,Z},{Z}、{X,Y},分別計算每種划分方法的基尼值或者樣本方差確定最優的方法。
以屬性“職業”為例,一共有三個離散值,“學生”、“老師”、“上班族”。該屬性有三種划分的方案,分別為{“學生”}、{“老師”、“上班族”},{“老師”}、{“學生”、“上班族”},{“上班族”}、{“學生”、“老師”},分別計算三種划分方案的子節點GINI值或者樣本方差,選擇最優的划分方法,如下圖所示:
綜上,如果想預測是否已婚,則選擇{“上班族”}、{“學生”、“老師”}的划分方法,如果想預測年齡,則選擇{“老師”}、{“學生”、“上班族”}的划分方法。
CART如何剪枝?
CART采用基於代價復雜度(cost-complexity pruning,CCP)的剪枝方法。代價復雜度選擇節點表面誤差率增益值最小的非葉子節點,刪除該非葉子節點的左右子節點,若有多個非葉子節點的表面誤差率增益值相同小,則選擇非葉子節點中子節點數最多的非葉子節點進行剪枝。
CCP剪枝主要分為兩部分:
循環剪掉具有最小誤差率增益值的子樹,直到剩下根節點
利用獨立的剪枝集進行評價,獲取最佳剪枝樹
第一部分-修剪: