Gradient Boosting Decision Tree

概述

GBDT全稱Gradient Boosting Decison Tree酝掩,同為Boosting家族的一員,它和Adaboost有很大的不同眷柔。Adaboost 是利用前一輪弱學習器的誤差率來更新訓練集的權重庸队,這樣一輪輪的迭代下去,簡單的說是Boosting框架+任意基學習器算法+指數損失函數闯割。GBDT也是迭代彻消,也使用了前向分布算法,但是弱學習器限定了只能使用CART回歸樹模型宙拉,同時迭代思路和Adaboost也有所不同宾尚,簡單的說Boosting框架+CART回歸樹模型+任意損失函數。
GBDT的思想可以用一個通俗的例子解釋谢澈,假如有個人30歲煌贴,我們首先用20歲去擬合,發(fā)現(xiàn)損失有10歲锥忿,這時我們用6歲去擬合剩下的損失牛郑,發(fā)現(xiàn)差距還有4歲,第三輪我們用3歲擬合剩下的差距敬鬓,差距就只有一歲了淹朋。如果我們的迭代輪數還沒有完,可以繼續(xù)迭代下面钉答,每一輪迭代础芍,擬合的歲數誤差都會減小。

1.前向分布算法


于是数尿,前向分布算法總結如下:

  • 輸入:
    訓練數據集T ={(x1,y1), (x2, y2), ..., (xN, yN)}仑性;損失函數L(y, f(x));基函數集{b(x; r)}右蹦;
  • 輸出:
    加法模型f(x)

解:

  1. 初始化f0(x)= 0
  2. 對m = 1, 2,.., M
    a. 極小化損失函數
    (\beta_m,\gamma_m)= argmin\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma))
    得到參數βm, rm
    b. 更新
    f_m(x)= f_{m-1}(x)+\beta_mb(x;\gamma_m)
  3. 得到加法模型
    f(x) = f_M(x)=\sum_{m=1}^M\beta_mb(x;\gamma_m)
    這樣诊杆,前向分布算法將同時求解從m=1到M的所有參數βm, rm的優(yōu)化問題簡化為逐次求解各個βm, rm的優(yōu)化問題。

2.負梯度擬合

在GBDT的迭代中何陆,假設我們前一輪迭代得到的強學習器是 H_{t?1}(x)Ht?1(x), 損失函數是
J = L(f(x),H_{t?1}(x))L(f(x),H_{t?1}(x))
我們本輪迭代的目標是找到一個CART回歸樹模型的弱學習器 h_t(x)
讓本輪的損失 L(f(x),h_t(x)+H_{t?1}(x))L(f(x),h_t(x)+H_{t?1}(x))最小
那么GBDT是如何實現(xiàn)讓本輪的損失最小的呢晨汹?
針對這個問題,大牛Freidman提出了用損失函數的負梯度來擬合本輪損失 L(f(x),ht(x)+H_{t?1}(x))L(f(x),h_t(x)+H_{t?1}(x))的近似值甲献,進而擬合一個CART回歸樹宰缤。第 t 輪的第 i 個樣本的損失函數的負梯度表示為

-\left[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}\right]_{f(x)=f_{m-1}(x)}利用 (xi,r_ti),i=1,2,?,m(xi,r_ti),i=1,2,?,m,我們可以擬合一棵CART回歸樹,得到了第 t 棵回歸樹,其對應的葉結點區(qū)域 R_{tj},j=1,2,?,JR_{tj},j=1,2,?,J慨灭。其中 J 為葉子結點的個數朦乏。

針對每一個葉子結點里的樣本,我們求出使損失函數最小氧骤,也就是擬合葉子結點最好的輸出值 c_{tj}
本輪的決策樹擬合函數如下:
h_t(x)=\sum_{j=1}^Jc_{tj}I(x\epsilon R_{tj})
最終的道德強學習器表達式如下:
h_t(x)=h_{t-1}(x)+\sum_{j=1}^Jc_{tj}I(x \epsilon R_tj)
通過損失函數的負梯度來擬合呻疹,我們找到了一種通用的擬合損失誤差的辦法,這樣無輪是分類問題還是回歸問題筹陵,我們通過其損失函數的負梯度的擬合刽锤,就可以用GBDT來解決我們的分類回歸問題。區(qū)別僅僅在于損失函數不同導致的負梯度不同而已朦佩。

