Bagging與隨機森林

前今天整理了決策樹的原理實現,順手再把隨機森林的原理整理整理。

1.Bagging

 Bagging是並行式集成學習方法最著名的代表,其原理是給定包含m個樣本的數據集,我們先隨機取出一個樣本放入採樣集中,再把該樣本放回初始數據集(有放回),這樣經過m此隨機採樣操作,我們得到含有m個樣本的採樣集。照這樣,我們可採樣出T個含m個訓練樣本的採樣集,然後基於每個採樣集訓練一個基學習器,再將這些基學習器進行結合,這就是Bagging的基本流程。Bagging的算法描述如下:
bagging算法
 假定基學習器的計算複雜度爲O(m),則Bagging的複雜度大致爲T(O(m)+O(s)),考慮到採樣與投票/平均的複雜度O(s)很小,而T通常是一個不太大的常數,因此,訓練一個Bagging集成與直接使用基學習算法訓練一個學習器的複雜度同階,這說明Bagging是一個很高效的集成學習算法。

Bagging是一種集成思想,基學習器不僅可以是決策樹還可以是神經網絡等。

2.隨機森林(RF)

 接自https://blog.csdn.net/Y_hero/article/details/88373840決策樹的原理詳解。隨機森林是Bagging的一個擴展變體,RF在以決策樹爲基學習器構建Bagging集成的基礎上,進一步加入了隨機屬性的選擇,從所有屬性D中隨機選取K個屬性,選擇最佳分割屬性作爲節點建立CART決策樹(泛化的理解,這裏面也可以是其他類型的分類器,比如SVM、Logistics),減小特徵選擇個數K,樹的相關性和分類能力也會相應的降低;增大K,兩者也會隨之增大。所以關鍵問題是如何選擇最優的K, 一般情況下推薦值K=log2 D.

2.1隨機森林的生成

由於同一批數據,用同樣的算法只能產生一棵樹,而我們的森林顯然不希望只有一種樹,這時Bagging策略可以幫助我們產生不同的數據集。Bagging策略來源於bootstrap aggregation:從樣本集(假設樣本集N個數據點)中重採樣選出N個樣本(有放回的採樣,樣本數據點個數仍然不變爲N),在所有樣本上,對這N個樣本建立分類器(ID3\C4.5\CART\SVM\LOGISTIC),重複以上兩步m次,獲得m個分類器,最後根據這m個分類器的投票結果,決定數據屬於哪一類。

隨機森林分類效果(錯誤率)與兩個因素有關:

森林中任意兩棵樹的相關性:相關性越大,錯誤率越大;

森林中每棵樹的分類能力:每棵樹的分類能力越強,整個森林的錯誤率越低。

3.結合策略

學習器結合
經過上述的隨機森林生成步驟後,生成各種類別的子樹,當輸出時,每個基學習器都會生成一個結果,如何將這些結果整合爲唯一的輸出就是結合策略所解決的問題。在對預測輸出進行結合時,Bagging通常對分類任務使用簡單投票法,對迴歸任務使用簡單平均法。

3.1 平均法

簡答平均法
加權平均法
由於各個基學習器的權值在訓練中得出,隨機抽樣時有大約1/3的樣本不會被一個學習器抽到,因此可以用未抽到的作爲驗證集,根據驗證集在此學習器的正確率來計算此學習器的權值。

一般而言,在個體學習器性能相差較大時宜使用加權平均法,在個體學習器性能相差較小時宜使用簡單平均法。

3.2 投票法

3.2.1絕對多數投票法(若某類別概率超過0.5則輸出該標記)

3.2.2 相對多數投票法(輸出標記爲概率最高的一個標記)

3.2.3加權投票法
在這裏插入圖片描述
3.3學習法

 Stacking描述:先從初始數據集中訓練出初級學習器,然後“生成”一個新數據集用於訓練次級學習器。在新數據集中,初級學習器的輸出被當做樣例輸入特徵,初始樣本的標記仍被當做樣例標記。

4.總結

隨機森林在bagging的基礎上更進一步:

  1. 樣本的隨機:從樣本集中用Bootstrap隨機選取n個樣本

  2. 特徵的隨機:從所有屬性中隨機選取K個屬性,選擇最佳分割屬性作爲節點建立CART決策樹(泛化的理解,這裏面也可以是其他類型的分類器,比如SVM、Logistics)

  3. 重複以上兩步m次,即建立了m棵CART決策樹

  4. 這m個CART形成隨機森林,通過投票表決結果,決定數據屬於哪一類(投票機制有一票否決制、少數服從多數、加權多數)

 即在bagging策略基礎上,添加了對特徵的隨機選擇,從2個方面進行構建決策樹之後再集成。隨機森林的訓練效率常優於Bagging,因爲在個體決策樹的構建過程中,Bagging使用的是"確定型"決策樹,在劃分屬性時要對結點的所有屬性進行考察,而隨機森林使用的時“隨機型”決策樹則之考察一個屬性子集。

5.python實現隨機森林

利用Python的兩個模塊,分別爲pandas和scikit-learn來實現隨機森林。

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Factor(iris.target, iris.target_names)
df.head()

train, test = df[df['is_train']==True], df[df['is_train']==False]

features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['species'])
clf.fit(train[features], y)

preds = iris.target_names[clf.predict(test[features])]
pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章