iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
AI & Data

人類學習機器學習的學習筆記 with Python系列 第 23

Day23 集成學習(Ensemble Learning)(2)--隨機森林(Random Forest)

  • 分享至 

  • xImage
  •  

前言

昨天的內容提到Bagging與Boosting改善預測結果的方法,不過在許多問題中Boosting常常表現得比Bagging更好,因此Boosting這類的方法更受歡迎。不過隨機森林(Random Forest)針對Bagging的方法有一些改善,使表現的與Boosting差不多好,且更容易訓練以及挑選其中的參數。

隨機森林介紹

Bagging的基本概念是利用平均的方法來降低模型結果的變異,而決策樹是在Bagging中常用到的模型之一,因為決策樹更可以處理複雜的資料,若決策樹長得夠深夠大就能較低的偏差(bias),且利用Bagging就能得到更好的預測結果。雖然Bagging可以解決決策樹結果變異太大的問題,但並沒有解決偏差的問題(因為樣本平均值的期望值與原始資料的期望值相同,因此Bias的情況也會相同),因此唯一的希望是降低variance的部分。

昨天提到若有一筆來自相同分佈且互相獨立(i.i.d.)的資料https://chart.googleapis.com/chart?cht=tx&chl=X_1%2C%20X_2%2C%20...%2C%20X_n,變異數為https://chart.googleapis.com/chart?cht=tx&chl=%5Chat%7B%5Csigma%7D%20%5E%202%20。而樣本平均數https://chart.googleapis.com/chart?cht=tx&chl=%5Cbar%7BX%7D的變異數為https://chart.googleapis.com/chart?cht=tx&chl=%5Chat%7B%5Csigma%7D%20%5E%202%20%2F%20n。但Bagging的方法由各個生成的資料集建構模型得到的預測結果之間常常不可能完全獨立(例如決策樹之間可能有結構相似的情況,就會有比較相似的預測結果),因此若資料之間有相關性時,樣本平均值的變異數會變成https://chart.googleapis.com/chart?cht=tx&chl=%5Crho%20%5Csigma%5E2%20%2B%20%5Cfrac%7B1-%5Crho%7D%7BB%7D%20%5Csigma%5E2,不論利用Bootstrap生成多少B個資料集,第一項仍然一直存在,因此會限制了Bagging的效果。 例如假設資料中有一個非常強的預測因子,以及許多其他中等強的預測因子。在Bagging建構的各個決策樹中,大多數或所有模型在最上方常常都是這些較有影響力的因子。因此,Bagging的結果許多看起來會非常相似,表示這些結果有些相關性存在。然而,隨機森林(Random Forest)就是想降低決策樹之間的相關性來改善Bagging的演算法。

具體來說,隨機森林與Bagging一樣在利用Bootstrap的方法生成的訓練集資料上建立決策樹模型。不同之處在於隨機森林,只會隨機從p個解釋變數X中挑選m個解釋變數作為進行分割的候選名單來生成一個決策樹模型,(分類問題中通常選擇https://chart.googleapis.com/chart?cht=tx&chl=m%3D%5Csqrt%7Bp%7D、迴歸問題選擇https://chart.googleapis.com/chart?cht=tx&chl=p%2F3),也就是說Bootstrap生成的B組訓練集資料,每個訓練資料集都由p個解釋變數挑選m個來建立決策樹模型。因此隨機森林演算法中會有兩個隨機,分別為Bootstrap隨機抽取原始資料生成多個訓練集資料,與隨機挑選m個變數來建構模型。
https://ithelp.ithome.com.tw/upload/images/20220930/20151276ZHJifHWXsN.png

Python

  • 建立模型
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.3)
rand_clf = RandomForestClassifier()
rand_clf.fit(x_train, y_train)
rand_clf.score(x_test, y_test)
  • 挑選參數
  1. max_depth: 決策樹深度,也就是root node與leaf node之間的距離
  2. min_sample_split: 每個區塊中最少包含多少個的資料點(預設為2)
  3. max_leaf_nodes: 設定分割(split)的條件,可限制決策樹生長
  4. min_samples_leaf: 指定在分裂一個節點後應該存在於leaf node中的最小樣本數(預設為1)
  5. n_estimators: 隨機森林中的決策樹數量
  6. max_sample: 決定將原始數據集的哪一部分提供給任何單個樹
  7. max_features: 提供給隨機森林中每棵樹的最大特徵數或解釋變數。
  8. bootstrap: 是否以bootstrap生成多組樣本(預設為是)
  9. criterion: Gini index或cross-entropy
grid_param = {
     "n_estimators": [90, 100, 115, 130],
     "criterion": ["gini", "entropy"],
     "max_depth": range(2, 20, 1),
     "min_samples_leaf": range(1, 10, 1),
     "min_sample_split": range(2, 10, 1),
     "max_features": ["auto", "log2"]
}

grid_search = GridSearchCV(estimator = rand_clf, 
                           param_grid = grid_param, 
                           CV = 5, 
                           n_job = -1, 
                           verbose = 3)

grid_search.fit(x_train, y_train)
# 得到挑選參數的結果
grid_search.best_params_
# 以挑選的參數重新fit模型
rand_clf = RandomForestClassifier(
                 criterion = "entropy",
                 max_depth = 12,
                 max_features = log2,
                 min_samples_leaf = 1,
                 min_sample_split = 5,
                 n_estimators = 90)
rand_clf.fit(x_train, y_train)
rand_clf.score(x_test, y_test)

上一篇
Day22 集成學習(Ensemble Learning)(1)--Bagging and Boosting
下一篇
Day24 支持向量機(Support Vector Machine, SVM)(1) -- Optimal Separating Hyperplane
系列文
人類學習機器學習的學習筆記 with Python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言