決策樹
決策樹模型是一種樹形結構,基於特征對實例進行分類或回歸的過程。即根據某個特征把數據分划分到若干個子區域(子樹),再對子區域遞歸划分,直到滿足某個條件則停止划分並作為葉子節點,不滿足條件則繼續遞歸划分。
一個簡單的決策樹分類模型:紅色框出的是特征。

決策樹模型學習過程通常包3個步驟:特征選擇、決策樹的生成、決策樹的修剪。
1.特征選擇
選擇特征順序的不同將會產生不同決策樹,選擇好的特征能使得各個子集下標簽更純凈。度量特征對產生子集的好壞有若干方法,如誤差率,信息增益、信息增益比和基尼指數等。
1.1誤差率
訓練數據D被特征A分在若干子結點后,選擇子節點中出現數目最多的類標簽作為此結點的返回值,記為yc^。則誤差率定義為1|D|∑i=1|Dc|I{yi≠yc}
1.2信息增益
熵與條件熵:熵表示隨機變量不確定性的度量。設計隨機變量X為有限離散隨機變量,且pi=P(X=xi)。熵的定義為H(X)=?∑ni=1pilog(pi)。熵越大,隨機變量的不確定性就越大,當X取某個離散值時概率為1時,則對應的熵H(X)為0,表示隨機變量沒有不確定性。條件熵:表示已知隨機變量X的條件下隨機變量Y的不確定性,定義H(Y|X)=∑ni=1piH(Y|X=xi),其中pi=P(X=xi)。這里X表示某個特征,即表示根據某個特征划分后,數據Y的熵。如果某個特征有更強的分類能力,則條件熵H(Y|X)越小,表示不確定性越小。
信息增益:特征A對訓練數據集D的信息增益定義為g(D,A)=H(D)-H(D|A).即有特征值A使得數據D的不確定性下降的程度。所以信息增益越大,表明特征具有更強的分類能力。
1.3信息增益比
信息增益比也是度量特征分類能力的方法。定義訓練數據D關於特征A的值的熵HA(D)=?∑ni=1|Di||D|log2(|Di||D|),|D|表示訓練數據的總數,|Di|表示訓練數據D中特征A取第i個值的總數目。信息增益比越大,表明特征分類能力越強。
gR(D,A)=g(D,A)HA(D)
1.4基尼指數
假設隨機變量X可以取K的離散值,p(X=k)=pk則X的基尼指數定義為:Gini(X)=∑Kk=pk(1-pk)=1-∑Kk=1-pk2.對於給定的樣本集合D,其基尼指數為Gini(D)=1?∑Kk=1(|Ck||D|)2,|Ck|是D中屬於第k類的樣本個數,K是類的個數。基尼指數表示樣本集合的不確定性程度,所以基尼指數越小,對應的特征分類能力越強。
下圖表示一個二分類的情況下,度量樣本集合的不確定性程度幾種方法。熵(Entropy),基尼指數(Gini),誤差率的關系(Error rate).為了方便比較熵被縮小一半。

