機器學習--Gradient Boosting Machine(GBM)調參方法詳解


一、GBM參數

總的來說GBM的參數可以被歸為三類:

  1. 樹參數:調節模型中每個決策樹的性質
  2. Boosting參數:調節模型中boosting的操作
  3. 其他模型參數:調節模型總體的各項運作

1、樹參數

現在我們看一看定義一個決策樹所需要的參數。注意我在這里用的都是python里scikit-learn里面的術語,和其他軟件比如R里用到的可能不同,但原理都是相同的。

  1. min_ samples_split 
    1. 定義了樹中一個節點所需要用來分裂的最少樣本數。
    2. 可以避免過度擬合(over-fitting)。如果用於分類的樣本數太小,模型可能只適用於用來訓練的樣本的分類,而用較多的樣本數則可以避免這個問題。
    3. 但是如果設定的值過大,就可能出現欠擬合現象(under-fitting)。因此我們可以用CV值(離散系數)考量調節效果。
  2. min_ samples_leaf 
    1. 定義了樹中終點節點所需要的最少的樣本數。
    2. 同樣,它也可以用來防止過度擬合。
    3. 在不均等分類問題中(imbalanced class problems),一般這個參數需要被設定為較小的值,因為大部分少數類別(minority class)含有的樣本都比較小。
  3. min_ weight_ fraction_leaf 
    1. 和上面min_ samples_ leaf很像,不同的是這里需要的是一個比例而不是絕對數值:終點節點所需的樣本數占總樣本數的比值。
    2. #2和#3只需要定義一個就行了
  4. max_ depth 
    1. 定義了樹的最大深度。
    2. 它也可以控制過度擬合,因為分類樹越深就越可能過度擬合。
    3. 當然也應該用CV值檢驗。
  5. max_ leaf_ nodes 
    1. 定義了決策樹里最多能有多少個終點節點。
    2. 這個屬性有可能在上面max_ depth里就被定義了。比如深度為n的二叉樹就有最多2^n個終點節點。
    3. 如果我們定義了max_ leaf_ nodes,GBM就會忽略前面的max_depth。
  6. max_ features 
    1. 決定了用於分類的特征數,是人為隨機定義的。
    2. 根據經驗一般選擇總特征數的平方根就可以工作得很好了,但還是應該用不同的值嘗試,最多可以嘗試總特征數的30%-40%.
    3. 過多的分類特征可能也會導致過度擬合。

在繼續介紹其他參數前,我們先看一個簡單的GBM二分類偽代碼:

1. 初始分類目標的參數值 2. 對所有的分類樹進行迭代: 2.1 根據前一輪分類樹的結果更新分類目標的權重值(被錯誤分類的有更高的權重) 2.2 用訓練的子樣本建模 2.3 用所得模型對所有的樣本進行預測 2.4 再次根據分類結果更新權重值 3. 返回最終結果

以上步驟是一個極度簡化的BGM模型,而目前我們所提到的參數會影響2.2這一步,即建模的過程。

2、boosting參數

  現在我們來看看影響boosting過程的參數:

    1. learning_ rate 
      • 這個參數決定着每一個決策樹對於最終結果(步驟2.4)的影響。GBM設定了初始的權重值之后,每一次樹分類都會更新這個值,而learning_ rate控制着每次更新的幅度。
      • 一般來說這個值不應該設的比較大,因為較小的learning rate使得模型對不同的樹更加穩健,就能更好地綜合它們的結果。
    2. n_ estimators 
      • 定義了需要使用到的決策樹的數量(步驟2)
      • 雖然GBM即使在有較多決策樹時仍然能保持穩健,但還是可能發生過度擬合。所以也需要針對learning rate用CV值檢驗。
    3. subsample

      • 訓練每個決策樹所用到的子樣本占總樣本的比例,而對於子樣本的選擇是隨機的。
      • 用稍小於1的值能夠使模型更穩健,因為這樣減少了方差。
      • 一把來說用~0.8就行了,更好的結果可以用調參獲得。

3、其他參數

  好了,現在我們已經介紹了樹參數和boosting參數,此外還有第三類參數,它們能影響到模型的總體功能:

    1. loss

      • 指的是每一次節點分裂所要最小化的損失函數(loss function)
      • 對於分類和回歸模型可以有不同的值。一般來說不用更改,用默認值就可以了,除非你對它及它對模型的影響很清楚。
    2. init 
      • 它影響了輸出參數的起始化過程
      • 如果我們有一個模型,它的輸出結果會用來作為GBM模型的起始估計,這個時候就可以用init
    3. random_ state 
      • 作為每次產生隨機數的隨機種子
      • 使用隨機種子對於調參過程是很重要的,因為如果我們每次都用不同的隨機種子,即使參數值沒變每次出來的結果也會不同,這樣不利於比較不同模型的結果。
      • 任一個隨即樣本都有可能導致過度擬合,可以用不同的隨機樣本建模來減少過度擬合的可能,但這樣計算上也會昂貴很多,因而我們很少這樣用
    4. verbose 
      • 決定建模完成后對輸出的打印方式: 
        • 0:不輸出任何結果(默認)
        • 1:打印特定區域的樹的輸出結果
        • >1:打印所有結果
    5. warm_ start 
      • 這個參數的效果很有趣,有效地使用它可以省很多事
      • 使用它我們就可以用一個建好的模型來訓練額外的決策樹,能節省大量的時間,對於高階應用我們應該多多探索這個選項。
    6. presort 
      • 決定是否對數據進行預排序,可以使得樹分裂地更快。
      • 默認情況下是自動選擇的,當然你可以對其更改


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM