機器學習之集成學習(五)GBDT算法scikit-learn庫

參考:http://www.cnblogs.com/pinard/p/6143927.html

一、GBDT類庫概述

        在scikit-learn中,GradientBoostingClassifier爲GBDT的分類類, 而GradientBoostingRegressor爲GBDT的迴歸類。兩者的參數類型完全相同,當然有些參數比如損失函數loss的可選擇項並不相同。這些參數中,類似於Adaboost,把重要參數分爲兩類,第一類是Boosting框架的重要參數,第二類是弱學習器即CART迴歸樹的重要參數。下面從這兩個方面來介紹這些參數的使用。

二、GBDT類庫boosting框架參數

        首先來看boosting框架相關的重要參數。由於GradientBoostingClassifier和GradientBoostingRegressor的參數大部分相同,下面會一起來講,不同點會單獨指出。

1) n_estimators

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

2) learning_rate

        每個弱學習器的權重縮減係數ν,也稱爲步長。加上正則化項後,強學習器的迭代公式爲。ν的取值範圍爲0<ν≤1。對於同樣的訓練集擬合效果,較小的ν意味着需要更多的弱學習器的迭代次數。通常用步長和迭代最大次數一起來決定算法的擬合效果。所以這兩個參數n_estimators和learning_rate要一起調參。一般來說,可以從一個小一點的ν開始調參,默認是1。

3) subsample

        子採樣,取值爲(0,1]。注意這裏的子採樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這裏是不放回抽樣。如果取值爲1,則全部樣本都使用,等於沒有使用子採樣。如果取值小於1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小於1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低。推薦在[0.5, 0.8]之間,默認是1.0,即不使用子採樣。

4) init

        初始化時的弱學習器,擬合f0(x),如果不輸入,則用訓練集樣本來做樣本集的初始化分類迴歸預測。否則用init參數提供的學習器做初始化分類迴歸預測。一般用在對數據有先驗知識或者之前做過一些擬合的時候,如果沒有的話就不用管這個參數了。

5) loss

        GBDT算法中的損失函數,分類模型和迴歸模型的損失函數是不一樣的。

        對於分類模型,有對數似然損失函數"deviance"和指數損失函數"exponential"兩種輸入選擇。默認是對數似然損失函數"deviance"。在原理篇中對這些分類損失函數有詳細的介紹。一般來說,推薦使用默認的"deviance"。它對二元分類和多元分類各自都有比較好的優化。而指數損失函數等於是Adaboost算法。

        對於迴歸模型,有均方差"ls"、絕對損失"lad"、Huber損失"huber"和分位數損失“quantile”。默認是均方差"ls"。一般來說,如果數據的噪音點不多,用默認的均方差"ls"比較好。如果是噪音點較多,則推薦用抗噪音的損失函數"huber"。而如果需要對訓練集進行分段預測的時候,則採用“quantile”。

6) alpha

        這個參數只有GradientBoostingRegressor有,當使用Huber損失"huber"和分位數損失“quantile”時,需要指定分位數的值。默認是0.9,如果噪音點較多,可以適當降低這個分位數的值。

三、GBDT類庫弱學習器參數

        這裏再對GBDT的類庫弱學習器的重要參數做一個總結。由於GBDT使用了CART迴歸決策樹,因此它的參數基本來源於決策樹類,也就是說,和DecisionTreeClassifier和DecisionTreeRegressor的參數基本類似。

1) max_features劃分時考慮的最大特徵數

        可以使用很多種類型的值,默認是"None",意味着劃分時考慮所有的特徵數;如果是"log2"意味着劃分時最多考慮log2(N)個特徵;如果是"sqrt"或者"auto"意味着劃分時最多考慮sqrt(N)個特徵。如果是整數,代表考慮的特徵絕對數。如果是浮點數,代表考慮特徵百分比,即考慮(百分比xN)取整後的特徵數。其中N爲樣本總特徵數。一般來說,如果樣本特徵數不多,比如小於50,用默認的"None"就可以了,如果特徵數非常多,可以靈活使用其他取值來控制劃分時考慮的最大特徵數,以控制決策樹的生成時間。

2) max_depth決策樹最大深度

        默認可以不輸入,如果不輸入的話,決策樹在建立子樹的時候不會限制子樹的深度。一般來說,數據少或者特徵少的時候可以不管這個值。如果模型樣本量多,特徵也多的情況下,推薦限制這個最大深度,具體的取值取決於數據的分佈。常用的可以取值10-100之間。

3) min_samples_split內部節點再劃分所需最小樣本數

        這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。 默認是2,如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。

4) min_samples_leaf葉子節點最少樣本數

        這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。 默認是1,可以輸入最少的樣本數的整數,或者最少樣本數佔樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。

5)min_weight_fraction_leaf葉子節點最小的樣本權重和

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

6) max_leaf_nodes最大葉子節點數

        通過限制最大葉子節點數,可以防止過擬合,默認是"None”,即不限制最大的葉子節點數。如果加了限制,算法會建立在最大葉子節點數內最優的決策樹。如果特徵不多,可以不考慮這個值,但是如果特徵分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。

7) min_impurity_split節點劃分最小不純度

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章