一、介紹
決策樹(Decision Tree)是一個樹結構(可以是二叉樹或非二叉樹),其中每個非葉節點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節點代表一種類別。機器學習中,決策樹是一個預測模型;他代表的是對象屬性與對象值之間的一種映射關系。
決策樹最重要的是決策樹的構造。所謂決策樹的構造就是進行屬性選擇度量確定各個特征屬性之間的拓撲結構。構造決策樹的關鍵步驟是分裂屬性。所謂分裂屬性就是在某個節點處按照某一特征屬性的不同劃分構造不同的分支,其目標是讓各個分裂子集盡可能地“純”。盡可能“純”就是盡量讓一個分裂子集中待分類項屬于同一類別。分裂屬性分為三種不同的情況:
1、屬性是離散值且不要求生成二叉決策樹。此時用屬性的每一個劃分作為一個分支。
2、屬性是離散值且要求生成二叉決策樹。此時使用屬性劃分的一個子集進行測試,按照“屬于此子集”和“不屬于此子集”分成兩個分支。
3、屬性是連續值。此時確定一個值作為分裂點split_point,按照>split_point和<=split_point生成兩個分支。
決策樹的屬性分裂選擇是”貪心“算法,也就是沒有回溯的。
二、原理
2.1 信息熵
1948年,香農提出了“信息熵”的概念,才解決了對信息的量化度量問題。信息熵這個詞是C.E.香農從熱力學中借用過來的。熱力學中的熱熵是表示分子狀態混亂程度的物理量。香農用信息熵的概念來描述信源的不確定度。
由于信息的冗余性,冗余大小與信息中每個符號(數字、字母或單詞)的出現概率或者說不確定性有關。比如:問明天股票漲還是跌;回答:明天NBA決賽,這兩者似乎沒有什么聯系,所以你的信息量很少。但是回答:因為明天大家都去看NBA決賽,沒人坐莊導致股票大跌。因為你的回答使不確定變得很確定,包含的信息量也就很大。有些事情本來就很確定了,例如太陽從東邊升起,你說一百遍,也沒有絲毫信息量,因為這件事情確定的不能確定了。所以說信息量的大小跟事情不確定性的變化有關。
信息熵的三大性質:
單調性,即發生概率越高的事件,其所攜帶的信息熵越低。極端案例就是“太陽從東方升起”,因為為確定事件,所以不攜帶任何信息量。從信息論的角度,認為這句話沒有消除任何不確定性。
非負性,即信息熵不能為負。這個很好理解,因為負的信息,即你得知了某個信息后,卻增加了不確定性是不合邏輯的。
累加性,即多隨機事件同時發生存在的總不確定性的量度是可以表示為各事件不確定性的量度的和,兩個事件相互獨立有,信息熵H(A,B)=H(A)+H(B);如果兩個事件不相互獨立,那么滿足H(A,B)=H(A)+H(B)-I(A,B) ,其中I(A,B) 是互信息(mutual information),代表一個隨機變量包含另一個隨機變量信息量的度量。
那么,不確定性的變化跟什么有關呢?
一,跟事情的可能結果的數量有關;二,跟概率有關。
一個事件的信息量就是這個事件發生的概率的負對數。信息熵是跟所有可能性有關系的。每個可能事件的發生都有個概率。信息熵就是平均而言發生一個事件我們得到的信息量大小(也就是說信息熵代表某元組標號所需的平均信息量)。所以數學上,信息熵其實是信息量的期望。
信息熵數學表達式,如圖2-1所示:Ent(D)的值越小,則D的純度越高
信息增益: 假定離散屬性a有V個可能的取值{a1,a2,a3,...,av},若用a來對樣本集D進行劃分,則會產生V個分支結點,其中第V個分支結點包含D中所有屬性a上取值為av的樣本,記作DV。數學表達式如圖2-2所示:
一般而言,信息增益越大,則意味著使用屬性a來進行劃分所獲得的“純度提升”越大。
2.2 ID3.5決策樹
通過上述介紹,我們知道了信息熵和決策樹構造過程是一個提純的過程,根據信息熵來判斷我們決策樹構造方向。熵的變化可以被看做是信息增益,決策樹ID3算法的核心思想是以信息增益度量屬性選擇,選擇分裂后信息增益最大的屬性進行劃分。
從信息論知識中我們知道,期望信息越小,信息增益越大,從而純度越高。“純”就是盡量讓一個劃分子集中待分類項屬于同一類別。
舉一個選瓜的例子(周志華《機器學習》),數據如圖2-3所示:
正例(好瓜)占 8/17,反例占 9/17 ,根結點的信息熵為,如圖2-4所示:
根據數據表可知,特征有色澤、根蒂、敲聲、紋理、臍部、觸感等六個特征。我們需要計算每個屬性的信息增益,以此最大程度的“提純”。
首先計算“色澤”,共3個子集{青綠,烏黑,淺白},D1(青綠)={1,4,6,10,13,17},D2(烏黑)={2,3,7,8,9,15},D3(淺白)={5,11,12,14,16}。D1(青綠)集合中正例p1=3/6,反例p2=3/6。D2(烏黑)集合正例 p1=4/6,反例p2=2/6。D3(淺白)集合正例 p1=1/5,反例p2=4/5。計算過程如2-5所示:
根據色澤三個子集的信息熵即可計算出,“色澤”屬性的信息增益,如圖2-6所示:
同理,我們計算出其他屬性信息增益:Gain(D,根蒂)=0.143;Gain(D,敲聲)=0.141
Gain(D,紋理)=0.381;Gain(D,臍部)=0.289;Gain(D,觸感)=0.006
根據之前“提純”的原則,我們選擇信息增益最大作為第一個分支節點。劃分如圖2-7所示:
根據紋理劃分成3個子集,接下來要對每一個子集進行下一步劃分,D1(紋理清晰)={1,2,3,4,5,6,8,10,15},D2(紋理模糊)={7,9,13,14,17},D3(紋理模糊)={11,12,16}。因為D3子集中類別全是壞瓜,所以不需要再做劃分。剩下的屬性集合{色澤,根蒂,敲聲,臍部,觸感},計算D1各屬性信息增益:
Gain(D1,色澤)=0.043; Gain(D1,根蒂)=0.458; Gain(D1,敲聲)=0.331; Gain(D1,臍部)=0.458; Gain(D1,觸感)=0.458
根據“提純”原則,我們繼續劃分可以任意選擇根蒂,臍部,觸感三個屬性其中一個為劃分結點,經過多次劃分至只剩單一類別后,得到決策樹圖2-3所示:
2.3 C4.5決策樹
ID3.5使用信息增益作為“提純”方法,但實際上,信息增益對可取數目較多的屬性有所偏好,所以為了減少這種影響,提出用增益率來選擇最優劃分,也就是C4.5決策樹算法。
增益率定義,如圖2-9所示:可以從式中看出數目越多(V越大),IV(a)會越大,Gain_ratio越小,所以增益率對可取數目較少的屬性有所偏好。因此C4.5并不是直接選取增益率最高的,而是先從劃分屬性從選取信息增益高于平均水平的屬性,再從中選擇信息增益率最高的最為劃分結點。
2.4 CART決策樹
CART決策樹使用“基尼指數”(Gini index)來劃分屬性。數據集D純度使用基尼值來度量,如圖2-10所示:
Gini(D)反映了從數據集D中隨機抽取兩個樣本,其類別標記不一致的概率,因此,Gini(D)越小,則數據集D的純度越高。
屬性a的基尼指數定義,如圖2-11所示:于是我們在候選屬性集合中選擇基尼指數最小的屬性作為最優劃分屬性。
2.5 剪枝處理
剪枝處理是為了解決決策樹分支過多而產生的“過擬合”問題。剪枝策略有“預剪枝”和“后剪枝”。
“預剪枝”是決策樹生成時,計算并比較每個結點劃分前和劃分后的驗證集精度,若劃分前的結點精度要比劃分后高,則剪枝。反之則確認劃分此結點
“后剪枝”是決策樹生成后,自底向上進行計算剪枝前和剪枝后的驗證集精度。若剪枝后比剪枝前的結點精度要高則剪枝,反之保留。
優缺點:
“預剪枝”:由于一邊劃分結點的同時一邊計算精度來決定是否剪枝,所以“預剪枝”可以很有效的減少決策樹訓練時間開銷和測試時間開銷。但由于很多分支還未完成展開并剪去,基于“貪心”本質也很容易忽略后續優秀的分支,導致欠擬合風險。
“后剪枝”:由于需要完全生成一顆決策樹后再進行計算剪枝,導致時間開銷的增加,但是欠擬合的風險很小。
2.6 連續值處理
當數據集中出現了連續屬性如何使用決策樹進行劃分結點?由于連續屬性相對于離散屬性可取數目不是有限的,所以不能直接根據連續屬性可選值進行劃分。
最簡單的策略使用二分法:
樣本集D中有連續屬性a,我們先進行排序{a1,a2,a3....,an}。劃分時,以任意t為例,有1<=t<=n-1,,即把區間[ai,ai+1)的中位點
作為候選點。然后即可像考慮離散屬性值一樣考慮這些劃分點:
Gain(D,a,t)是樣本集基于劃分點t二分后的信息增益,我們選擇Gain(D,a,t)最大的為劃分點。
2.7 缺失值處理
當遇到樣本中某屬性的值缺失的情況下如何進行劃分屬性選擇?
我們假設樣本集D和屬性a,用D~ 表示在D中屬性a上沒有缺失的樣本子集,D+表示在D中屬性a上表示的正類,D-表示在D中屬性a上的負類(假設二分類問題)。k表示屬性a中類別。我們可以用p表示無缺失值樣本所占的比例,pk+表示無缺失值樣本中第k類正例在第k類中所占的比例,Pk-表示無缺失值樣本中第k類負例在第k類中所占的比例,r表示無缺失值樣本中第k類在屬性a中無缺失樣本子集D~所占比例。定義如圖2-15 所示:
基于上述定義,我們可將信息增益計算公式推廣,如圖2-16所示:
例:有下列有缺失的西瓜數據集,如圖2-17所示:
我們以色澤為例來計算色澤屬性下各類別的信息增益,以此作為結點劃分依據。
樣本集D中有17個樣例,色澤屬性中無缺失的樣例子集D~編號有{2,3,4,6,7,8,9,10,11,12,14,15,16,17}。
D~信息熵,計算如圖2-20所示:
樣本集屬性為色澤的信息增益為:
然后計算出其它所有屬性在D中的信息增益。選擇信息增益最大的為最佳劃分結點
三、代碼實現
3.1 決策樹構建流程
- 遍歷并評估每個特征
- 判斷是否某個分支下的數據屬于同一類型,如果是則返回作為標簽,否之繼續。
- 尋找劃分數據集的最好特征
- 劃分數據集
- 創建分支節點
- 遞歸調用創建新的分支節點函數createBranch
3.2構建決策樹預測隱形眼鏡類型
參考《機器學習實戰》第三章Logistic回歸樣例:使用決策樹預測隱形眼鏡類型
預測隱形眼鏡訓練集樣本如圖3-1所示:
根據特征劃分數據集,這樣可以依次計算出各屬性的信息增益,以此對比選擇最好的劃分節點。代碼如圖3-2所示
計算給定數據集的信息熵,代碼如圖3-3所示:
8 ~ 12行代碼統計了給定樣本集分類結果的各占的數量,14~16行計算出樣本信息熵 圖3-4
計算出信息熵后,接下來要計算每個屬性的信息增益,等到信息增益最大的屬性,代碼如圖3-5所示:
39 ~ 51行遍歷屬性a中總共有v個可能的值,計算{a1,a2,......,av}各自信息熵和信息增益,并篩選出最大的信息增益,計算信息增益表達式如圖3-6所示:
當程序遍歷完所有劃分數據集的屬性或者每個分支所有實例都具有相同的分類,那么就可以結束算法。但是很多情況特征數目并不是每次劃分數據分組的時候都減少,如C4.5和CART算法,因此我們可以設置算法劃分的一個最大分組數目作為結束分支的閾值。而且如果數據集已處理完了所有屬性,但是類標簽依然不是唯一的,我們通常會選取分類最多的最為該節點分類。代碼如圖3-7所示:
最后構建整個決策樹的代碼如圖3-8所示:
66行~67行,判斷類別是否都完全相同,相同則返回此類別結束。
69~70行,判斷是否遍歷完了所有特征,是則選擇屬性分類最多的最后的節點。
71~72行,選擇最好的劃分子節點,獲取其標簽。
74~79行,將已劃分節點的類別從數據集中劃分出來,再用數據集剩下的子集劃分子樹。
最后導入數據集,得出結果,代碼如圖3-9所示:
結果樹狀圖如圖3-10所示:
四、總結
本章主要介紹了ID3、C4.5、CART決策樹算法計算信息的增益、信息增益率、基尼不純度等方法來度量數據集的無序程度,簡單來說就是從一個數據集中隨機選取子項,度量其被錯誤分類到其他分組里的概率。通過這些決策樹算法我們能夠根據實際情況正確的劃分數據集,但是為了避免過擬合問題,又有了前剪枝和后剪枝。對非離散的數據集和缺失的數據集又有合理的解決方案。
決策樹優點:
決策樹易于理解和實現,它能夠直接體現數據的特點,而不需要使用者了解更多的背景知識
數據的準備可以很簡單或者是不必要的,而且能夠同時處理數據型和常規型屬性,在相對短的時間內能夠對大型數據源做出可行且效果良好的結果。
易于通過靜態測試來對模型進行評測,可以測定模型可信度;如果給定一個觀察的模型,那么根據所產生的決策樹很容易推出相應的邏輯表達式
決策樹缺點:
對連續性的字段比較難預測。
對有時間順序的數據,需要很多預處理的工作。
當類別太多時,錯誤可能就會增加的比較快。
一般的算法分類的時候,只是根據一個字段來分類。