3.損失函數

這里我們再對常用的GBDT損失函數做一個總結并思。

  1. 對于分類算法,其損失函數一般有對數損失函數和指數損失函數兩種:
  • 如果是指數損失函數语稠,則損失函數表達式為
    L(y,h(x))=exp(?yh(x))
    其負梯度計算和葉子節(jié)點的最佳殘差擬合參見Adaboost原理篇宋彼。
  • 如果是對數損失函數,分為二元分類和多元分類兩種仙畦,
    對于二元分類
    L(y,h(x))=log(1+exp(?yh(x)))
  1. 對于回歸算法输涕,常用損失函數有如下4種:
  • 均方差,這個是最常見的回歸損失函數了
    L(y,h(x))=(y?h(x))^2
  • 絕對損失慨畸,這個損失函數也很常見
    L(y,h(x))=|y?h(x)|
    對應負梯度誤差為:
    sign(y_i?h(x_i))
  • Huber損失莱坎,它是均方差和絕對損失的折衷產物,對于遠離中心的異常點寸士,采用絕對損失檐什,而中心附近的點采用均方差。這個界限一般用分位數點度量碉京。
  • 分位數損失厢汹。它對應的是分位數回歸的損失函數。

4.回歸

輸入:訓練樣本 D={(x1,y1),(x2,y2),?,(xm,ym)}D={(x1,y1),(x2,y2),?,(xm,ym)},最大迭代次數(基學習器數量)T谐宙,損失函數 L
輸出:強學習器H(x)

算法流程

step1:
初始化基學習器
h0(x)=argmin_c\sum_{i=1}^m L(y_i,c)
step2:
當迭代次數 t=1,2,?,Tt=1,2,?,T

  1. 計算 t 次迭代的負梯度


  2. 利用 (x_i,r_ti)(i=1,2,?,m)(x_i,r_ti)(i=1,2,?,m),擬合第 t 棵CART回歸樹,其對應的葉子結點區(qū)域為R_{tj},j=1,2,?,JR_{tj},j=1,2,?,J界弧。 其中 J 為回歸樹的葉子結點的個數

  3. 對葉子結點區(qū)域j=1,2,?,Jj=1,2,?,J凡蜻,計算最佳擬合值
    ctj=argmin_c\sum_{cxi∈Rtj}L(y_i,h_t?1(x_i)+c)

  4. 更新強學習器
    h_t(x)=h_{t?1}(x)+∑^J_{j=1}c_{tj}I(x∈R_{tj})
    Step3:
    得到強學習器:
    H(x)=h_0(x)+∑^T_{t=1}∑^J_{j=1}c_{tj}I(x∈Rtj)

5.二分類,多分類

GBDT的分類算法從思想上和GBDT的回歸算法沒有本質區(qū)別垢箕,但是由于樣本輸出不是連續(xù)的值划栓,而是離散的類別,導致我們無法直接從輸出類別去擬合類別輸出的誤差条获。

為了解決這個問題忠荞,主要有兩個方法,一個是用指數損失函數,此時GBDT退化為Adaboost算法委煤。另一種方法是用類似于邏輯回歸的對數似然損失函數的方法堂油。也就是說,我們用的是類別的預測概率值和真實概率值的差來擬合損失碧绞。本文僅討論用對數似然損失函數的GBDT分類府框。而對于對數似然損失函數,我們又有二元分類和多元分類的區(qū)別讥邻。

5.1 二分類

對于二元GBDT迫靖,如果用類似于邏輯回歸的對數似然損失函數,則損失函數為:
L(y,h(x))=log(1+exp(?y_h(x)))
其中兴使,y∈{?1,+1}y∈{?1,+1}系宜。此時的負梯度誤差是 :

