Hike News
Hike News

機器學習-演算法-隨機森林(random forest)

隨機森林(random forest)

在機器學習中,隨機森林是一個包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定

  • 如果訓練了五個樹其中有四個樹的結果為True,一個的結果為False,那麼最終的結果為True(投票決定)

建立多個決策樹的過程

假設有一匹N個樣本,M個特徵的數據集

  1. 隨機在N個樣本當中抽取一個樣本(會放回),重複N次
    • 有可能會抽到重複的樣本
    • bootstrap抽樣
  2. 隨機在M個特徵當中選取m個特徵
    • m < M
  3. 重複N次建立每顆決策樹
    • 每個決策樹基於的樣本特徵大多不是一樣的

為何要隨機抽樣訓練集

如果不進行隨機抽樣,每棵樹的訓練集都一樣,那最終訓練出的樹的分類結果也是完全一樣的

為什麼要有放回的抽樣

如果不是有放回的抽樣,那麼每棵樹的訓練樣本都是不同的,都是沒有交集的,也就是說每:棵樹訓練出來都是有很大差異的;而隨機森林最後分類取決於多棵樹(弱分類器)的投票表決

調用隨機森林API

使用sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion="gini", max_depth=None, bootstrap=True, random_state=None) 調用隨機森林分類器

  • n_estimators: int,森林裡樹木的數量,預設為10,為超參數
  • criterion: string,分類依據(分割特徵的測量方法),預設為根據gini係數分類
  • max_depth: int或None,樹的最大深度,預設為None,為超參數
  • bootstrap:是否隨機抽樣,默認為True
  • max_features: 每個決策樹最大的特徵數量,預設為”auto”
    • “auto”: max_features = sqrt(n_features)
    • “sqrt”: max_features = sqrt(n_features) 與”auto”一樣
    • “log2”: max_features = log2(n_features)
    • None : max_features = n_features
  • min_samples_split :
  • min_samples_leaf :
  • bootstrap : boolean,預設為True,是否在構建樹時使用放回抽樣

Example

隨機森林搭配超參數優化(GridSearchCV)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.feature_extraction import DictVectorizer
import pandas as pd

datapath = "/Volumes/MacData/MEGA/pythonwork/jupyter_project/Kaggle Dataset/Titanic/train.csv"

def RandomForestTest():
data = pd.read_csv(datapath)
X = data[["Pclass","Sex","Age"]]
Y = data["Survived"]

X["Age"].fillna(X["Age"].mean(),inplace=True)

X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size=0.25)

DV = DictVectorizer(sparse=False)
X_train = DV.fit_transform(X_train.to_dict(orient="records"))
X_test = DV.transform(X_test.to_dict(orient="records"))

# 實例化隨機森林分類器
RF = RandomForestClassifier()

# 測試超參數優化
RF_param = {"n_estimators":[10,50,100,150,200],"max_depth":[5,10,15,20]}

GSCV = GridSearchCV(RF,param_grid=RF_param,cv=5)
GSCV.fit(X_train,y_train)

print("accuracy score",GSCV.score(X_test,y_test))
print("The best model param :",GSCV.best_params_)

if __name__ == '__main__':
RandomForestTest()

Result

1
2
accuracy score 0.8071748878923767
The best model param : {'max_depth': 5, 'n_estimators': 150}

優缺點

  • 優點
    • 在當前所有演算法中,具有極好的準確率,也是使用最多的
    • 數據量越大或越複雜相對於其他演算法優勢越明顯,能夠有效的運行在大數據集上
    • 能夠處理具有高維特徵的輸入樣本,而且不需要降維
    • 能夠評估各個特徵在分類問題上的重要性
  • 缺點
    • 在選到合適的參數時須不斷地進行測試