決策樹原理詳解及sklearn代碼實例

1.決策樹

1.1基本流程

決策樹(decsioin tree)是一種常見的機器學習方法,例如西瓜書中的二分類任務,判斷瓜的好壞。決策樹如下:
西瓜判斷決策樹
可以看到此使判斷西瓜是否好壞,則通過色澤,根蒂,敲聲等一些列屬性來得出結果。
 一般的,一顆決策樹包括一個根節點,若干個內部接待你和若干個葉結點;葉節點對應於決策結果,其他結點則對應一個屬性測試;從根節點大到每個葉結點的路徑對應了一個判定測試序列。決策樹學習的目的是根據輸入生成一個泛化能力強的決策樹,基本算法如下;
決策樹生成算法
決策樹的生成是一個遞歸的過策劃的過程,有3種情形或導致遞歸返回(即不會生成對應的決策結果葉結點)
算髮的輸入是所有樣本的集合,而個體樣本又包括此樣本的類別已經所帶的屬性

1.當前結點包含的樣本屬於同一類別,無需劃分
2.當前屬性集爲空或者所有樣本在所有屬性上取值相同,無法劃分(屬性相同,但是類別不同)
3.當前結點包含的樣本集合爲空,不能劃分。(即沒有一個類別對應此跳屬性序列)

解決方法:
在(2)情形下,我們把當前結點標記爲葉節點,並將其類別設定爲該結點所含樣本做多的類別
在(3)情形下,同樣把當前結點標記爲葉結點,但是將其類別設定爲其父節點所含樣本最多的類別

兩種處理的實質區別:(2)是利用當前結點的後驗分佈 (3)是把父節點的樣本分佈作爲當前結點的先驗分佈。
簡單理解即(2)有多個類別,只是不知道如何劃分爲好,所以選取樣本最多的類別;(3)無對應的類別,只能依據之前的類別劃分來進行劃分,即根據其父節點。這樣處理的原因是爲了提高決策樹的泛化能力。

先驗分佈/後驗分佈詳細講解參見:https://blog.csdn.net/qq_23947237/article/details/78265026

1.2 劃分選擇

由上述算法可以看出,決策樹學習的關鍵是第8行如何選擇最後劃分屬性,一般而言,隨着劃分過程的不斷進行,我們希望決策樹的分支結點包含的樣本儘可能屬於同一類別,即結點’純度’越來越高。這個最純淨在數學上叫純度,純度通俗點理解就是目標變量要分得足夠開(y=1的和y=0的混到一起就會不純)。

決策樹學習:採用自頂向下的遞歸的方法,基本思想是以信息熵爲度量構造一棵熵值下降最快的樹,到葉子節點處熵值爲0(葉節點中的實例都屬於一類)。

通俗講,決策樹思想,實際上就是尋找最純淨的劃分,在數學上叫純度。不純度的選取有多種方法,每種方法也就形成了不同的決策樹方法,比如ID3算法使用信息增益作爲不純度;C4.5算法使用信息增益率作爲不純度;CART算法使用基尼係數作爲不純度。

而決策樹要達到尋找最純淨劃分的目標要幹兩件事,建樹和剪枝

1.3 建樹(如何按次序選擇屬性)

也就是首先樹根上以及樹節點是哪個變量呢?這些變量是從最重要到次重要依次排序的,那怎麼衡量這些變量的重要性呢? ID3算法用的是信息增益,C4.5算法用信息增益率;CART算法使用基尼係數。決策樹方法是會把每個特徵都試一遍,然後選取那個,能夠使分類分的最好的特徵,也就是說將A屬性作爲父節點,產生的純度增益(GainA)要大於B屬性作爲父節點,則A作爲優先選取的屬性。以下摘自西瓜書種三種算法的解釋:

1.3.1信息增益

信息增益
簡單來講使用信息增益構建決策樹的過程如下;
1.根據輸入的數據,按照公式(4.1)計算當前情況下的信息熵,
2.將信息熵代入(4.2),求出所有爲確定的屬性的信息增益
3.將信息增益最大的屬性作爲該層結點(屬性確定)
4.繼續對該結點下的未確定的屬性計算信息增益,直到無子節點,再計算其餘可劃分結點,重複2.3.

