機器學習(九) 隨機森林

隨機森林是在Bagging策略的基礎上進行修改后的一種算法。

  • 隨機:數據采樣隨機,特征選擇隨機
  • 森林:很多個決策樹并行放在一起

9.1 算法的基本原理

采取有放回的抽樣方式,構造子數據集,保證不同子數據集之間的數量集一樣。
利用子數據集來構建子決策樹,每個子決策樹輸出一個結果。
統計子決策樹的投票結果,得到最終的分類,就是隨機森林的輸出結果。
具體的構建過程如下:

  • 從樣本中用 Bootstrap 采樣選出n個樣本
  • 從所有屬性中隨機選擇K個屬性,選擇出最佳分割屬性作為節點創建決策樹
  • 重復以上兩步m次
  • 統計這m個子決策樹得出的結果,通過投票表決結果決定數據屬于哪一類。

9.2 隨機森林的優劣勢

優勢

  • 它能夠處理很高維度的數據,并且不用做特征選擇
  • 在訓練完后,它能夠給出哪些特征比較重要
  • 并行化處理,速度較快
  • 可以進行可視化展示,便于分析
  • 由于存在隨機抽樣,訓練出來的模型方差小,泛化能力強
  • 由于進行隨機選擇決策樹劃分特征列表,在樣本維度比較高時,依然具有比較高的性能
  • 對部分特征的缺失不敏感
    劣勢
  • 在某些噪音比較比較大的特征上,RF模型容易陷入過擬;
  • 取值比較多的劃分特征對RF的決策會產生更大的影響,從而有可能影響模型的效果。

9.3 sklearn調用及參數解釋

class sklearn.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_decrease=0.0, 
    min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=1, 
    random_state=None, verbose=0, warm_start=False, class_weight=None)

因為隨機森林是很多個決策樹并行計算,所以隨機森林的很多參數與決策樹的類似。
(1) 決策樹參數:

  • criterion:"gini" or "entropy" (defaut = "gini")是計算屬性的gini(基尼不純度)還是entropy(信息增益),來選擇最合適的節點。
  • splitter: ”best” or “random”(default=”best”)隨機選擇屬性還是選擇不純度最大的屬性,建議用默認。
  • max_features: 選擇最適屬性時劃分的特征不能超過此值。
    當為整數時,即最大特征數;當為小數時,訓練集特征數*小數;
    if “auto”, then max_features=sqrt(n_features).
    If “sqrt”, thenmax_features=sqrt(n_features).
    If “log2”, thenmax_features=log2(n_features).
    If None, then max_features=n_features.
  • max_depth: (default=None)設置樹的最大深度,默認為None,這樣建樹時,會使每一個葉節點只有一個類別,或是達到min_samples_split。
  • min_samples_split:根據屬性劃分節點時,每個劃分最少的樣本數。
  • min_samples_leaf:葉子節點最少的樣本數。
  • max_leaf_nodes: (default=None)葉子樹的最大樣本數。
  • min_weight_fraction_leaf: (default=0) 葉子節點所需要的最小權值
  • verbose:(default=0) 是否顯示任務進程
    (2)隨機森林特有的參數
  • n_estimators=10:決策樹的個數,越多越好,但是性能就會越差,至少100左右(具體數字忘記從哪里來的了)可以達到可接受的性能和誤差率。
  • bootstrap=True:是否有放回的采樣。
  • oob_score=False:oob(out of band,帶外)數據,即:在某次決策樹訓練中沒有被bootstrap選中的數據。多單個模型的參數訓練,我們知道可以用cross validation(cv)來進行,但是特別消耗時間,而且對于隨機森林這種情況也沒有大的必要,所以就用這個數據對決策樹模型進行驗證,算是一個簡單的交叉驗證。性能消耗小,但是效果不錯。
  • n_jobs=1:并行job個數。這個在ensemble算法中非常重要,尤其是bagging(而非boosting,因為boosting的每次迭代之間有影響,所以很難進行并行化),因為可以并行從而提高性能。1=不并行;n:n個并行;-1:CPU有多少core,就啟動多少job。
  • warm_start=False:熱啟動,決定是否使用上次調用該類的結果然后增加新的。
  • class_weight=None:各個label的權重。
    參數解釋來自sklearn中隨機森林的參數
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容