本文将詳細解釋随機森林類的參數含義,并基于該類講解參數擇優的過程。
随機森林類庫包含了RandomForestClassifer類,回歸類是RandomForestRegressor類。RF的變種ExtraTress也有ExtraTressClassifier類和ExtraTressRegressor類。由于這四個類的參數基本相同,隻要完全了解其中一個類,其他三個類很快就能上手。本文隻介紹RandomForestClassifier類。随機森林是基于bagging架構的決策樹模型,是以随機森林的參數擇優包括兩部分:(1)RF架構的參數擇優;(2)RF決策樹的參數擇優。是以,了解RF架構參數和決策樹參數的含義是模型參數擇優的前提。
目錄:
- RF架構參數含義
- RF決策樹參數含義
- RF參數擇優執行個體
- 結論
請參考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"表示最大特征數是
;"sqrt"表示最大特征數是
。如果是整數,代表考慮的最大特征數;如果是浮點數,表示對(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
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,提高每個子模型的拟合能力,則相應的提高了模型的拟合能力。上面的參數調優是一種比較常用的調優方法,可以應用到其他模型的參數優化過程中。