2.決策樹的生成
ID3與C4.5都是決策樹的經典分類決策樹算法。唯一不同的是ID3算法采用信息增益作為特征選擇准則,而C4.5采用的是信息增益比的方法。下面介紹ID3決定樹生成算法的過程,C4.5類似。
ID3算法
從根節點開始,在數據集D上計算所有可能的特征A分別計算信息增益,選擇信息增益最大的特征作為分類條件,對該特征不同的取值分別建立子集作為子節點,最對子集遞歸地調用以上方法。直到沒有特征可以選擇或者信息增益很小為止。
下面的代碼來自《機器學習實戰》
- <span style="background-color:rgb(255,255,255)"><code class="hljs python">def createTree(dataSet, labels) :
- classList = [example[-1] for example in dataSet]
- if classList.count(classList[0] ) == len(classList) :#數據集全部屬於同一個類別
- return classList[0] #返回這個類別,並作為葉子結點
- if len(dataSet[0]) == 1: #沒有特征可以選擇
- return majorityCnt(classList) #返回數目最多的類別,並作為葉子結點
- bestFeat = chooseBestFeatureToSplit(dataSet) #選擇信息增益最大的特征A
- bestFeatLabel = labels[bestFeat]
- myTree = {bestFeatLabel : {}}#建立結點
- del (labels[bestFeat]) #特征集中去除特征A
- featValues = [example[bestFeat] for example in dataSet] #特征A下的所有可能的取值
- uniqueVals = set(featValues)#去重
- for value in uniqueVals: #對可能取值分別建立子樹
- subLabels = labels[ : ]
- myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels)#遞歸建立子樹
- return myTree</code></span>
3.決策樹剪枝
不考慮復雜度的情況下,一個完全生長樹很容易過擬合,對訓練數據擬合很好,但對預測數據效果很差。因此要對生成的決策樹做修剪,剪掉一些不必要的branch.可以通過增加正則項來控制決策樹的復雜度。定義Cα(T)表示決策樹的損失,C(T)表示模型對訓練數據的預測誤差。|T|表示模型的復雜度,即葉子節點的數目。
Cα(T)=C(T)+α|T|
參數α權衡訓練誤差與模型復雜度。
(1)計算每個節點的經驗熵
(2)遞歸地從樹的葉節點向上回溯,計算葉節點回溯到父節點之前與之后的損失Cα(TB)與Cα(TA),如果Cα(TA),代表修剪此節點后,損失函數更小,則進行剪枝。
(3)返回(2),直到不能繼續為止。
4.CART算法
CART(Classification and regression tree)算法一種即能做分類又能做分類的決策樹算法。
特征選擇
回歸樹采用平方誤差最小化准則:數據集D的平方誤差定義為∑|D|i=1(yi?y′)2,其中y′表示數據集D的平均值。
分類樹選擇基尼指數最小化准則。
CART樹生成
回歸樹的生成
(1)考慮數據集D上的所有特征,遍歷每一個特征下所有可能的取值或者切分點,對數據集D划分成兩部分D1和D2
(2)分別計算上述兩個子集的平方誤差和,選擇最小的平方誤差對應的特征與分割點,生成兩個子節點。
(3)對上述兩個子節點遞歸調用(1)(2),直到沒有特征可以選擇,或者子節點數目很小或者平方誤差小於閾值為止,作為葉子節點,並返回節點內樣本的均值(也可以在葉子節點內訓練回歸模型作為預測值)。
分類樹的生成
(1)考慮數據集D上的所有特征,遍歷每一個特征下所有可能的取值或者切分點,對數據集D划分成兩部分D1和D2
(2)分別計算上述兩個子集的基尼指數的和,選擇最小的基尼指數的和對應的特征與分割點,生成兩個子節點。
(3)對上述兩個子節點遞歸調用(1)(2),直到沒有特征可以選擇,或者子節點數目小於閾值或者基尼指數小於閾值為止,作為葉子節點,並返回類別數目最多的類別。
CART的剪枝
CART的剪枝算法,從決策樹T0的底端不斷剪枝,直到根節點。計算完全生長樹的內部的每一個結點t的剪枝系數g(t),剪枝系數代表修剪后整體損失減小的程度,即修剪前與修剪后的數據的誤差下降的程度。在T0中剪去最小的g(t),得到的子樹作為T1,如此剪下去,直到根節點。利用獨立的驗證集,測試子樹序列T0,T1,T2...,Tn每個子樹的平方誤差或者基尼指數。數值最小的決策樹作為最優的決策樹。
5.隨機森林
最簡單的RF(Random Forest)算法是bagging+完全生長CART樹的組合。
通過bagging方法是建立多個分類或者回歸模型,最后采用投票或平均作為預測值,可以降低過擬合。

bagging對訓練樣本采用boostrap采樣方法進行M輪,分別建立決策樹。由於每輪采用出的樣本子集基本不相同,訓練的模型相關性會降低小。為了進一步降低模型間的相關性,每輪訓練前可以對訓練數據的特征進行隨機采樣,也可以在決策樹的每個branch上進行隨機特征選擇。