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


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


##決策樹

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

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

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


###熵的概念

設用P(X)代表X發生的概率,H(X)代表X發生的不確定性,則有:P(X)越大,H(X)越小;P(X)越小,H(X)越大。

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

當熵較小時表示集合較純,分類效果較好。因此,構造樹的基本想法是隨着樹深度的增加,節點的熵迅速降低,降低的速度越快越好,這樣才有望得到一棵高度最矮的決策樹。


###如何划分

為了滿足上述基本想法,想要選取一個划分標准來為當前集合分類,需要定義一個指標來評判分類效果。

常見的有以下三種指標:

ID3:信息增益(划分前熵值 - 划分后熵值)
C4.5:信息增益率(信息增益 / 划分前的熵值)
CART:Gini系數

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

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 這個值限制了決策樹的增長,如果某節點的不純度(基尼系數,信息增益,均方差,絕對差)小於這個閾值則該節點不再生成子節點。即為葉子節點 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM