隨機森林(random forest)
在機器學習中,隨機森林是一個包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定
- 如果訓練了五個樹其中有四個樹的結果為True,一個的結果為False,那麼最終的結果為True(投票決定)
建立多個決策樹的過程
假設有一匹N個樣本,M個特徵的數據集
- 隨機在N個樣本當中抽取一個樣本(會放回),重複N次
- 有可能會抽到重複的樣本
- bootstrap抽樣
- 隨機在M個特徵當中選取m個特徵
- m < M
- 重複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
34from 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 | accuracy score 0.8071748878923767 |
優缺點
- 優點
- 在當前所有演算法中,具有極好的準確率,也是使用最多的
- 數據量越大或越複雜相對於其他演算法優勢越明顯,能夠有效的運行在大數據集上
- 能夠處理具有高維特徵的輸入樣本,而且不需要降維
- 能夠評估各個特徵在分類問題上的重要性
- 缺點
- 在選到合適的參數時須不斷地進行測試