[ML學習筆記] 決策樹與隨機森林(Decision Tree&Random Forest)

[ML學習筆記] 決策樹與隨機森林(Decision Tree&Random Forest)


決策樹

決策樹算法以樹狀結構表示數據分類的結果。每一個決策點實現一個具備離散輸出的測試函數,記爲分支。html

一棵決策樹的組成:根節點、非葉子節點(決策點)、葉子節點、分支node

算法分爲兩個步驟:1. 訓練階段(建模) 2. 分類階段(應用)python


熵的概念

設用P(X)表明X發生的機率,H(X)表明X發生的不肯定性,則有:P(X)越大,H(X)越小;P(X)越小,H(X)越大。算法

信息熵的一句話解釋是:消除不肯定性的程度。熵 =$ -\sum_{i=1}^nP_i\log(P_i)$dom

當熵較小時表示集合較純,分類效果較好。所以,構造樹的基本想法是隨着樹深度的增長,節點的熵迅速下降,下降的速度越快越好,這樣纔有望獲得一棵高度最矮的決策樹。函數


如何劃分

爲了知足上述基本想法,想要選取一個劃分標準來爲當前集合分類,須要定義一個指標來評判分類效果。學習

常見的有如下三種指標:測試

ID3:信息增益(劃分前熵值 - 劃分後熵值)
C4.5:信息增益率(信息增益 / 劃分前的熵值)
CART:Gini係數spa

最傳統的作法就是選取信息增益最大的特徵做爲劃分節點(ID3),但它在一些狀況下不適用,好比當存在某些特徵的取值不少、每一個取值對應的樣本數據不多(如id值,會將N個用戶劃分爲N類),此時雖然信息增益大,但其實和樣本的劃分關係不大(泛化能力弱)。所以引入信息增益率(信息增益 / 劃分前的熵值)。3d

CART分類使用基尼指數(Gini)來選擇最好的數據分割的特徵,Gini描述的是純度,與信息熵的含義類似。Gini係數 \(Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp^2\) (同熵同樣,值較小時分類效果好)。

引入評價函數:\(C(T)=\sum_{t\in leaf}N_t*H(t)\)\(H(t)\)表示熵值或Gini係數值,\(N_t\)表示葉節點中的樣本數 (評價函數值越小越好)。


其餘

如何處理連續型的屬性:離散化,將連續型屬性的值分爲不一樣的區間,依據是比較各個分裂點獲得Gain值的大小。

缺失數據的考慮:忽略,即在計算增益時僅考慮那些具備屬性值的記錄。

當決策樹過高、分支太多時很容易過擬合(在訓練集上劃分爲100% 但在測試集上效果很差),因而引入剪枝操做:

  • 預剪枝:在構建決策樹的過程當中,提早中止。如限制深度、限制當前集合的樣本個數的最低閾值。
  • 後剪枝:在決策樹構建好後纔開始剪枝。如從新定義評價函數 \(C_\alpha(T)=C(T)+\alpha\cdot\mid T_{leaf}\mid\)(限制葉子節點個數,手動設置\(\alpha\)以控制影響程度),在建樹完成以後對每一個節點比較剪枝和不剪枝的效果。


隨機森林

隨機森林就是經過集成學習的思想將多棵樹集成的一種算法,它的基本單元是決策樹,本質是一種集成學習(Ensemble Learning)方法。

從直觀角度來解釋,每棵決策樹都是一個分類器,那麼對於一個輸入樣本,N棵樹會有N個分類結果。而隨機森林集成了全部的分類投票結果,將投票次數最多的類別指定爲最終的輸出,這就是一種最簡單的 Bagging 思想。

隨機森林體現了兩方面的隨機

  • 樣本隨機 不使用所有數據集,而是隨機放回採樣(有必定機率避免選到異常點,使得樹的效果更好)
  • 特徵隨機 不使用所有特徵,而是隨機選取一部分特徵(有必定機率避開使用傳統信息增益出問題的特徵)

詳細可參看 [Machine Learning & Algorithm] 隨機森林(Random Forest)


sklearn庫中的決策樹算法

使用sklearn自帶的決策樹方法簡單代碼以下:

from sklearn import tree
     
    mode = tree.DecisionTreeClassifier(criterion='gini')
     
    mode.fit(X,Y)
    y_test = mode.predict(x_test)

參數解釋:

1.criterion gini or entropy 選擇基尼係數或熵值做爲評判標準

2.splitter best or random 在連續的特徵中須要作切分 前者是在全部特徵中找最好的切分點 後者是在部分特徵中(數據量大的時候)

3.max_features None(全部),log2,sqrt,N 當候選特徵較多時須要做出選擇 特徵小於50的時候通常使用全部的

4.max_depth 指定最大深度(預剪枝時使用) 數據少或者特徵少的時候能夠無論這個值,若是模型樣本量多,特徵也多的狀況下,能夠嘗試限制下

5.min_samples_split 若是某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分若是樣本量不大,不須要管這個值。若是樣本量數量級很是大,則推薦增大這個值。(預剪枝時使用)

6.min_samples_leaf 這個值限制了葉子節點最少的樣本數,若是某葉子節點數目小於樣本數,則會和兄弟節點一塊兒被剪枝,若是樣本量不大,不須要管這個值,大些如10W但是嘗試下5

7.min_weight_fraction_leaf 這個值限制了葉子節點全部樣本權重和的最小值,若是小於這個值,則會和兄弟節點一塊兒被剪枝默認是0,就是不考慮權重問題。通常來講,若是有較多樣本有缺失值,或者分類樹樣本的分佈類別誤差很大,就會引入樣本權重

8.max_leaf_nodes 經過限制最大葉子節點數,能夠防止過擬合,默認是"None」,即不限制最大的葉子節點數。若是加了限制,算法會創建在最大葉子節點數內最優的決策樹。若是特徵很少,能夠不考慮這個值,可是若是特徵分紅多的話,能夠加以限制具體的值能夠經過交叉驗證獲得。

9.class_weight 指定樣本各種別的的權重,主要是爲了防止訓練集某些類別的樣本過多致使訓練的決策樹過於偏向這些類別。這裏能夠本身指定各個樣本的權重若是使用「balanced」,則算法會本身計算權重,樣本量少的類別所對應的樣本權重會高。

10.min_impurity_split 這個值限制了決策樹的增加,若是某節點的不純度(基尼係數,信息增益,均方差,絕對差)小於這個閾值則該節點再也不生成子節點。即爲葉子節點 。

相關文章
相關標籤/搜索