注:本文適合初學者。
基本概念
決策樹學習是一種采用樹狀結構的有監督機器學習方法。決策樹是一個預測模型,表示對象特征和對象值之間的一種映射。其不需要學習者有多少相關領域知識,是一種非常直觀易於理解的算法。
例,預測貸款用戶是否具有償還貸款的能力的決策樹:
每個用戶(樣本)有三個屬性(特征):是否擁有房產,是否已婚,年收入。現在給定一個用戶A(無房產,單身,年收入55K),那么根據上面決策樹,按照藍色虛線路徑可以預測該用戶沒有償還貸款能力。
可以看出,決策樹的每個非葉子節點存儲的是用於分類的特征,其分支代表這個特征在某個值上的輸出,而每個葉子節點存儲的就是最終的類別信息。
簡而言之,利用決策樹進行預測的過程就是從根節點開始,根據樣本的特征屬性選擇不同的分支,直到到達葉子結點,得出預測結果的過程。
決策樹優點:1).決策樹模型可以讀性好,具有描述性,有助於人工分析;2).效率高,決策樹只需要一次構建,反復使用,每一次預測的最大計算次數不超過決策樹的深度(特征均為離散特征)。
構造決策樹
構造決策樹就是根據現有樣本數據生成一個樹結構,現在考慮一種最簡單的情況,即樣本數據特征均為離散的,如下。
ID |
擁有房產 |
是否已婚 |
年收入>80K? |
有能力償還債務 |
1 |
是 |
否 |
是 |
是 |
2 |
否 |
是 |
是 |
否 |
3 |
否 |
否 |
否 |
否 |
4 |
是 |
是 |
是 |
是 |
5 |
否 |
否 |
是 |
是 |
6 |
否 |
是 |
否 |
否 |
7 |
是 |
否 |
是 |
是 |
8 |
否 |
否 |
是 |
是 |
9 |
否 |
是 |
否 |
否 |
10 |
否 |
否 |
是 |
是 |
假設我們有如上樣本,如何從根節點開始一步步得到一個決策樹呢?
第一步:確定一個分裂屬性(即以樣本數據的哪個特征進行划分)。
此處確定最優划分特征的方法是整個決策樹的關鍵部分。最優划分特征的選擇基於一個目標:使得分裂后各個節點數據的“純度”最高。即盡量使得通過該特征進行分類后的分支節點所包含的樣本屬於同一類別。選擇一個合適的特征作為判斷節點,可以快速的分類,減少決策樹的深度。
如何量化這種“純度”?
1.信息增益
給出一個信息熵的定義,假設樣本用D表示,
其中pi表示第i個類別在整個訓練元組中出現的概率,可以用屬於此類別元素的數量除以訓練元組元素總數量作為估計。M為類別數,上例中是、否有能力償還貸款,m=2。
熵表示樣本的混亂程度,樣本數據越無序,越混亂,熵就越大。可以考慮通過比較划分特征前后樣本數據熵的變化,來確定樣本的純度變化。
定義信息增益:
其中,a代表划分的特征,特征a有V個可能的取值(a1,a2,…aV),D中在特征a^(v)上取值為的所有樣本定義為D^(v),|D|表示D中樣本個數。
可以認為,信息增益越大,則意味着以特征a來進行划分,所獲得的“純度提升越大”。因此可以遍歷所有特征,選取使得信息增益最大的特征作為當前結點的分裂特征。
需要知道的是信息增益准則對可取值數目較多的特征有所偏好,如果將表1中的ID列也作為特征,可以計算其信息增益,是所有特征里面最大的,因為其將原始樣本分成10個分支,且每個分支都只有一個樣本,純度自然是最高的,但這並沒有泛化能力。
2.增益率
增益率是在信息增益偏向多取值特征的特性上做出的改進,減少了該偏向可能帶來的不利影響。具體定義為:
該公式利用IV(a),表示特征a的一個特性,特征的取值數目越多,則IV的值通常會越大,可以達到消除多取值特征帶來的不利影響。
3.基尼指數
基尼指數用於度量數據集D的純度:
直觀來說,Gini(D)反映了從數據集D隨機選取兩個樣本,其類別標記不一致的概率,則基尼系數越小,代表其純度越高。(與熵類似)
選取合適的純度量化方式,可以從當前樣本數據中找到最好的划分特征,從而將數據集划分為若干個分支。
第二步:觀察划分的各個分支,如果分支中樣本數據均屬於同一類別,則該分支應為葉節點,無需再進行計算;
如果分支中樣本所有特征都相同,無法再繼續分解下去,那么當前分支就為葉節點,類別標記為當前分支中樣本數最多的一種(多數表決);
如果以上均不符合,應針對每一組樣本數據重復第一步的過程,將分支繼續遞歸分解下去,直至每個分支的樣本數據都具有相同的類別。(可以預見的是,樹的層數最大不會超過特征的個數,因為每一層進行分割時,肯定不會采用其上層節點采用的分割特征進行分裂)
以上面的貸款償還能力評價為例,
根節點開始時我們的數據集是所有的10個樣本,通過以信息增益作為純度評價標准,發現最優划分特征為是否有房,這時按照有房和無房兩種情況,將10個樣本分為兩組,然后可以觀察,有房的樣本都具備償還能力,這屬於我們第一個的遞歸停止條件,即此時無需再進行計算,根節點的左子結點即為根節點,在是否有房這一特征上的值為是,則輸出為“具備償還能力”;而其他沒有房的樣本則需要繼續遞歸分割,直至全部都生成葉子節點為止。
注:這種決策樹的自頂向下遞歸分治的方法,屬於貪心算法的一種,雖然其每步都選取了當前最優的分割特征,但是其總體不一定是最優的。
連續值處理:上面的特征默認認為是離散的,即只有有限的幾種情況,但很多時候,特征值常常是連續的,比如具體工資的數額,溫度的數值等等。
這時候不能直接采用上面的特征分割方法,首先需要將連續屬性離散化,最簡單的方法是二分法,就是設置一個閾值,小於這個值的為一類,大於這個值的為另外一類。
給定樣本集D和連續屬性a,假定a在D上出現了n個不同的取值,將其從小到大排序,即為(a1,a2,a3…an)。然后可以計算出n-1個潛在划分點Ti。
即將每兩個相鄰元素的中間點可以看做潛在分裂點,這樣一來,以潛在分裂點為界,就可以將連續數據當作離散的來處理了。但是連續特征的信息增益略有不同,如下
其中,表示以特征a上不大於潛在分裂點t的所有樣本集合,
表示以特征a上大於潛在分裂點t的所有樣本集合。上述公式計算了連續特征的信息增益大小。需要注意的是,采用該方法最多只會產生兩個分支,並且與離散數據不同的是,當其下屬分支繼續划分時,仍可以使用當前划分的連續特征。(因為離散特征划分后一個分支內的樣本數據在該特征上不可能出現多於一種的值,而采用二分法選取的連續特征顯然不具備這一條件。)
剪枝處理:剪枝操作是為了對付決策樹學習算法中“過擬合”的情況,由於決策樹算法會不斷的重復特征的划分過程,或者由於噪聲數據的存在,有時候會使得決策樹分支過多,造成過擬合的情況,即對訓練數據的分類很准確,但是對未知的測試數據的分類確沒那么准確。這種情況下可以采用主動去掉分支的方法來降低過擬合的風險。一般存在“預剪枝”和“后剪枝”兩種策略。
預剪枝即為在決策樹生成過程中,對當前節點的划分結果進行評價,如果該划分不能帶來決策樹泛化能力(即處理未見過示例的能力)的提升,則停止划分,將當前結點標記為葉節點;后剪枝則是先生成一棵完整的決策樹,然后自底向上的對非葉節點進行評價,如果剪掉該枝可以使得泛化性能提升,則將該子樹替換為葉節點。預先剪枝可能過早的終止決策樹的生長,后剪枝一般能夠產生更好的效果。但后剪枝在子樹被剪掉后,決策樹生長的一部分計算就被浪費了。
這里簡單介紹一個剪枝算法,首先明確,我們剪枝的目的是為了減小過擬合帶來的不良影響,降低決策樹模型的復雜度,但是同時也要保證其對於訓練數據有較好的分類效果。因此,定義一個損失函數,如下
其中,a>=0為參數,C(T)表示模型對於訓練數據的預測誤差,我們先不必關心C(T)的具體公式,理解其含義就行。|T|表示葉節點的個數,可用於表示模型的復雜度。可以看出,參數a控制着模型復雜度和對訓練數據擬合程度兩者之間的影響。較大的a促使我們選擇一個較簡單的樹,而較小的a則偏向於對訓練數據的有更好的擬合效果。
因此可以利用上面的損失函數進行剪枝操作,這樣得到的決策樹即考慮到對訓練數據的擬合,又增強了泛化能力。
其他一些剪枝算法有的借助驗證集實現,也有算法通過設置信息增益的閾值來作為剪枝判斷標准,具體的算法過程可以參考相關文獻。
隨機森林:簡單來說就是利用訓練數據生成多個決策樹,形成一個森林,然后利用這個森林對未知數據進行預測,選取投票最多的分類。
參考資料:
http://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html
http://www.ibm.com/developerworks/cn/analytics/library/ba-1507-decisiontree-algorithm/index.html
http://www.cnblogs.com/bourneli/archive/2013/03/15/2961568.html
https://zh.wikipedia.org/wiki/決策樹學習
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/23/2605208.html