對于生成的決策樹,我們各個葉子節(jié)點的最佳殘差擬合值為 :
c_{tj}=argmin_c∑_{x_i∈R_{tj}}log(1+exp(?y_ih(x_i)+c))
由于上式比較難優(yōu)化发魄,我們一般使用近似值代替


除了負梯度計算和葉子節(jié)點的最佳殘差擬合的線性搜索盹牧,二元GBDT分類和GBDT回歸算法過程相同。

6.正則化

和Adaboost一樣欠母,我們也需要對GBDT進行正則化欢策,防止過擬合。GBDT的正則化主要有三種方式赏淌。

  1. 第一種是和Adaboost類似的正則化項踩寇,即步長(learning rate)。定義為ν,對于前面的弱學習器的迭代
    H_t(x)=H_{t?1}(x)+h_t(x)H_t(x)=H_{t?1}(x)+h_t(x)
    如果我們加上了正則化項六水,則有:
    H_t(x)=H_{t?1}(x)+αh_t(x),0<α≤1
    對于同樣的訓練集學習效果俺孙,較小的ν意味著我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定算法的擬合效果掷贾。

  2. 第二種正則化的方式是通過子采樣比例(subsample)睛榄。取值為(0,1]。注意這里的子采樣和隨機森林不一樣想帅,隨機森林使用的是放回抽樣场靴,而這里是不放回抽樣。如果取值為1港准,則全部樣本都使用旨剥,等于沒有使用子采樣。如果取值小于1浅缸,則只有一部分樣本會去做GBDT的決策樹擬合轨帜。選擇小于1的比例可以減少方差,即防止過擬合衩椒,但是會增加樣本擬合的偏差蚌父,因此取值不能太低哮兰。推薦在[0.5, 0.8]之間。
    使用了子采樣的GBDT有時也稱作隨機梯度提升樹(Stochastic Gradient Boosting Tree, SGBT)苟弛。由于使用了子采樣喝滞,程序可以通過采樣分發(fā)到不同的任務去做boosting的迭代過程,最后形成新樹嗡午,從而減少弱學習器難以并行學習的弱點囤躁。

  3. 第三種是對于弱學習器即CART回歸樹進行正則化剪枝。

7.優(yōu)缺點

  • 優(yōu)點:
  1. 可以靈活處理各種類型的數據荔睹,包括連續(xù)值和離散值狸演。
  2. 在相對少的調參時間情況下,預測的準備率也可以比較高僻他。這個是相對SVM來說的宵距。
  3. 使用一些健壯的損失函數疟游,對異常值的魯棒性非常強胁赢。比如 Huber損失函數和Quantile損失函數。
  • 缺點:
    由于弱學習器之間存在依賴關系汛兜,難以并行訓練數據劝篷。不過可以通過自采樣的SGBT來達到部分并行哨鸭。

8.sklearn參數

