隨機森林演算法參數解釋及調優

本文將詳細解釋隨機森林類的參數含義,並基於該類講解參數擇優的過程。

隨機森林類庫包含了RandomForestClassifer類,回歸類是RandomForestRegressor類。RF的變種ExtraTress也有ExtraTressClassifier類和ExtraTressRegressor類。由於這四個類的參數基本相同,只要完全理解其中一個類,其他三個類很快就能上手。本文只介紹RandomForestClassifier類。隨機森林是基於bagging框架的決策樹模型,因此隨機森林的參數擇優包括兩部分:(1)RF框架的參數擇優;(2)RF決策樹的參數擇優。因此,理解RF框架參數和決策樹參數的含義是模型參數擇優的前提。

目錄:

  1. RF框架參數含義
  2. RF決策樹參數含義
  3. RF參數擇優實例
  4. 結論

請參考Scikit-learn官網RandomForestClassifier類的參數來閱讀前兩節:

RF框架參數意義

n_estimators:對原始數據集進行有放回抽樣生成的子數據集個數,即決策樹的個數。若n_estimators太小容易欠擬合,太大不能顯著的提升模型,所以n_estimators選擇適中的數值,版本0.20的默認值是10,版本0.22的默認值是100。

bootstrap:是否對樣本集進行有放回抽樣來構建樹,True表示是,默認值True。

oob_score:是否採用袋外樣本來評估模型的好壞,True代表是,默認值False,袋外樣本誤差是測試數據集誤差的無偏估計,所以推薦設置True。

RF框架的參數很少,框架參數擇優一般是調節n_estimators值,即決策樹個數。

RF決策樹參數含義

max_features:構建決策樹最優模型時考慮的最大特徵數。默認是"auto",表示最大特徵數是N的平方根;「log2"表示最大特徵數是 log_{2}N ;"sqrt"表示最大特徵數是 sqrt{N} 。如果是整數,代表考慮的最大特徵數;如果是浮點數,表示對(N * max_features)取整。其中N表示樣本的特徵數。

max_depth:決策樹最大深度。若等於None,表示決策樹在構建最優模型的時候不會限制子樹的深度。如果模型樣本量多,特徵也多的情況下,推薦限制最大深度;若樣本量少或者特徵少,則不限制最大深度。

min_samples_leaf:葉子節點含有的最少樣本。若葉子節點樣本數小於min_samples_leaf,則對該葉子節點和兄弟葉子節點進行剪枝,只留下該葉子節點的父節點。整數型表示個數,浮點型表示取大於等於(樣本數 * min_samples_leaf)的最小整數。min_samples_leaf默認值是1。

min_samples_split:節點可分的最小樣本數,默認值是2。整數型和浮點型的含義與min_samples_leaf類似。

max_leaf_nodes:最大葉子節點數。int設置節點數,None表示對葉子節點數沒有限制。

min_impurity_decrease:節點劃分的最小不純度。假設不純度用信息增益表示,若某節點劃分時的信息增益大於等於min_impurity_decrease,那麼該節點還可以再劃分;反之,則不能劃分。

criterion:表示節點的劃分標準。不純度標準參考Gini指數,信息增益標準參考"entrop"熵。

min_samples_leaf:葉子節點最小的樣本權重和。葉子節點如果小於這個值,則會和兄弟節點一起被剪枝,只保留葉子節點的父節點。默認是0,則不考慮樣本權重問題。一般來說,如果有較多樣本的缺失值或偏差很大,則嘗試設置該參數值。

RF參數擇優實例

RF參數擇優思想:RF模型可以理解成決策樹模型嵌入到bagging框架,因此,我們首先對外層的bagging框架進行參數擇優,然後再對內層的決策樹模型進行參數擇優。在優化某一參數時,需要把其他參數設置為常數。

(1) 訓練數據集下載:

X,y = make_classification(n_samples=1000,n_features=50,n_clusters_per_class=1,
n_informative=15,random_state=RANDOM_STATE)

make_classification構建樣本數1000和特徵數50的二分類數據。

所有參數都採用默認值,查看分類情況:

rf0 = RandomForestClassifier(oob_score=True,random_state=10)
rf0.fit(X,y)
print(rf0.oob_score_)
print("accuracy:%f"%rf0.oob_score_)

準確率為:

accuracy:0.823000

(2) 對外層的bagging框架進行參數擇優,即對n_estimators參數擇優,其他參數仍然是默認值。

n_estimators參數擇優的範圍是:1~101,步長為10。十折交叉驗證率選擇最優n_estimators。

param_test1 = {"n_estimators":range(1,101,10)}
gsearch1 = GridSearchCV(estimator=RandomForestClassifier(),param_grid=param_test1,
scoring=roc_auc,cv=10)
gsearch1.fit(X,y)

print(gsearch1.grid_scores_)
print(gsearch1.best_params_)
print("best accuracy:%f" % gsearch1.best_score_)

輸出結果:

{n_estimators:81}

best accuracy:0.986152

因此,最佳的子決策樹個數是81,準確率98.61%,相比默認參數的82.3%有較大的提高。

(3) 優化決策樹參數的最大特徵數max_features,其他參數設置為常數,且n_estimators為81。

max_features參數擇優的範圍:1~11,步長為1,十折交叉驗證選擇最優max_features。

param_test2 = {"max_features":range(1,11,1)}
gsearch1 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=81,
random_state=10),
param_grid = param_test2,scoring=roc_auc,cv=10)
gsearch1.fit(X,y)
print(gsearch1.grid_scores_)
print(gsearch1.best_params_)
print(best accuracy:%f % gsearch1.best_score_)

結果:

{max_features:6}

best accuracy:0.986399

因此,選擇最佳的最大特徵數為6,準確率為98.63%,相比默認的最大特徵數,準確率有一個非常小的提高。決策樹的其他最優參數也是按照類似的步驟去搜尋,這裡就不一一介紹了。

(4) 用最優參數重新訓練數據,計算泛化誤差:

rf0 = RandomForestClassifier(n_estimators=81,max_features=6,
oob_score=True,random_state=10)
rf0.fit(X,y)
print(rf0.oob_score_)
print("accuracy: %f" % rf0.oob_score_)

泛化誤差:

accuracy:0.928000

總結

隨機森林模型優化主要是考慮如何選擇子數據集個數(n_estimators)和最大特徵個數(max_features),參數優化順序可參考下圖:

首先增大n_estimators,提高模型的擬合能力,當模型的擬合能力沒有明顯提升的時候,則在增大max_features,提高每個子模型的擬合能力,則相應的提高了模型的擬合能力。上面的參數調優是一種比較常用的調優方法,可以應用到其他模型的參數優化過程中。


推薦閱讀:

深度學習中的一些正則
認真臉:我是怎麼用機器學習技術找到女票的
學習ML.NET(1): 構建流水線
英偉達鍾愛的AI作曲家,發布了中國風專輯:它怎知曲風是何物?
AdaBoost演算法以及公式傻瓜式一步一步超詳細講解帶示例

TAG:randomForest | 機器學習 |