決策樹與隨機森林


一、決策樹

決策樹(decision tree)是一種基本的分類與回歸方法,本篇主要討論用於分類的決策樹。

1.決策樹模型

分類決策樹模型是一種描述對實例進行分類的樹形結構。決策樹由結點(node)和有向邊(directed edge)組成。結點有兩種類型:內部結點(internal node)和葉節點(leaf node)。內部結點表示一個特征或屬性,葉節點表示一個類。
下圖為一個決策樹的示意圖,圖中圓和方框分別表示內部結點和葉節點。

2.特征選擇

如何選擇特征?即需要確定選擇特征的准則。如果一個特征具有更好的分類能力,或者說,按照這一特征將訓練數據集分割成子集,使得各個子集在當前條件下有更好的分類,那么就更應該選擇這個特征。

2.1 熵

在信息論與概率統計中,熵(entropy)是表示隨機變量不確定性的度量。設X是一個有限的離散隨機變量,其概率分布為
\begin{align}\notag
P(X=x_{i})=p_{i}, i=1,2,...,n
\end{align}
則隨機變量X的熵定義為
\begin{align}\notag
H(X)=-\sum_{i=1}^{n}p_{i}\textrm{log}p_{i}
\end{align}
上式中,對數以2為底或以e為底。如有0概率,定義0log0=0。由定義可知,熵只依賴於X的分布,而與X的取值無關,所以也可將X的熵記作H(p),即
\begin{align}\notag
H(p)=-\sum_{i=1}^{n}p_{i}\textrm{log}p_{i}
\end{align}
熵越大,隨機變量的不確定性就越大。

2.2 條件熵

條件熵(conditional entropy)H(Y|X)表示在已知隨機變量X的條件下隨機變量Y的不確定性。
設有隨機變量(X,Y),其聯合概率分布為
\begin{align}\notag
P(X=x_{i},Y=y_{j})=p_{ij},i=1,2,...,n; j=1,2,...,m
\end{align}
隨機變量X給定的條件下隨機變量Y的條件熵H(Y|X),定義為X給定條件下Y的條件概率分布的熵對X的數學期望
\begin{align}\notag
H(Y|X)=\sum_{i=1}^{n}p_{i}H(Y|X=x_{i})
\end{align}
當熵和條件熵中的概率由數據估計(特別是極大似然估計)得到時,所對應的熵與條件熵分別稱為經驗熵(empirical entropy)和經驗條件熵(empirical conditional entropy)。

2.3 信息增益

特征A對訓練數據集D的信息增益g(D,A),定義為集合D的經驗熵H(D)與特征A給定條件下D的經驗條件熵H(D|A)之差,即
\begin{align}\notag
g(D,A)=H(D)-H(D|A)
\end{align}
信息增益表示由於特征A而使得對數據集D的分類的不確定性減少的程度。
對於數據集D而言,信息增益依賴於特征,不同的特征往往具有不同的信息增益,信息增益大的特征具有更強的分類能力。

2.4 信息增益比

在訓練數據集的經驗熵大的時候,信息增益值會偏大,反之,信息增益值會偏小。使用信息增益比(information gain ratio)可以對這一問題進行校正。
特征A對訓練數據集D的信息增益比定義為其信息增益g(D,A)與訓練數據集D的經驗熵H(D)之比:
\begin{align}\notag
g_{R}(D,A)=\frac{g(D,A))}{H(D)}
\end{align}

2.5 基尼指數

假設有K個類,樣本點屬於第k類的概率為Pk,則概率分布的基尼指數定義為
\begin{align}\notag
Gini(p)=\sum_{k=1}^{K}p_{k}(1-p_{k})=1-\sum_{k=1}^{K}p_{k}^{2}
\end{align}
對於給定的樣本集合D,其基尼指數為
\begin{align}\notag
Gini(D)=1-\sum_{k=1}^{K}\left ( \frac{|C_{k}|}{|D|} \right )^{2}
\end{align}
如果樣本集合D根據特征A是否取某一可能值a被分割成D1和D2兩部分,即
\begin{align}\notag
D_{1}= \lbrace(x,y)\in D|A(x)=a \rbrace,D_{2}=D-D_{1}
\end{align}
則在特征A的條件下,集合D的基尼指數定義 為
\begin{align}\notag
Gini(D,A)=\frac{|D_{1}|}{|D|}Gini(D_{1})+\frac{|D_{2}|}{|D|}Gini(D_{2})
\end{align}
基尼指數Gini(D)表示集合D的不確定性,基尼指數Gini(D,A)表示A=a分割后集合D的不確定性。基尼指數值越大,樣本集合的不確定性也就越大。

