GBDT分類器和迴歸器的大部分參數都是相同的,除了損失函數的選項有些不一樣,所以下面咱們統一說明各個參數的意義以及在什麼情境下作什麼調整方法。html
1、GBDT的boosting框架參數node
1.n_estimators:表明弱學習器的最大個數,即最多訓練多少棵樹。這個值過大致使過擬合,太小致使欠擬合.默認值爲100.bash
2.learning_rate:每一個弱學習器都有一個權重參數,默認值0.1,取值範圍0-1。 learning_rate和n_estimators同時決定着模型的擬合效果,所以要同時調整,建議從一個小一點的學習率開始。網絡
fn(x)=fn-1(x)+l_r*T(n,x)
#即本輪的學習器等於本輪之前的學習器加上學習率乘以本輪獲得的弱學習器
複製代碼
3.subsample:子採樣比例,默認1.0,是不放回的採樣,與隨機森林的有放回採樣不同。若是爲1.0,表示每輪採用所有數據生成決策樹,容易過擬合,方差容易比較大。可是若是太小,容易形成高誤差,因此這個值須要這種,建議0.5-0.8之間。框架
4.init:初始學習器的值,在有必定先驗知識的狀況下能夠本身設定,。可是通常不用。dom
5.loss:損失函數的選擇,對於分類和迴歸是有區別的。ide
分類:可選項有{'deviance','exponential'},"deviance"對數似然損失函數和'exponential'指數損失函數,默認對數似然損失函數,對於二分類以及多分類問題採用對數似然損失函數比較好,這種損失函數用的也比較多。而指數損失函數,讓咱們想到的是Adaboost,即改變本輪錯誤訓練的數據在下一輪訓練中的權值,使錯誤分類的樣本獲得更多重視。函數
迴歸:可選項有{'ls', 'lad', 'huber', 'quantile'},ls是均方,lad是絕對偏差,學習
huber是抗噪音損失函數,公式爲:spa
當殘差大於delta,應當採用L1(對較大的異常值不那麼敏感)來最小化,而殘差小於超參數,則用L2來最小化。本質上,Huber損失是絕對偏差,只是在偏差很小時,就變爲平方偏差。它對數據中的異常點沒有平方偏差損失那麼敏感。它在0也可微分。使用MAE訓練神經網絡最大的一個問題就是不變的大梯度,這可能致使在使用梯度降低快要結束時,錯過了最小點。而對於MSE,梯度會隨着損失的減少而減少,使結果更加精確。在這種狀況下,Huber損失就很是有用。它會因爲梯度的減少而落在最小值附近。比起MSE,它對異常點更加魯棒。所以,Huber損失結合了MSE和MAE的優勢。可是,Huber損失的問題是咱們可能須要不斷調整超參數delta。quantile分箱偏差,須要對訓練數據進行分段預測時。
6.alpha:只有loss='huber'
或者 loss='quantile'
時,須要指定分位數的值,默認0.9,若是噪音較多,能夠提升這個值。
2、弱學習器參數:生成決策樹時候的參數
1.max_features:劃分時考慮的特徵數量。當特徵數量並很少,小於50,能夠None,即默認使用所有特徵。也能夠是以下幾個。
2.max_depth:每棵子樹的深度,默認爲3.若是數據量和特徵都很少,能夠無論這個參數。可是當較大時,建議限制深度,10-100之間。
3.min_samples_split:子樹繼續劃分的條件,默認爲2.當一個節點內的樣本數量少於該值時,該節點再也不拆分,看成葉節點。當數據量小不用管,數據量大能夠增大該值。
4.min_samples_leaf:葉子節點最少的樣本數,默認1.若是葉節點的樣本數少於該值,會和兄弟節點一塊兒被剪紙,至關於不須要對上層的樣本再作細分,由於葉節點中只有一個樣本,分支意義不大。當數量級大,能夠增大這個值。因而可知gbdt生成的樹不是徹底二叉樹,是有可能出現左右子樹高度不一樣的狀況的。
5.min_weight_fraction_leaf:限制了葉子節點全部樣本權重和的最小值。若是小於這個值,則會和兄弟節點一塊兒被剪枝。默認是0,即不考慮。若是咱們有較多樣本有缺失值,或者分類樹樣本的分佈類別誤差很大,就會引入樣本權重,這時咱們就要注意這個值了。
6.max_leaf_nodes:最大葉子節點數量,默認爲None,在限制的葉節點數以內生成最優決策樹,能夠防止過擬合。當數量級較大,能夠限制這個數。
7.min_impurity_split:最小基尼不純度,若是某個節點的基尼不純度小於該值,則再也不劃分,視爲葉節點,默認1e-7,通常不修改。
3、調參過程
1.先對提高框架內的,迭代次數和學習率作調整,選一個較小的學習率,對迭代次數網格化調餐。
param_test1 = {'n_estimators':range(20,101,10)}
gsearch1 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, min_samples_split=300,
min_samples_leaf=20,max_depth=8,max_features='sqrt', subsample=0.8,random_state=10),
param_grid = param_test1, scoring='roc_auc',iid=False,cv=5)
gsearch1.fit(X,y)
gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_
複製代碼
2.接下來對決策樹調餐,先一塊兒調整max_depth和min_samples_split,根據輸出的最優值將max_depth定下倆,後續再調整最小劃分樣本數。
param_test2 = {'max_depth':range(3,14,2), 'min_samples_split':range(100,801,200)}
gsearch2 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60, min_samples_leaf=20,
max_features='sqrt', subsample=0.8, random_state=10),
param_grid = param_test2, scoring='roc_auc',iid=False, cv=5)
gsearch2.fit(X,y)
gsearch2.grid_scores_, gsearch2.best_params_, gsearch2.best_score_
複製代碼
3.再對內部節點再劃分所需最小樣本數min_samples_split和葉子節點最少樣本數min_samples_leaf一塊兒調參。看兩者的最優值是否在邊界上,若是在邊界上,就進一步改變參數範圍再網格化調餐。
param_test3 = {'min_samples_split':range(800,1900,200), 'min_samples_leaf':range(60,101,10)}
gsearch3 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60,max_depth=7,
max_features='sqrt', subsample=0.8, random_state=10),
param_grid = param_test3, scoring='roc_auc',iid=False, cv=5)
gsearch3.fit(X,y)
gsearch3.grid_scores_, gsearch3.best_params_, gsearch3.best_score_
複製代碼
4.再對max_features和subsample進行網格化。
5.最後能夠經過,減少學習率,增大迭代次數,增長泛化能力,防止過擬合。保持二者的乘積基本不變,但步長設定太小,會致使擬合效果反而變差,應適當減少學習率。
【參考文章】
1.baijiahao.baidu.com/s?id=160385…