一、GBM參數
總的來說GBM的參數可以被歸為三類:
- 樹參數:調節模型中每個決策樹的性質
- Boosting參數:調節模型中boosting的操作
- 其他模型參數:調節模型總體的各項運作
1、樹參數
現在我們看一看定義一個決策樹所需要的參數。注意我在這里用的都是python里scikit-learn里面的術語,和其他軟件比如R里用到的可能不同,但原理都是相同的。
- min_ samples_split
- 定義了樹中一個節點所需要用來分裂的最少樣本數。
- 可以避免過度擬合(over-fitting)。如果用於分類的樣本數太小,模型可能只適用於用來訓練的樣本的分類,而用較多的樣本數則可以避免這個問題。
- 但是如果設定的值過大,就可能出現欠擬合現象(under-fitting)。因此我們可以用CV值(離散系數)考量調節效果。
- min_ samples_leaf
- 定義了樹中終點節點所需要的最少的樣本數。
- 同樣,它也可以用來防止過度擬合。
- 在不均等分類問題中(imbalanced class problems),一般這個參數需要被設定為較小的值,因為大部分少數類別(minority class)含有的樣本都比較小。
- min_ weight_ fraction_leaf
- 和上面min_ samples_ leaf很像,不同的是這里需要的是一個比例而不是絕對數值:終點節點所需的樣本數占總樣本數的比值。
- #2和#3只需要定義一個就行了
- max_ depth
- 定義了樹的最大深度。
- 它也可以控制過度擬合,因為分類樹越深就越可能過度擬合。
- 當然也應該用CV值檢驗。
- max_ leaf_ nodes
- 定義了決策樹里最多能有多少個終點節點。
- 這個屬性有可能在上面max_ depth里就被定義了。比如深度為n的二叉樹就有最多2^n個終點節點。
- 如果我們定義了max_ leaf_ nodes,GBM就會忽略前面的max_depth。
- max_ features
- 決定了用於分類的特征數,是人為隨機定義的。
- 根據經驗一般選擇總特征數的平方根就可以工作得很好了,但還是應該用不同的值嘗試,最多可以嘗試總特征數的30%-40%.
- 過多的分類特征可能也會導致過度擬合。
在繼續介紹其他參數前,我們先看一個簡單的GBM二分類偽代碼:
1. 初始分類目標的參數值 2. 對所有的分類樹進行迭代: 2.1 根據前一輪分類樹的結果更新分類目標的權重值(被錯誤分類的有更高的權重) 2.2 用訓練的子樣本建模 2.3 用所得模型對所有的樣本進行預測 2.4 再次根據分類結果更新權重值 3. 返回最終結果
以上步驟是一個極度簡化的BGM模型,而目前我們所提到的參數會影響2.2這一步,即建模的過程。
2、boosting參數
現在我們來看看影響boosting過程的參數:
- learning_ rate
- 這個參數決定着每一個決策樹對於最終結果(步驟2.4)的影響。GBM設定了初始的權重值之后,每一次樹分類都會更新這個值,而learning_ rate控制着每次更新的幅度。
- 一般來說這個值不應該設的比較大,因為較小的learning rate使得模型對不同的樹更加穩健,就能更好地綜合它們的結果。
- n_ estimators
- 定義了需要使用到的決策樹的數量(步驟2)
- 雖然GBM即使在有較多決策樹時仍然能保持穩健,但還是可能發生過度擬合。所以也需要針對learning rate用CV值檢驗。
-
subsample
- 訓練每個決策樹所用到的子樣本占總樣本的比例,而對於子樣本的選擇是隨機的。
- 用稍小於1的值能夠使模型更穩健,因為這樣減少了方差。
- 一把來說用~0.8就行了,更好的結果可以用調參獲得。
3、其他參數
好了,現在我們已經介紹了樹參數和boosting參數,此外還有第三類參數,它們能影響到模型的總體功能:
-
loss
- 指的是每一次節點分裂所要最小化的損失函數(loss function)
- 對於分類和回歸模型可以有不同的值。一般來說不用更改,用默認值就可以了,除非你對它及它對模型的影響很清楚。
- init
- 它影響了輸出參數的起始化過程
- 如果我們有一個模型,它的輸出結果會用來作為GBM模型的起始估計,這個時候就可以用init
- random_ state
- 作為每次產生隨機數的隨機種子
- 使用隨機種子對於調參過程是很重要的,因為如果我們每次都用不同的隨機種子,即使參數值沒變每次出來的結果也會不同,這樣不利於比較不同模型的結果。
- 任一個隨即樣本都有可能導致過度擬合,可以用不同的隨機樣本建模來減少過度擬合的可能,但這樣計算上也會昂貴很多,因而我們很少這樣用
- verbose
- 決定建模完成后對輸出的打印方式:
- 0:不輸出任何結果(默認)
- 1:打印特定區域的樹的輸出結果
- >1:打印所有結果
- 決定建模完成后對輸出的打印方式:
- warm_ start
- 這個參數的效果很有趣,有效地使用它可以省很多事
- 使用它我們就可以用一個建好的模型來訓練額外的決策樹,能節省大量的時間,對於高階應用我們應該多多探索這個選項。
- presort
- 決定是否對數據進行預排序,可以使得樹分裂地更快。
- 默認情況下是自動選擇的,當然你可以對其更改
