隨機森林(Random Forest,簡稱RF)是通過集成學習的思想將多棵樹集成的一種算法,它的基本單元是決策樹。假設現在針對的是分類問題,每棵決策樹都是一個分類器,那么N棵樹會有N個分類結果。隨機森林集成了所有的分類投票結果,將投票次數最多的類別指定為最終輸出。它可以很方便的並行訓練。
森林表示決策樹是多個。隨機表現為兩個方面:數據的隨機性化、待選特征的隨機化。
構建流程:采取有放回的抽樣方式構造子數據集,保證不同子集之間的數量級一樣(元素可以重復);利用子數據集來構建子決策樹;將待預測數據放到每個子決策樹中,每個子決策樹輸出一個結果;統計子決策樹的投票結果,投票數多的就是隨機森林的輸出結果。
(1)從樣本集中用 Bootstrap采樣選出一定數量的樣本,比如80%樣本集;
(2)從所有屬性中隨機選擇K個屬性,在K個屬性中再選擇出最佳分割屬性作為節點創建決策樹;
(3)重復以上兩步m次,即建立m棵決策樹。可以並行:即m個樣本同時提取,m棵決策樹同時生成;
(4)這m個決策樹形成隨機森林,通過投票表決結果(比如少數服從多數)決定待預測數據的結果。
隨機森林和決策樹在單個決策樹上的構建區別是:所有特征變成隨機部分特征。部分數量是K個,K的取值有一定的講究。太小了使得單棵樹的精度太低,太大了樹之間的相關性會加強,獨立性會減弱。通常取總特征數的平方根。
PS1:有的文章介紹隨機森林的使用時,對特征並沒有隨機部分選取,還是同決策樹全部選取的。
PS2:現實情況下,一個數據集往往有成百個特征,如何選擇對結果影響較大的那幾個特征,以此來縮減建立模型時的特征數。可以參考:
http://www.sohu.com/a/297967370_729271 五,特征重要性評估。
代碼示例
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)) <= 0.80
df['species'] = iris.target
# 得到訓練集和測試集
train, test = df[df['is_train']==True], df[df['is_train']==False]
# 定義特征列
features = df.columns[:4]
# 訓練模型,限制樹的最大深度3,決策樹個數10
clf = RandomForestClassifier(max_depth=3, n_estimators=10, max_features=1)
# 獲得訓練集中真實結果
Y, _ = pd.factorize(train['species'])
# 開始訓練
clf.fit(train[features], Y)
# 通過測試集進行預測
preds = clf.predict(test[features])
print (preds)
print (test['species'].values)
# 顯示預測准確率
diff = 0
for num in range(0,len(preds)):
if(preds[num] != test['species'].values[num]):
diff = diff + 1
rate = ((diff+0.0) / len(preds))
print (1.0-rate)