8.1 boosting框架參數

  1. n_estimators: 也就是弱學習器的最大迭代次數,或者說最大的弱學習器的個數娇妓。一般來說n_estimators太小像鸡,容易欠擬合,n_estimators太大哈恰,又容易過擬合只估,一般選擇一個適中的數值。默認是100着绷。在實際調參的過程中蛔钙,我們常常將n_estimators和下面介紹的參數learning_rate一起考慮。

  2. learning_rate: 即每個弱學習器的權重縮減系數ν荠医,也稱作步長吁脱,在原理篇的正則化章節(jié)我們也講到了,加上了正則化項彬向,我們的強學習器的迭代公式為fk(x)=fk?1(x)+νhk(x)fk(x)=fk?1(x)+νhk(x)豫喧。νν的取值范圍為0<ν≤10<ν≤1。對于同樣的訓練集擬合效果幢泼,較小的νν意味著我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定算法的擬合效果讲衫。所以這兩個參數n_estimators和learning_rate要一起調參缕棵。一般來說孵班,可以從一個小一點的νν開始調參,默認是1招驴。

  3. subsample: 即我們在原理篇的正則化章節(jié)講到的子采樣篙程,取值為(0,1]。注意這里的子采樣和隨機森林不一樣别厘,隨機森林使用的是放回抽樣虱饿,而這里是不放回抽樣。如果取值為1触趴,則全部樣本都使用氮发,等于沒有使用子采樣。如果取值小于1冗懦,則只有一部分樣本會去做GBDT的決策樹擬合爽冕。選擇小于1的比例可以減少方差,即防止過擬合披蕉,但是會增加樣本擬合的偏差颈畸,因此取值不能太低。推薦在[0.5, 0.8]之間没讲,默認是1.0眯娱,即不使用子采樣。

  4. init: 即我們的初始化的時候的弱學習器爬凑,擬合對應原理篇里面的f0(x)f0(x)徙缴,如果不輸入,則用訓練集樣本來做樣本集的初始化分類回歸預測贰谣。否則用init參數提供的學習器做初始化分類回歸預測娜搂。一般用在我們對數據有先驗知識,或者之前做過一些擬合的時候吱抚,如果沒有的話就不用管這個參數了百宇。

  5. loss: 即我們GBDT算法中的損失函數。分類模型和回歸模型的損失函數是不一樣的秘豹。

  • 對于分類模型携御,有對數似然損失函數"deviance"和指數損失函數"exponential"兩者輸入選擇。默認是對數似然損失函數"deviance"既绕。在原理篇中對這些分類損失函數有詳細的介紹啄刹。一般來說,推薦使用默認的"deviance"凄贩。它對二元分離和多元分類各自都有比較好的優(yōu)化誓军。而指數損失函數等于把我們帶到了Adaboost算法。

  • 對于回歸模型疲扎,有均方差"ls", 絕對損失"lad", Huber損失"huber"和分位數損失“quantile”昵时。默認是均方差"ls"捷雕。一般來說,如果數據的噪音點不多壹甥,用默認的均方差"ls"比較好救巷。如果是噪音點較多,則推薦用抗噪音的損失函數"huber"句柠。而如果我們需要對訓練集進行分段預測的時候浦译,則采用“quantile”。

  1. alpha:這個參數只有GradientBoostingRegressor有溯职,當我們使用Huber損失"huber"和分位數損失“quantile”時精盅,需要指定分位數的值。默認是0.9缸榄,如果噪音點較多渤弛,可以適當降低這個分位數的值

8.2 GBDT類庫弱學習器參數