3.樹的生成

3.1 ID3

ID3算法的核心是在決策樹各個結點上應用信息增益准則選擇特征,遞歸地構建決策樹。
具體方法是:

  1. 從根結點(root node)開始,對結點計算所有可能特征的信息增益,選擇信息增益最大的特征作為結點的特征,由該特征的不同取值建立子結點;
  2. 再對子結點遞歸地調用以上方法,構建決策樹
  3. 直到所有特征的信息增益均很小或者沒有特征可以選擇為止,最后得到一個決策樹。

3.2 C4.5

C4.5算法對ID3算法進行了改進,使用信息增益比來選擇特征。

3.3 CART

CART(classification and regression tree)決策樹使用基尼指數來選擇特征。
CART假設決策樹是二叉樹,內部結點特征的取值為“是”和“否”,左分支的取值為“是”,右分支的取值為“否”。這樣的決策樹等價於遞歸地二分每個特征,將特征空間划分為有限個單元,並在這些單元上確定預測的概率分布,也就是在輸入給定的條件下輸出的條件概率分布。
CART算法由以下兩步組成:

  1. 決策樹生成:基於訓練數據集生成決策樹,生成的決策樹要盡量大;
  2. 決策樹剪枝:用驗證數據集對已生成的樹進行剪枝並選擇最優子樹,這時用損失函數最小作為剪枝的標准。

4.樹的剪枝

在決策樹學習中,為了盡可能正確分類訓練樣本,結點划分過程將不斷重復,有時會造成決策樹分支過多,以致於把訓練集自身的一些特點當作所有數據都具有的一般性質而導致過擬合。
在決策樹學習中將已生成的樹進行簡化的過程稱為剪枝(pruning),剪枝是決策樹學習算法對付過擬合的主要手段。
剪枝從已生成的樹上裁掉一些子樹或葉結點,並將其根結點或父結點作為新的葉結點,從而簡化模型。
決策樹剪枝的基本策略有預剪枝(prepruning)和后剪枝(post-pruning)。

  • 預剪枝是指在決策樹生成過程中,對每個結點在划分前進行估計,若當前結點的划分不能帶來決策樹泛化性能的提升,則停止划分並將當前結點標記為葉結點。
  • 后剪枝是先從訓練集生成一棵完整的決策樹,然后自底向上地對非葉結點進行考察,若將該結點對應的子樹替換為葉結點能帶來決策樹泛化性能的提升,則將該子樹替換為葉結點。

二、隨機森林

1.簡介

隨機森林就是通過集成學習的思想將多棵樹集成的一種算法,它的基本單元是決策樹,而它的本質屬於集成學習(Ensemble Learning)方法。
集成學習通過建立幾個模型組合的來解決單一預測問題。它的工作原理是生成多個分類器/模型,各自獨立地學習和作出預測。這些預測最后結合成單預測,因此優於任何一個單分類的做出預測。

2.原理

2.1 算法流程

  1. 訓練總樣本數為N,有放回地從N個訓練集中隨機抽取n個作為此單顆樹的訓練樣本;
  2. 訓練樣例的輸入特征的個數為M,從M個輸入特征里隨機選擇m個輸入特征,m<<M,建立決策樹;
  3. 每棵樹都盡可能地生長,不需要剪枝。

2.2 結果判定

  • 目標特征為數字類型:取t個決策樹的平均值作為分類結果。
  • 目標特征為類別類型:少數服從多數,取單棵樹分類結果最多的那個類別作為整個隨機森林的分類結果。

3.優點

  • 在當前所有算法中,具有極好的准確率
  • 能夠有效地運行在大數據集上
  • 能夠處理具有高維特征的輸入樣本,而且不需要降維
  • 能夠評估各個特征在分類問題上的重要性
  • 對於缺省值問題也能夠獲得很好得結果

三、python實現

利用scikit-learn模塊來實現決策樹和隨機森林,代碼如下。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier


# 實例化數據集
dc = load_breast_cancer()

# 划分訓練集和測試集
x_train, x_test, y_train, y_test = train_test_split(dc.data,dc.target,test_size=0.25)

# 決策樹進行預測
dt = DecisionTreeClassifier()
dt.fit(x_train, y_train)
print("決策樹預測准確率為:", dt.score(x_test, y_test))

# 隨機森林進行預測
rf = RandomForestClassifier(n_estimators=120, n_jobs=2)
rf.fit(x_train, y_train)
print("隨機森林預測准確率為:", rf.score(x_test,y_test))

輸出結果如下。


心滿意足享受每一點快樂,是走向幸福的唯一途徑。——《櫻桃小丸子》


免責聲明!

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



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