一、信息論基礎
(1)熵
信息熵即信息的期望值,熵是用來度量隨機變量的不確定性。數學公式表達如下:

其中負號是用來保證信息量是正數或者零。H(X)就被稱為隨機變量x的熵,它是對所有可能發生的事件產生的信息量的期望。從公式可以得出結論:隨機變量的取值個數越多,狀態數也就越多,信息熵就越大,不確定性就越大。

如上圖所示,當p=0或1時,H=0,隨機變量完全沒有不確定性;當p=0.5時H=1,熵值最大,隨機變量的不確定性最大。
(2)聯合熵
所謂聯合熵就是度量一個聯合分布的隨機變量的不確定性,其物理意義是:觀察一個多個隨機變量的隨機系統所獲得的信息量。數學表達式為:

(3)條件熵
條件熵H(Y|X)表示在一直隨機變量X的條件下,隨機變量Y的不確定性。它被定義為X給定條件下Y的條件概率分布的熵對X的數學期望,具體用公式表達如下:

條件熵相當於聯合熵減去信息熵,即:H(Y|X) = H(X,Y) - H(X)。證明如下:

注意:熵只依賴於隨機變量的分布,與隨機變量取值無關;0log0 = 0
(4)信息增益
信息增益在決策樹算法中是用來選擇特征的指標,信息增益越大,則這個特征的選擇性越好,在概率中定義為:待分類的集合的熵和選定某個特征的條件熵之差(這里只的是經驗熵或經驗條件熵,由於真正的熵並不知道,是根據樣本計算出來的),公式如下:
g(D,A) = H(D) - H(D|A)
根據公式我們可知信息增益是信息熵與條件熵之差
(5)信息增益比
特征選擇時用信息增益進行選擇的一個大問題就是偏向選擇特征值比較多的屬性從而導致過擬合,而信息增益比可以有效校正這一問題,信息增益比的本質是對信息增益乘以一個加權系數,當加權系數較小時,表示抑制該特征。公式表示如下:

其中的HA(D)表達式如下:
,n表示的是特征A的取值個數。
參考:http://www.cnblogs.com/kyrieng/p/8694705.html
二、決策樹的不同分類算法
決策樹是一種基本的分類和回歸方法。其主要優點是模型可讀性強,分類速度快。決策樹的內部結點表示一個特征或者屬性,葉子結點表示一個分類,有向邊則代表了一個划分規則,它的路徑是互斥並且是完備的。決策樹學習主要包括3個步驟:特征選擇(選取對訓練數據具有分類能力的特征)、決策樹的生成、決策樹的修剪。決策樹學習常用的算法有ID3、C4.5、CART。
(一)原理
(1)基本概念
決策樹模型可以認為是if-then規則的集合,也可以認為是定義在特征空間與類空間上的條件概率分布。決策樹將特征空間划分為互不相交的單元,在每個單元定義一個類的概率分布,這就構成了一個條件概率分布。
決策樹的學習目標是:根據給定的訓練數據集構造一個決策樹模型,使得它能夠對樣本進行正確的分類。
決策樹最優化的策略是:損失函數最小化。決策樹的損失函數通常是正則化的極大似然函數。
選擇最優決策樹的問題是個 NP 完全問題。一般采用啟發式方法近似求解這個最優化問題,這時的解為次最優的。
決策樹學習的算法通常遞歸地選擇最優特征,並根據該特征對訓練數據進行分割,使得對各個子數據集有一個最好的分類。
(2)決策樹的生成
構建根結點:將所有訓練數據放在根結點。
選擇一個最優特征:根據這個特征將訓練數據分割成子集,使得各個子集有一個在當前條件下最好的分類(若這些子集已能夠被基本正確分類,則將該子集構成葉結點;若某個子集不能夠被基本正確分類,則對該子集選擇新的最優的特征,繼續對該子集進行分割,構建相應的結點。)
如此遞歸下去,直至所有訓練數據子集都被基本正確分類,或者沒有合適的特征為止。
上面的生成過程容易發生過擬合問題,決策樹解決過擬合的方法通常是對樹進行剪枝,從而使得決策樹具有更好的泛化能力。決策樹的生成對應着模型的局部最優,剪枝則考慮了全局最優。
(二)特征選擇
特征選擇在決策樹模型構建中起着至關重要的作用,常用的特征選擇指標有:信息增益和信息增益比。這兩個指標刻畫了特征的分類能力。前面介紹信息論基礎已經對這兩個指標進行了詳細介紹,這里就不再贅述了。
(三)生成算法
決策樹常用的生成算法有兩種:ID3和C4.5,下面對這兩個算法進行詳細介紹。
(1)ID3
ID3算法的核心是決策樹的每個結點上都應用信息增益准則進行特征選擇,遞歸地構建決策樹。從根結點開始,計算結點所有可能的特征的信息增益,選擇信息增益最大的特征作為結點的特征,由該特征划分出子結點。再對子結點遞歸地調用以上方法,構建決策樹。直到所有特征的信息增益均很小或者沒有特征可以選擇為止,最后得到一個決策樹 。如果不設置特征信息增益的下限,則可能會使得每個葉子都只有一個樣本點,從而划分得太細。
具體的算法步驟如下:

ID3算法的不足:ID3沒有考慮連續特征,比如長度,密度都是連續值,無法在ID3運用。這大大限制了ID3的用途;
ID3采用信息增益大的特征優先建立決策樹的節點。很快就被人發現,在相同條件下,取值比較多的特征比取值少的特征信息增益大。比如一個變量有2個值,各為1/2,另一個變量為3個值,各為1/3,其實他們都是完全不確定的變量,但是取3個值的比取2個值的信息增益大;
ID3算法對於缺失值的情況沒有做考慮;
沒有考慮過擬合的問題。
(2)C4.5
C4.5是對ID3算法的改進,解決了ID3算法的不足。其生成算法與ID3 算法相似,但是C4.5算法在生成過程中用信息增益比來選擇特征。主要對ID3算法問題的改進方式如下:
對於第一個子問題,對於某一個有缺失特征值的特征A。C4.5的思路是將數據分成兩部分,對每個樣本設置一個權重(初始可以都為1),然后划分數據,一部分是有特征值A的數據D1,另一部分是沒有特征A的數據D2. 然后對於沒有缺失特征A的數據集D1來和對應的A特征的各個特征值一起計算加權重后的信息增益比,最后乘上一個系數,這個系數是無特征A缺失的樣本加權后所占加權總樣本的比例。
對於第二個子問題,可以將缺失特征的樣本同時划分入所有的子節點,不過將該樣本的權重按各個子節點樣本的數量比例來分配。比如缺失特征A的樣本a之前權重為1,特征A有3個特征值A1,A2,A3。 3個特征值對應的無缺失A特征的樣本個數為2,3,4.則a同時划分入A1,A2,A3。對應權重調節為2/9,3/9, 4/9。
對於第三個缺失值處理的問題,主要需要解決的是兩個問題,一是在樣本某些特征缺失的情況下選擇划分的屬性,二是選定了划分屬性,對於在該屬性上缺失特征的樣本的處理。
對於第四個問題,C4.5引入了正則化系數進行初步的剪枝。具體方法這里不討論。下篇講CART的時候會詳細討論剪枝的思路。
雖然C4.5改進了ID3算法,但是其本身也存在問題:
由於決策樹算法非常容易過擬合,因此對於生成的決策樹必須要進行剪枝。剪枝的算法有非常多,C4.5的剪枝方法有優化的空間。
C4.5只能用於分類,如果能將決策樹用於回歸的話可以擴大它的使用范圍。
C4.5由於使用了熵模型,里面有大量的耗時的對數運算,如果是連續值還有大量的排序運算。
C4.5生成的是多叉樹,即一個父節點可以有多個節點。很多時候,在計算機中二叉樹模型會比多叉樹運算效率高。如果采用二叉樹,可以提高效率。
為了解決C4.5和ID3存在的問題,一種新的決策樹分類算法便產生了,這就是CART分類樹算法。
(3)CART分類樹算法
CART分類樹算法使用基尼系數來代替信息增益比,基尼系數代表了模型的不純度,基尼系數越小,則不純度越低,特征越好。這和信息增益(比)是相反的。
具體的,在分類問題中,假設有K個類別,第k個類別的概率為pkpk, 則基尼系數的表達式為:

對於個給定的樣本D,假設有K個類別, 第k個類別的數量為Ck,則樣本D的基尼系數表達式為:

特別的,對於樣本D,如果根據特征A的某個值a,把D分成D1和D2兩部分,則在特征A的條件下,D的基尼系數表達式為:

對於CART分類樹連續值的處理問題,其思想和C4.5是相同的,都是將連續的特征離散化。唯一的區別在於在選擇划分點時的度量方式不同,C4.5使用的是信息增益比,則CART分類樹使用的是基尼系數。
CART分類樹算法的具體步驟如下:

下面對以上三種分類樹進行總結:

來源:https://www.cnblogs.com/pinard/p/6053344.html
三、回歸樹算法原理
回歸樹的算法原理這里就放上李航統計學習方法上面的截圖進行說明。