這里我們再對GBDT的類庫弱學習器的重要參數做一個總結甚带。由于GBDT使用了CART回歸決策樹她肯,因此它的參數基本來源于決策樹類,也就是說鹰贵,和DecisionTreeClassifier和DecisionTreeRegressor的參數基本類似晴氨。

  1. 劃分時考慮的最大特征數max_features: 可以使用很多種類型的值,默認是"None",意味著劃分時考慮所有的特征數碉输;如果是"log2"意味著劃分時最多考慮log2Nlog2N個特征籽前;如果是"sqrt"或者"auto"意味著劃分時最多考慮N??√N個特征。如果是整數敷钾,代表考慮的特征絕對數枝哄。如果是浮點數,代表考慮特征百分比阻荒,即考慮(百分比xN)取整后的特征數挠锥。其中N為樣本總特征數。一般來說侨赡,如果樣本特征數不多蓖租,比如小于50,我們用默認的"None"就可以了羊壹,如果特征數非常多蓖宦,我們可以靈活使用剛才描述的其他取值來控制劃分時考慮的最大特征數,以控制決策樹的生成時間油猫。

  2. 決策樹最大深度max_depth: 默認可以不輸入稠茂,如果不輸入的話,決策樹在建立子樹的時候不會限制子樹的深度情妖。一般來說主慰,數據少或者特征少的時候可以不管這個值嚣州。如果模型樣本量多,特征也多的情況下共螺,推薦限制這個最大深度,具體的取值取決于數據的分布情竹。常用的可以取值10-100之間藐不。

  3. 內部節(jié)點再劃分所需最小樣本數min_samples_split: 這個值限制了子樹繼續(xù)劃分的條件,如果某節(jié)點的樣本數少于min_samples_split秦效,則不會繼續(xù)再嘗試選擇最優(yōu)特征來進行劃分雏蛮。 默認是2.如果樣本量不大,不需要管這個值阱州。如果樣本量數量級非常大挑秉,則推薦增大這個值。

  4. 葉子節(jié)點最少樣本數min_samples_leaf: 這個值限制了葉子節(jié)點最少的樣本數苔货,如果某葉子節(jié)點數目小于樣本數犀概,則會和兄弟節(jié)點一起被剪枝。 默認是1,可以輸入最少的樣本數的整數夜惭,或者最少樣本數占樣本總數的百分比姻灶。如果樣本量不大,不需要管這個值诈茧。如果樣本量數量級非常大产喉,則推薦增大這個值

  5. 葉子節(jié)點最小的樣本權重和min_weight_fraction_leaf:這個值限制了葉子節(jié)點所有樣本權重和的最小值敢会,如果小于這個值曾沈,則會和兄弟節(jié)點一起被剪枝。 默認是0鸥昏,就是不考慮權重問題塞俱。一般來說,如果我們有較多樣本有缺失值互广,或者分類樹樣本的分布類別偏差很大敛腌,就會引入樣本權重,這時我們就要注意這個值了惫皱。

  6. 最大葉子節(jié)點數max_leaf_nodes: 通過限制最大葉子節(jié)點數像樊,可以防止過擬合,默認是"None”旅敷,即不限制最大的葉子節(jié)點數生棍。如果加了限制,算法會建立在最大葉子節(jié)點數內最優(yōu)的決策樹媳谁。如果特征不多涂滴,可以不考慮這個值友酱,但是如果特征分成多的話,可以加以限制柔纵,具體的值可以通過交叉驗證得到缔杉。

  7. 節(jié)點劃分最小不純度min_impurity_split: 這個值限制了決策樹的增長,如果某節(jié)點的不純度(基于基尼系數搁料,均方差)小于這個閾值或详,則該節(jié)點不再生成子節(jié)點。即為葉子節(jié)點 郭计。一般不推薦改動默認值1e-7霸琴。

9.應用場景

該版本GBDT幾乎可用于所有回歸問題(線性/非線性),相對logistic regression僅能用于線性回歸昭伸,GBDT的適用面非常廣梧乘。亦可用于二分類問題(設定閾值,大于閾值為正例庐杨,反之為負例)

10.GBDT調參實例

import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier #Q〉鳌!辑莫!

from sklearn import model_selection,metrics
from sklearn.model_selection import GridSearchCV

import matplotlib.pylab as plt
%matplotlib inline
train = pd.read_csv('/home/kesci/input/GBDT2936/train_modified.csv')
target='Disbursed' # Disbursed的值就是二元分類的輸出
IDcol = 'ID'
train['Disbursed'].value_counts() #分別計算0学歧,1的個數

得到:

0 19680
1 320
Name: Disbursed, dtype: int64

x_columns = [x for x in train.columns if x not in [target, IDcol]] #使用不是target,ID列的數字
X = train[x_columns]
y = train['Disbursed']

先不進行任何調參看一下結果:

gbm0 = GradientBoostingClassifier(random_state=10)
gbm0.fit(X,y)
y_pred = gbm0.predict(X)
y_predprob = gbm0.predict_proba(X)[:,1]
print ("Accuracy :" ,metrics.accuracy_score(y.values, y_pred))
print ("AUC Score (Train):", metrics.roc_auc_score(y, y_predprob))

輸出如下:
Accuracy : 0.98525
AUC Score (Train): 0.9005309165396341
可見擬合得還可以各吨,我們下面看看怎么通過調參提高模型的泛化能力枝笨。