1.3.2增益率
實際上,信息增益準則對可取數值數目較多的屬性有所偏好,爲減少這種簽好可能帶來的不利影響,C4.5決策樹選用增益率作爲劃分依據。增益率定義爲:
增益率公式
IV(a)稱爲屬性a的"固有值",屬性a的可能取值數目越多(V越大),則IV(a)通常會越大,增益率公式將增益信息和數目掛鉤,但是可能會對數據較少的屬性有所偏好,因此C4.5並不是選取最大的增益率來劃分屬性,而是使用一個啓發式

啓發式:先從候選劃分屬性中找出信息增益高於平均水平的屬性,再從中選擇增益率最高的。

1.3.3 基尼指數
 CART決策樹使用基尼指數來劃分樹叢,採用於(4.1)相同的符號,數據集D的純度可用基尼值來度量:
基尼指數
與前面二者不同,基尼指數選擇指數最小的屬性作爲最優劃分屬性。

三種方法對比:
ID3的缺點,傾向於選擇水平數量較多的變量,可能導致訓練得到一個龐大且深度淺的樹;另外輸入變量必須是分類變量(連續變量必須離散化);最後無法處理空值。
C4.5選擇了信息增益率替代信息增益。
CART以基尼係數替代熵;最小化不純度而不是最大化信息增益。

1.4 剪枝

剪枝
下面這六種情況都會停止分裂。其中第一種其實屬於樹的完全長成,但這會出現過擬合問題,所有之前很流行一種抑制這種情況的方法,叫樹的剪枝。樹的剪枝分爲預剪枝和後剪枝,預剪枝,及早的停止樹增長控制樹的規模,方法可以參考如下6點停止分類的條件。後剪枝在已生成過擬合決策樹上進行剪枝,刪除沒有意義的組,可以得到簡化版的剪枝決策樹,包括REP(設定一定的誤分類率,減掉對誤分類率上升不超過閾值的多餘樹)、PEP,還有一種CCP,即給分裂準則—基尼係數加上懲罰項,此時樹的層數越深,基尼係數的懲罰項會越大。
剪枝
1.4.1預剪枝

&esmp;簡單講首先根據上述三種算法中的一個,來確定一個屬性,然後計算預剪枝決策樹劃分樹的劃分前後精度,如果精度降低則禁止劃分,但是,預剪枝使得決策樹的很多分支都沒有"展開",這不僅降低了過擬合的風險,還顯著減少了決策樹的訓練時間和開銷和測試時間開銷。但是另一方面,有些分支的當前劃分雖然不能提升泛化性能,甚至可能導致泛化性能暫時下降,但在此基礎上進行後續劃分缺可能會提升,因此預剪枝可能會帶來過擬合的風險。

1.4.2後剪枝

 後剪枝則是根據完整的決策樹,先從最下層的結點的開始,先將其作爲葉結點,然後根據屬兔數據計算改變前後的精度,如果精度變高則刪除此結點。西瓜書中借用西瓜來做實例講解如下;
訓練集和驗證集
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

預剪枝和後剪枝的比較;

後剪枝可以保留更多的分支,一般情況下,後剪枝決策樹的欠擬合風險很小,泛化性能優於預剪枝決策樹。
但是後剪枝是在完成決策樹之後進行的,自底向上,代價大於預剪枝。

1.5決策樹的輸入數據

1.5.1離散型屬性
 對於離散型屬性,可以通過上述的信息增益,增益率,基尼指數來生成對應的初步決策樹
1.5.2連續性屬性
 對於連續屬性,屬性數目不在有限(即一個屬性可以分爲無限多個屬性),此時要對數據進行離散化,最簡單的就是採用二分法進行處理,這也是C4.5決策樹中採用的機制。我們基於離散數據的信息增益推到出連續性對用的公式如下;
二分化離散
通過計算出讓連續型屬性信息增益的最大化劃分點,然後再與其他屬性的信息增益進行比較進行建樹。

需要注意的是,與離散屬性不用,若當前結點劃分屬性爲連續屬性,該屬性還可作爲其後代結點的劃分屬性

1.5.3空值屬性
 面對缺失值我們要考慮:(1)如何在屬性缺失的情況下進行劃分屬性選擇? (2)給定劃分屬性,若樣本在該屬性上的值缺失,如何對樣本進行劃分?
