一、概念
隨機森林(Random Forest)是一種由多個決策樹組成的分類器,是一種監督學習算法,大部分時候是用bagging方法訓練的。
bagging(bootstrap aggregating),訓練多輪,每輪的樣本由原始樣本中隨機可放回取出n個樣本組成,最終的預測函數對分類問題采用投票方式。
決策樹利用如上圖所示的樹結構進行決策,每一個非葉子節點是一個判斷條件,每一個葉子節點是結論。從跟節點開始,經過多次判斷得出結論,每一個決策樹都是一個弱分類器。
決策樹每次會選擇一個屬性進行判斷,如果不能得出結論,繼續選擇其他屬性進行判斷,直到能夠“肯定地”判斷出用戶的類型或者是屬性都已經使用完畢。
核心思想就是在一個數據集中找到一個最優特征,然后通過最優特征約束循環尋找最優特征,直到滿足指定條件為止。
最優特征一般是通過信息增益或信息增益率來確定,給定一批數據集,我們可以很容易得到它的不確定性(熵),經過一個特征的約束,數據的不確定性會降低。用兩次不確定性值作差,代表不確定性降低量,降低的越多特征越好。
當數據的分類效果足夠好了,比如當某個子節點內樣本數目小於某一個指定值或樹的最大深度達到某一個值,就可以停止了。
由上面介紹知:
bagging + 決策樹 = 隨機森林
比較典型的決策樹有:ID3、C4.5、CART等
有兩個點需要注意:
1、每個決策樹的特征是有放回抽樣選取的;
2、每棵樹的訓練數據是有返回抽樣選取的;
二、計算
隨機森林則可以通過創建隨機的特征子集並使用這些子集構建較小的決策樹,隨后組成子樹,這種方法可以防止大部分情況的過擬合,下面介紹幾種典型決策樹。
ID3:
算法的核心思想就是用信息增益來選擇最優分類特征。
第一步:
進行數據分割,分別對單個特征進行分裂,如果數據是連續的需要對數據進行離散化,如排序等距截取等,比如一組特征是1-8,就可以分為兩組,見下;
第二步:
選擇最優分裂屬性,分別計算每一個屬性的信息增益,選擇信息增益最大的屬性進行分裂,即該屬性是分裂完后子節點的純度最高的屬性(熵比較小)。
信息增益的計算公式如下:
其中, 表示父節點的熵;
表示節點i的熵,熵越大,節點的信息量越多,越不純;
表示子節點i的數據量與父節點數據量之比。
越大,表示分裂后的熵越小,子節點變得越純,分類的效果越好,因此選擇
最大的屬性作為分裂屬性。
第三步:
停止分裂條件:
1、最小節點數
當節點的數據量小於一個指定的數量時,不繼續分裂。兩個原因:一是數據量較少時,再做分裂容易強化噪聲數據的作用;二是降低樹生長的復雜性。提前結束分裂一定程度上有利於降低過擬合的影響。
2、熵或者基尼值小於閥值。
熵和基尼值的大小表示數據的復雜程度,當熵或者基尼值過小時,表示數據的純度比較大,如果熵或者基尼值小於一定程度時,節點停止分裂。
3、決策樹的深度達到指定的條件
節點的深度可以理解為節點與決策樹跟節點的距離,如根節點的子節點的深度為1,因為這些節點與跟節點的距離為1,子節點的深度要比父節點的深度大1。決策樹的深度是所有葉子節點的最大深度,當深度到達指定的上限大小時,停止分裂。
4、所有特征已經使用完畢,不能繼續進行分裂。
被動式停止分裂的條件,當已經沒有可分的屬性時,直接將當前節點設置為葉子節點。
缺點:
1、特征純度比較高(熵比較小),該特征的子類別很多,信息增益偏向於去那些擁有很多子類的特征,不夠准確。
2、不能對連續數據進行處理,需借助連續數據離散化。
C4.5:
第一步:
進行數據分割,分別對單個特征進行分裂,C4.5處理離散型屬性的方式與ID3一致,新增對連續型屬性的處理。
處理方式是先根據連續型屬性進行排序,然后采用一刀切的方式將數據砍成兩半,C4.5會計算每一個切割點切割后的信息增益,然后選擇使分裂效果最優的切割點。
為了選取最優的切割點,要計算按每一次切割的信息增益,計算量是比較大的,可以通過去除前后兩個類標簽相同的切割點以簡化計算的復雜度。
比如按某特征分割時,排序后連續的特征數值a,b對應的目標值是一致的,那個這兩個樣本之間不需要切割。
第二步:
選擇最優分裂屬性,C4.5采用信息增益率作為分裂的依據,
信息增益率的計算公式為:
其中表示信息增益,
表示分裂子節點數據量的信息增益,計算公式為:
其中m表示節點的數量,Ni表示第i個節點的數據量,N表示父親節點的數據量,說白了,其實是分裂節點的熵。
信息增益率越大,說明分裂的效果越好。
CART(CART有分類樹和回歸樹,這里先討論分類場景):
第一步:
進行數據分割,節點的分裂分為兩種情況,連續型的數據和離散型的數據。
CART對連續型屬性的處理與C4.5差不多,通過最小化分裂后的GINI值或者樣本方差尋找最優分割點,將節點一分為二。
對於離散型屬性,CART是一棵二叉樹,每一次分裂只會產生兩個節點,需要將其中一個特征值作為一個節點,其他特征值作為另外一個節點。
例如:如果某樣本一個特征有三種特征值X,Y,Z,則分裂方法有{X}、{Y,Z};{Y}、{X,Z};{Z}、{X,Y},分別計算每種分裂方法的基尼值確定最優的方法。
第二步:
選擇最優分裂屬性,CART采用GINI值作為分裂的依據,
分裂的目的是為了能夠讓數據變純,使決策樹輸出的結果更接近真實值。CART采用GINI值衡量節點純度,節點越不純,分類效果越差。
假設有k個類,樣本點屬於第i類的概率為pk,則GINI值的計算公式:
如果樣本集合D根據某個特征A被分割為D1,D2兩個部分,那么在特征A的條件下,集合D的gini指數的定義為:
gini指數Gini(D,A)表示特征A不同分組的數據集D的不確定性。
GINI指數值越大,樣本集合的不確定性也就越大。
三、實現
利用Python模塊scikit-learn來實現隨機森林。
from sklearn.ensemble import RandomForestRegressor import numpy as np from sklearn.datasets import load_iris iris = load_iris() rf = RandomForestRegressor() rf.fit(iris.data[:], iris.target[:]) # Build a forest of trees from the training set (X, y) instance = np.array(iris.data[-1]).reshape(1, -1) # Gives a new shape to an array without changing its data print(iris.target[-1]) print(rf.predict(instance))