1. 程式人生 > >隨機森林sklearn FandomForest,及其調參

隨機森林sklearn FandomForest,及其調參

隨機森林概述

隨機森林是整合學習方法bagging類中的翹楚。與整合學習boosting類的GBDT分庭抗禮。

bagging類整合學習採用的方法是:用部分資料 or 部分特徵 or 多個演算法 訓練一些模型;然後再組合這些模型,對於分類問題採用投票多數表決,迴歸問題採用求平均。

各個模型訓練之間互不影響,天生就適合並行化處理。在如今大資料時代背景下很有誘惑力。
主要效果:重點關注降低方差,防止過擬合。
適用於高噪聲資料 (相對於GBDT等boosting類)

這裡寫圖片描述

優勢:

  • 1、它能夠處理很高維度(feature很多)的資料,並且不用做特徵選擇
    原因:特徵子集是隨機選擇的,子集大小可以控制。
  • 2、在訓練完後,它能夠給出feature重要大小
  • 3、訓練速度快,容易做成並行化方法
    原因:訓練時樹與樹之間是相互獨立的
  • 4、如果有很大一部分的特徵遺失,仍可以維持準確度。

缺陷:

  • 1、隨機森林已經被證明在某些噪音較大的分類或迴歸問題上會過擬
  • 2、對於有不同取值的屬性的資料,取值劃分較多的屬性會對隨機森林產生更大的影響,(以資訊增益劃分資料集的特徵,都有這個問題,可以用資訊增益比校正)所以隨機森林在這種資料上產出的屬性權值是不可信的。

在scikit-learn中,RF的分類器是RandomForestClassifier,迴歸器是RandomForestRegressor。和GBDT的調參類似,RF需要調參的引數也包括兩部分,第一部分是Bagging框架的引數,第二部分是CART決策樹的引數。具體的引數參考隨機森林分類器的函式原型

classsklearn.ensemble.RandomForestClassifier(
        n_estimators=10, criterion='gini',
        max_depth=None,min_samples_split=2, 
        min_samples_leaf=1, min_weight_fraction_leaf=0.0,
        max_features='auto', max_leaf_nodes=None,
        min_impurity_split=1e-07,bootstrap=True,
        oob_score=False
, n_jobs=1, random_state=None, verbose=0, warm_start=False, class_weight=None)

隨機森林框架引數

下面我來看看RF重要的Bagging框架的引數,由於RandomForestClassifier和RandomForestRegressor引數絕大部分相同,這裡會將它們一起講,不同點會指出。

  • 1) n_estimators:
    也就是弱學習器的最大迭代次數,或者說最大的弱學習器的個數。一般來說n_estimators太小,容易過擬合,n_estimators太大,又容易欠擬合,一般選擇一個適中的數值。預設是100。在實際調參的過程中,我們常常將n_estimators和下面介紹的引數learning_rate一起考慮。

  • 2) oob_score:
    即是否採用袋外樣本來評估模型的好壞。預設識False。個人推薦設定為True,因為袋外分數反應了一個模型擬合後的泛化能力。

  • 3) criterion:
    即CART樹做劃分時對特徵的評價標準。分類模型和迴歸模型的損失函式是不一樣的。分類RF對應的CART分類樹預設是基尼係數gini,另一個可選擇的標準是資訊增益。迴歸RF對應的CART迴歸樹預設是均方差mse,另一個可以選擇的標準是絕對值差mae。一般來說選擇預設的標準就已經很好的。

從上面可以看出, RF重要的框架引數比較少,主要需要關注的是 n_estimators,即RF最大的決策樹個數。

隨機森林決策樹引數

RF的決策樹引數,它要調參的引數基本和GBDT相同,如下:

  • 1) max_features
    決策樹劃分時考慮的最大特徵數max_features:可以使用很多種型別的值,預設是”None”,意味著劃分時考慮所有的特徵數;如果是”log2”意味著劃分時最多考慮log2(n_features)個特徵;如果是”sqrt”或者”auto”意味著劃分時最多考慮sqrt(n_features) 個特徵。如果是整數,代表考慮的特徵絕對數。如果是浮點數,代表考慮特徵百分比,即考慮(百分比xN)取整後的特徵數。其中N為樣本總特徵數。一般來說,如果樣本特徵數不多,比如小於50,我們用預設的”None”就可以了,如果特徵數非常多,我們可以靈活使用剛才描述的其他取值來控制劃分時考慮的最大特徵數,以控制決策樹的生成時間。
    引數效果:max_features 值越大,模型學習能學習到的資訊越多,越容易過擬合。

  • 2)max_depth
    決策樹最大深度max_depth, 預設可以不輸入,如果不輸入的話,決策樹在建立子樹的時候不會限制子樹的深度。一般來說,資料少或者特徵少的時候可以不管這個值。如果模型樣本量多,特徵也多的情況下,推薦限制這個最大深度,具體的取值取決於資料的分佈。常用的可以取值10-100之間。
    引數效果:值越大,決策樹越複雜,越容易過擬合。

  • 3) min_samples_split
    內部節點再劃分所需最小樣本數min_samples_split: 這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。 預設是2.如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。
    引數效果:值越大,決策樹越簡單,越不容易過擬合。

  • 4)min_samples_leaf
    葉子節點最少樣本數min_samples_leaf: 這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。 預設是1,可以輸入最少的樣本數的整數,或者最少樣本數佔樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。
    引數效果:值越大,葉子節點越容易被被剪枝,決策樹越簡單,越不容易過擬合。

  • 5)min_weight_fraction_leaf
    葉子節點最小的樣本權重和min_weight_fraction_leaf:這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝。 預設是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分佈類別偏差很大,就會引入樣本權重,這時我們就要注意這個值了。

  • 6) max_leaf_nodes
    最大葉子節點數max_leaf_nodes: 通過限制最大葉子節點數,可以防止過擬合,預設是”None”,即不限制最大的葉子節點數。如果加了限制,演算法會建立在最大葉子節點數內最優的決策樹。如果特徵不多,可以不考慮這個值,但是如果特徵分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。
    引數效果:值越小,葉子節點個數越少,可以防止過擬合。

  • 7)min_impurity_split
    節點劃分最小不純度min_impurity_split: 這個值限制了決策樹的增長,如果某節點的不純度(基於基尼係數,均方差)小於這個閾值,則該節點不再生成子節點。即為葉子節點 。一般不推薦改動預設值1e-7。

上面決策樹引數中最重要的包括最大特徵數max_features, 最大深度max_depth, 內部節點再劃分所需最小樣本數min_samples_split和葉子節點最少樣本數min_samples_leaf。

常用方法

  • predict_proba(x):給出帶有概率值的結果。每個點在所有label(類別)的概率和為1.
  • predict(x):直接給出預測結果。內部還是呼叫的predict_proba(),根據概率的結果看哪個型別的預測值最高就是哪個型別。
  • predict_log_proba(x):和predict_proba基本上一樣,只是把結果給做了log()處理。

特徵重要性(模型可解釋性)

訓練完模型後可以使用屬性feature_importances_,檢視特徵的重要性 ,值越大特徵越重要。

重要性判斷的方法:bagging 分類樹的情況下,我們可以記錄每一顆樹選擇的劃分特徵,對目標類基尼係數降低的程度(相當每一個特徵對輸出的貢獻),然後每個特徵的重要性是所有樹上的降低值的平均。一旦訓練完成,sklearn 模組的不同袋裝樹(bagged tree)學習方法可直接訪問特徵的重要性。