首先我們從步長(learning rate)和迭代次數(n_estimators)入手。一般來說,開始選擇一個較小的步長來網格搜索最好的迭代次數揭蜒。這里横浑,我們將步長初始值設置為0.1。對于迭代次數進行網格搜索如下:

param_test1 = {'n_estimators':range(20,81,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)
print(gsearch1.best_params_, gsearch1.best_score_)

輸出如下屉更,可見最好的迭代次數是60徙融。

([mean: 0.81285, std: 0.01967, params: {'n_estimators': 20},
mean: 0.81438, std: 0.01947, params: {'n_estimators': 30},
mean: 0.81451, std: 0.01933, params: {'n_estimators': 40},
mean: 0.81618, std: 0.01848, params: {'n_estimators': 50},
mean: 0.81751, std: 0.01736, params: {'n_estimators': 60},
mean: 0.81547, std: 0.01900, params: {'n_estimators': 70},
mean: 0.81299, std: 0.01860, params: {'n_estimators': 80}],
{'n_estimators': 60},
0.8175146087398375)

找到了一個合適的迭代次數,現(xiàn)在我們開始對決策樹進行調參瑰谜。首先我們對決策樹最大深度max_depth和內部節(jié)點再劃分所需最小樣本數min_samples_split進行網格搜索欺冀。

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.best_params_, gsearch2.best_score_

{'max_depth': 7, 'min_samples_split': 300},
0.8213724275914632)

決策樹深度7是一個比較合理的值,我們把它定下來,下面我們再對內部節(jié)點再劃分所需最小樣本數min_samples_split和葉子節(jié)點最少樣本數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.best_params_, gsearch3.best_score_

得到:
({'min_samples_leaf': 60, 'min_samples_split': 1200}, 0.8222032996697154)

gbm1 = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60,max_depth=7, min_samples_leaf =60, 
               min_samples_split =1200, max_features='sqrt', subsample=0.8, random_state=10)
gbm1.fit(X,y)
y_pred = gbm1.predict(X)
y_predprob = gbm1.predict_proba(X)[:,1]
print ("Accuracy : ",metrics.accuracy_score(y.values, y_pred))
print ("AUC Score (Train): ",metrics.roc_auc_score(y, y_predprob))

得到結果如下:
Accuracy : 0.984
AUC Score (Train): 0.9080987201473576
對比我們最開始完全不調參的擬合效果隐轩,可見精確度稍有下降,主要原理是我們使用了0.8的子采樣渤早,20%的數據沒有參與擬合职车。

現(xiàn)在我們再對最大特征數max_features進行網格搜索。

param_test4 = {'max_features':range(7,20,2)}
gsearch4 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60,max_depth=7, min_samples_leaf =60, 
               min_samples_split =1200, subsample=0.8, random_state=10), 
                       param_grid = param_test4, scoring='roc_auc',iid=False, cv=5)
gsearch4.fit(X,y)
gsearch4.best_params_, gsearch4.best_score_

輸出如下:
{'max_features': 9},
0.822412506351626)

現(xiàn)在我們再對子采樣的比例進行網格搜索:

#再對子采樣比例進行網格搜索
param_test5 = {'subsample':[0.6,0.7,0.75,0.8,0.85,0.9]}
gsearch5 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60,max_depth=7, min_samples_leaf =60, 
               min_samples_split =1200, max_features=9, random_state=10), 
                       param_grid = param_test5, scoring='roc_auc',iid=False, cv=5)
gsearch5.fit(X,y)
gsearch5.best_params_, gsearch5.best_score_

({'subsample': 0.7}, 0.8234378969766262)

現(xiàn)在基本已經得到我們所有調優(yōu)的參數結果了。這時我們可以減半步長悴灵,最大迭代次數加倍來增加我們模型的泛化能力扛芽。再次擬合模型:

gbm2 = GradientBoostingClassifier(learning_rate=0.05, n_estimators=120,max_depth=7, min_samples_leaf =60, 
               min_samples_split =1200, max_features=9, subsample=0.7, random_state=10)