簡單來講,1是指建樹時如何對缺失屬性值的屬性求其增益屬性,2指在構建好決策樹後,若驗證樣本中某屬性指缺失,輸入決策樹後,如何對其進行處理判斷。
對於(1)情況,對離散型數據信息增益進行變形得到如下的新表達式:
具體推導過程見周志華的<<機器學習>>第四章。
缺失值情況下的信息增益公式
該公式將訓練集中該屬性的缺失情況和爲缺失樣本中具體屬性值所佔比例作爲影響因素加入到公式中,解決了問題(1).

在這裏插入圖片描述

2.總結:

決策樹的一些優點:
1.分類規則清晰,易於理解和解釋,樹可以可視化。
2.使用樹的花費(例如預測數據)是訓練數據點(data points)數量的對數。
3.可以處理不同綱量的值,例如同時處理數值變量和分類變量,其他方法大都只適用分析一種變量的集合。
4.幾乎不需要數據預處理。其他方法經常需要數據標準化,創建虛擬變量和刪除缺失值。
5.可以使用統計檢驗檢驗模型。這樣做被認爲是提高模型的可行度。
6.決策樹不需要做變量篩選,它會自動篩選;適合處理高維度數據。
7.可以處理多輸出問題。

決策樹的一些缺點:
1.決策樹可能是不穩定的,因爲即使非常小的變異,可能會產生一顆完全不同的樹。這個問題通過decision trees with an ensemble來緩解。
2.貪婪算法(可能找不到最好的樹)
3.如果某些分類佔優勢,決策樹將會創建一棵有偏差的樹。因此,建議在訓練之前,先抽樣使樣本均衡。
4.沒有考慮變量之間相關性,每次篩選都只考慮一個變量(因此不需要歸一化)
5.只能線性分割數據。

ID3是基本的決策樹構建算法,作爲決策樹經典的構建算法,其具有結構簡單、清晰易懂的特點。雖然ID3比較靈活方便,但是有以下幾個缺點:

(1)採用信息增益進行分裂,分裂的精確度可能沒有采用信息增益率進行分裂高

(2)不能處理連續型數據,只能通過離散化將連續性數據轉化爲離散型數據

(3)不能處理缺省值

(4)沒有對決策樹進行剪枝處理,很可能會出現過擬合的問題

C4.5算法繼承了ID3算法的優點,並在以下幾方面對ID3算法進行了改進:

  1. 用信息增益率來選擇屬性,克服了用信息增益選擇屬性時偏向選擇取值多的屬性的不足;

  2. 在樹構造過程中進行剪枝;

  3. 能夠完成對連續屬性的離散化處理;

  4. 能夠對不完整數據進行處理。

C4.5算法有如下優點:產生的分類規則易於理解,準確率較高。其缺點是:在構造樹的過程中,需要對數據集進行多次的順序掃描和排序,因而導致算法的低效。此外,C4.5只適合於能夠駐留於內存的數據集,當訓練集大得無法在內存容納時程序無法運行。

另外,無論是ID3還是C4.5最好在小數據集上使用,決策樹分類一般只試用於小數據。當屬性取值很多時最好選擇C4.5算法,ID3得出的效果會非常差。

3.sklearn代碼實現

3.1 二分類和多分類

 在sklearn中的DecisionTreeClassifier 能對數據進行多分類和二分類任務。和其他分類器一樣,DecisionTreeClassifier 有兩個向量輸入:X,稀疏或密集,大小爲[n_sample,n_fearure],存放訓練樣本; Y,值爲整型,大小爲[n_sample],存放訓練樣本的分類標籤:實例代碼如下:
分類實例
3.2 迴歸問題

決策樹也可用來解決迴歸問題,使用 DecisionTreeRegressor 類。

和分類一樣,擬合方法也需要兩個向量參數,X 和 y,不同的是這裏y是浮點型數據,而不是整型:

>>> from sklearn import tree
>>> X = [[0, 0], [2, 2]]
>>> y = [0.5, 2.5]
>>> clf = tree.DecisionTreeRegressor()
>>> clf = clf.fit(X, y)
>>> clf.predict([[1, 1]])
array([ 0.5])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章