實際上,回歸樹總體流程類似於分類樹,分枝時窮舉每一個特征的每一個閾值,來尋找最優切分特征j和最優切分點s,衡量的方法是平方誤差最小化。分枝直到達到預設的終止條件(如葉子個數上限)就停止。
處理具體問題時,單一的回歸樹肯定是不夠用的。可以利用集成學習中的boosting框架,對回歸樹進行改良升級,得到的新模型就是提升樹(Boosting Decision Tree),在進一步,可以得到梯度提升樹(Gradient Boosting Decision Tree,GBDT),再進一步可以升級到XGBoost。
來源:https://blog.csdn.net/weixin_40604987/article/details/79296427
四、過擬合問題
決策樹模型存在一個極大的問題就是容易過擬合,過擬合產生得原因是決策樹太復雜,使得模型在測試數據集上能很好的進行分類,但是驗證集上分類效果很差。那么應該如何防止過擬合呢?李航統計學習方法上面提及了兩種方式:先剪枝和后剪枝。
剪枝原理如下:


剪枝算法如下:

五、sklearn參數
1、特征選擇標准(criterion):分類決策樹可以使用"gini"或者"entropy",前者代表基尼系數,后者代表信息增益。一般說使用默認的基尼系數"gini"就可以了,即CART算法。除非你更喜歡類似ID3, C4.5的最優特征選擇方法。 回歸決策樹可以使用"mse"或者"mae",前者是均方差,后者是和均值之差的絕對值之和。推薦使用默認的"mse"。一般來說"mse"比"mae"更加精確。除非你想比較二個參數的效果的不同之處。
2、特征划分點選擇標准(splitter):可以使用"best"或者"random"。前者在特征的所有划分點中找出最優的划分點。后者是隨機的在部分划分點中找局部最優的划分點。默認的"best"適合樣本量不大的時候,而如果樣本數據量非常大,此時決策樹構建推薦"random"
3、划分時考慮的最大特征數(max_features):可以使用很多種類型的值,默認是"None",意味着划分時考慮所有的特征數;如果是"log2"意味着划分時最多考慮log2N個特征;如果是"sqrt"或者"auto"意味着划分時最多考慮√N個特征。如果是整數,代表考慮的特征絕對數。如果是浮點數,代表考慮特征百分比,即考慮(百分比xN)取整后的特征數。其中N為樣本總特征數。一般來說,如果樣本特征數不多,比如小於50,我們用默認的"None"就可以了,如果特征數非常多,我們可以靈活使用剛才描述的其他取值來控制划分時考慮的最大特征數,以控制決策樹的生成時間。
4、決策樹最大深度(max_depth): 決策樹的最大深度,默認可以不輸入,如果不輸入的話,決策樹在建立子樹的時候不會限制子樹的深度。一般來說,數據少或者特征少的時候可以不管這個值。如果模型樣本量多,特征也多的情況下,推薦限制這個最大深度,具體的取值取決於數據的分布。常用的可以取值10-100之間。
5、內部節點再划分所需最小樣本數(min_samples_aplit):這個值限制了子樹繼續划分的條件,如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特征來進行划分。 默認是2.如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。我之前的一個項目例子,有大概10萬樣本,建立決策樹時,我選擇了min_samples_split=10。
6、葉子節點最少樣本數(min_samples_leaf):這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。 默認是1,可以輸入最少的樣本數的整數,或者最少樣本數占樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。之前的10萬樣本項目使用min_samples_leaf的值為5。
7、葉子節點最小的樣本權重和(min_weight_fraction_leaf):這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝。 默認是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分布類別偏差很大,就會引入樣本權重,這時我們就要注意這個值了。
8、最大葉子節點數(max_leaf_nodes):通過限制最大葉子節點數,可以防止過擬合,默認是"None”,即不限制最大的葉子節點數。如果加了限制,算法會建立在最大葉子節點數內最優的決策樹。如果特征不多,可以不考慮這個值,但是如果特征分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。
9、節點划分最小不純度(min_impurity_split):這個值限制了決策樹的增長,如果某節點的不純度(基尼系數,信息增益,均方差,絕對差)小於這個閾值,則該節點不再生成子節點。即為葉子節點 。
10、類別權重(class_weight):定樣本各類別的的權重,主要是為了防止訓練集某些類別的樣本過多,導致訓練的決策樹過於偏向這些類別。這里可以自己指定各個樣本的權重,或者用“balanced”,如果使用“balanced”,則算法會自己計算權重,樣本量少的類別所對應的樣本權重會高。當然,如果你的樣本類別分布沒有明顯的偏倚,則可以不管這個參數,選擇默認的"None",主要是分類決策樹使用這個參數,回歸樹不適用。
來源:https://www.cnblogs.com/pinard/p/6056319.html