gbm2.fit(X,y)
y_pred = gbm2.predict(X)
y_predprob = gbm2.predict_proba(X)[:,1]
print("Accuracy :", metrics.accuracy_score(y.values, y_pred))
print("AUC Score :",metrics.roc_auc_score(y, y_predprob))

Accuracy : 0.984
AUC Score : 0.9053244886941056

可以看到AUC分數比起之前的版本稍有下降,這個原因是我們?yōu)榱嗽黾幽P头夯芰鳎瑸榉乐惯^擬合而減半步長川尖,最大迭代次數加倍,同時減小了子采樣的比例赡鲜,從而減少了訓練集的擬合程度空厌。
下面我們繼續(xù)將步長縮小5倍,最大迭代次數增加5倍银酬,繼續(xù)擬合我們的模型:

gbm3 = GradientBoostingClassifier(learning_rate=0.01, n_estimators=600,max_depth=7, min_samples_leaf =60, 
               min_samples_split =1200, max_features=9, subsample=0.7, random_state=10)
gbm3.fit(X,y)
y_pred = gbm3.predict(X)
y_predprob = gbm3.predict_proba(X)[:,1]
print("Accuracy :", metrics.accuracy_score(y.values, y_pred))
print("AUC Score :",metrics.roc_auc_score(y, y_predprob))

輸出如下,可見減小步長增加迭代次數可以在保證泛化能力的基礎上增加一些擬合程度筐钟。
Accuracy : 0.984
AUC Score (Train): 0.908581
最后再來一次:

gbm4 = GradientBoostingClassifier(learning_rate=0.005, n_estimators=1200,max_depth=7, min_samples_leaf =60, 
               min_samples_split =1200, max_features=9, subsample=0.7, random_state=10)
gbm4.fit(X,y)
y_pred = gbm4.predict(X)
y_predprob = gbm4.predict_proba(X)[:,1]
print("Accuracy :", metrics.accuracy_score(y.values, y_pred))
print("AUC Score :",metrics.roc_auc_score(y, y_predprob))

Accuracy : 0.984
AUC Score : 0.9082321042936993
輸出如下揩瞪,此時由于步長實在太小,導致擬合效果反而變差篓冲,也就是說李破,步長不能設置的過小。

參考資料:

  1. https://blog.csdn.net/molu_chase/article/details/78111148
  2. http://www.cnblogs.com/DjangoBlog/p/6201663.html
  3. https://www.cnblogs.com/pinard/p/6140514.html
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末壹将,一起剝皮案震驚了整個濱河市嗤攻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诽俯,老刑警劉巖妇菱,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異暴区,居然都是意外死亡闯团,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門房交,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伐割,你說我怎么就攤上這事候味。” “怎么了隔心?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵白群,是天一觀的道長。 經常有香客問我济炎,道長川抡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮崖堤,結果婚禮上侍咱,老公的妹妹穿的比我還像新娘。我一直安慰自己密幔,他們只是感情好楔脯,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胯甩,像睡著了一般昧廷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偎箫,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天木柬,我揣著相機與錄音,去河邊找鬼淹办。 笑死眉枕,一個胖子當著我的面吹牛,可吹牛的內容都是我干的怜森。 我是一名探鬼主播速挑,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼副硅!你這毒婦竟也來了姥宝?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恐疲,失蹤者是張志新(化名)和其女友劉穎腊满,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體流纹,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡糜烹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了漱凝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疮蹦。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茸炒,靈堂內的尸體忽然破棺而出愕乎,到底是詐尸還是另有隱情,我是刑警寧澤壁公,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布感论,位于F島的核電站,受9級特大地震影響紊册,放射性物質發(fā)生泄漏比肄。R本人自食惡果不足惜快耿,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芳绩。 院中可真熱鬧掀亥,春花似錦、人聲如沸妥色。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘹害。三九已至撮竿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笔呀,已是汗流浹背幢踏。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留许师,地道東北人惑折。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像枯跑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子白热,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容