Sklearn-GBDT(GradientBoostingDecisonTree)梯度提升樹

  1. GBDT類庫概述

GBDT有很多簡稱,有GBTGradient Boosting Tree, GTBGradient Tree Boosting), GBRTGradient Boosting Regression Tree,MART(Multiple Additive Regression Tree),其實都是指的同一種算法sklearn中稱爲GradientTree Boosting,分類爲GradientBoostingClassifier,迴歸爲GradientBoostingRegressor

GBDT也是集成學習Boosting家族的成員,但是卻和傳統的Adaboost有很大的不同。回顧下Adaboost是利用前一輪迭代弱學習器的誤差率來更新訓練集的權重,這樣一輪輪的迭代下去。GBDT也是迭代,使用了前向分佈算法,但是弱學習器限定了只能使用CART迴歸樹模型,同時迭代思路和Adaboost也有所不同。

GBDT的迭代中,假設我們前一輪迭代得到的強學習器是ft1(x), 損失函數是L(y,ft1(x),我們本輪迭代的目標是找到一個CART迴歸樹模型的弱學習器ht(x),讓本輪的損失L(y,ft(x)=L(y,ft1(x)+ht(x))最小。也就是說,本輪迭代找到決策樹,要讓樣本的損失儘量變得更小。

GBDT的思想可以用一個通俗的例子解釋,假如有個人30歲,我們首先用20歲去擬合,發現損失有10歲,這時我們用6歲去擬合剩下的損失,發現差距還有4歲,第三輪我們用3歲擬合剩下的差距,差距就只有一歲了(殘差作爲下一輪擬合的數據的理解)。如果我們的迭代輪數還沒有完,可以繼續迭代下面,每一輪迭代,擬合的歲數誤差都會減小。


2. GBDT類庫boosting框架參數

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

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

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

3)subsample:默認爲1正則化的子採樣,防止過擬合,取值爲(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,如果噪音點較多,可以適當降低這個分位數的值。


3. GBDT類庫弱學習器參數

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

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

2) max_depth:決策樹最大深度。默認爲"None",決策樹在建立子樹的時候不會限制子樹的深度這樣建樹時,會使每一個葉節點只有一個類別,或是達到min_samples_split。一般來說,數據少或者特徵少的時候可以不管這個值。如果模型樣本量多,特徵也多的情況下,推薦限制這個最大深度,具體的取值取決於數據的分佈。常用的可以取值10-100之間。

3)min_samples_split:內部節點再劃分所需最小樣本數,默認2。這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少於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

8)presort:是否對數據進行預分類,以加快擬閤中最佳分裂點的發現。默認False,適用於大數據集。小數據集使用True,可以加快訓練。是否預排序,預排序可以加速查找最佳分裂點,對於稀疏數據不管用,Bool,auto:非稀疏數據則預排序,若稀疏數據則不預排序

  • 上面決策樹參數中最重要的包括最大特徵數max_features最大深度max_depth內部節點再劃分所需最小樣本數min_samples_split和葉子節點最少樣本數min_samples_leaf

4. GBDT調參實例

這裏用一個二元分類的例子來講解下GBDT的調參。這部分參考了Parameter_Tuning_GBM_with_Example的數據調參過程。這個例子的數據有87000多行,單機跑會比較慢,下面的例子我選擇了它的前面20000行,下載地址

 

#首先載入需要的類庫 

import pandas as pd
import numpy as np
from sklearn.ensembleimport GradientBoostingClassifier
from sklearn importcross_validation, metrics
fromsklearn.grid_search import GridSearchCV
 
importmatplotlib.pylab as plt
%matplotlib inline

#接着把解壓的數據用下面的代碼載入,順便看看數據的類別分佈

train= pd.read_csv('train_modified.csv')
target='Disbursed'# Disbursed的值就是二元分類的輸出
IDcol= 'ID'
train['Disbursed'].value_counts()

可以看到類別輸出如下,也就是類別0的佔大多數。

0    19680

1      320

Name:Disbursed, dtype: int64


現在得到訓練集,最後一列,Disbrsed是分類輸出。前面的所有列(不考慮ID列)都是樣本特徵。

x_columns= [x for x in train.columns if x not in [target, IDcol]]
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 : %.4g" % metrics.accuracy_score(y.values, y_pred)
print"AUC Score (Train): %f" % metrics.roc_auc_score(y, y_predprob)


輸出如下,可見擬合還可以,我們下面看看怎麼通過調參提高模型的泛化能力

Accuracy: 0.9852

AUCScore (Train): 0.900531

 

首先從步長(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)
gsearch1.grid_scores_,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)

 

找到了一個合適的迭代次數,現在開始對決策樹進行調參。首先我們對決策樹最大深度max_depth和內部節點再劃分所需最小樣本數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.grid_scores_,gsearch2.best_params_, gsearch2.best_score_

 輸出如下,可見最好的最大樹深度是7,內部節點再劃分所需最小樣本數是300。

([mean:0.81199, std: 0.02073, params: {'min_samples_split': 100, 'max_depth': 3},

  mean: 0.81267, std: 0.01985, params:{'min_samples_split': 300, 'max_depth': 3},

  mean: 0.81238, std: 0.01937, params:{'min_samples_split': 500, 'max_depth': 3},

  mean: 0.80925, std: 0.02051, params:{'min_samples_split': 700, 'max_depth': 3},

  mean: 0.81846, std: 0.01843, params:{'min_samples_split': 100, 'max_depth': 5},

  mean: 0.81630, std: 0.01810, params:{'min_samples_split': 300, 'max_depth': 5},

  mean: 0.81315, std: 0.01898, params:{'min_samples_split': 500, 'max_depth': 5},

  mean: 0.81262, std: 0.02090, params:{'min_samples_split': 700, 'max_depth': 5},

  mean: 0.81807, std: 0.02004, params:{'min_samples_split': 100, 'max_depth': 7},

  mean: 0.82137, std: 0.01733, params:{'min_samples_split': 300, 'max_depth': 7},

  mean: 0.81703, std: 0.01773, params:{'min_samples_split': 500, 'max_depth': 7},

  mean: 0.81383, std: 0.02327, params:{'min_samples_split': 700, 'max_depth': 7},

  mean: 0.81107, std: 0.02178, params:{'min_samples_split': 100, 'max_depth': 9},

  mean: 0.80944, std: 0.02612, params:{'min_samples_split': 300, 'max_depth': 9},

  mean: 0.81476, std: 0.01973, params:{'min_samples_split': 500, 'max_depth': 9},

  mean: 0.81601, std: 0.02576, params:{'min_samples_split': 700, 'max_depth': 9},

  mean: 0.81091, std: 0.02227, params:{'min_samples_split': 100, 'max_depth': 11},

  mean: 0.81309, std: 0.02696, params:{'min_samples_split': 300, 'max_depth': 11},

  mean: 0.81713, std: 0.02379, params:{'min_samples_split': 500, 'max_depth': 11},

  mean: 0.81347, std: 0.02702, params:{'min_samples_split': 700, 'max_depth': 11},

  mean: 0.81444, std: 0.01813, params:{'min_samples_split': 100, 'max_depth': 13},

  mean: 0.80825, std: 0.02291, params:{'min_samples_split': 300, 'max_depth': 13},

  mean: 0.81923, std: 0.01693, params:{'min_samples_split': 500, 'max_depth': 13},

  mean: 0.81382, std: 0.02258, params:{'min_samples_split': 700, 'max_depth': 13}],

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

 0.8213724275914632)

 

由於決策樹深度7是一個比較合理的值,我們把它定下來,對於內部節點再劃分所需最小樣本數min_samples_split,我們暫時不能一起定下來,因爲這個還和決策樹其他的參數存在關聯。下面我們再對內部節點再劃分所需最小樣本數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_

輸出結果如下,可見這個min_samples_split在邊界值,還有進一步調試小於邊界60的必要。由於這裏只是例子,所以大家可以自己下來用包含小於60的網格搜索來尋找合適的值

([mean:0.81828, std: 0.02251, params: {'min_samples_split': 800, 'min_samples_leaf':60},

  mean: 0.81731, std: 0.02344, params:{'min_samples_split': 1000, 'min_samples_leaf': 60},

  mean: 0.82220,std: 0.02250, params: {'min_samples_split': 1200, 'min_samples_leaf': 60},

  mean: 0.81447, std: 0.02125, params:{'min_samples_split': 1400, 'min_samples_leaf': 60},

  mean: 0.81495, std: 0.01626, params:{'min_samples_split': 1600, 'min_samples_leaf': 60},

  mean: 0.81528, std: 0.02140, params:{'min_samples_split': 1800, 'min_samples_leaf': 60},

  mean: 0.81590, std: 0.02517, params:{'min_samples_split': 800, 'min_samples_leaf': 70},

  mean: 0.81573, std: 0.02207, params:{'min_samples_split': 1000, 'min_samples_leaf': 70},

  mean: 0.82021, std: 0.02521, params:{'min_samples_split': 1200, 'min_samples_leaf': 70},

  mean: 0.81512, std: 0.01995, params:{'min_samples_split': 1400, 'min_samples_leaf': 70},

  mean: 0.81395, std: 0.02081, params:{'min_samples_split': 1600, 'min_samples_leaf': 70},

  mean: 0.81587, std: 0.02082, params:{'min_samples_split': 1800, 'min_samples_leaf': 70},

  mean: 0.82064, std: 0.02698, params:{'min_samples_split': 800, 'min_samples_leaf': 80},

  mean: 0.81490, std: 0.02475, params:{'min_samples_split': 1000, 'min_samples_leaf': 80},

  mean: 0.82009, std: 0.02568, params:{'min_samples_split': 1200, 'min_samples_leaf': 80},

  mean: 0.81850, std: 0.02226, params:{'min_samples_split': 1400, 'min_samples_leaf': 80},

  mean: 0.81855, std: 0.02099, params:{'min_samples_split': 1600, 'min_samples_leaf': 80},

  mean: 0.81666, std: 0.02249, params:{'min_samples_split': 1800, 'min_samples_leaf': 80},

  mean: 0.81960, std: 0.02437, params:{'min_samples_split': 800, 'min_samples_leaf': 90},

  mean: 0.81560, std: 0.02235, params:{'min_samples_split': 1000, 'min_samples_leaf': 90},

  mean: 0.81936, std: 0.02542, params:{'min_samples_split': 1200, 'min_samples_leaf': 90},

  mean: 0.81362, std: 0.02254, params:{'min_samples_split': 1400, 'min_samples_leaf': 90},

  mean: 0.81429, std: 0.02417, params:{'min_samples_split': 1600, 'min_samples_leaf': 90},

  mean: 0.81299, std: 0.02262, params:{'min_samples_split': 1800, 'min_samples_leaf': 90},

  mean: 0.82000, std: 0.02511, params:{'min_samples_split': 800, 'min_samples_leaf': 100},

  mean: 0.82209, std: 0.01816, params:{'min_samples_split': 1000, 'min_samples_leaf': 100},

  mean: 0.81821, std: 0.02337, params:{'min_samples_split': 1200, 'min_samples_leaf': 100},

  mean: 0.81922, std: 0.02377, params:{'min_samples_split': 1400, 'min_samples_leaf': 100},

  mean: 0.81545, std: 0.02221, params:{'min_samples_split': 1600, 'min_samples_leaf': 100},

  mean: 0.81704, std: 0.02509, params:{'min_samples_split': 1800, 'min_samples_leaf': 100}],

 {'min_samples_leaf': 60, 'min_samples_split':1200},

 0.8222032996697154)

 

調了這麼多參數了,終於可以都放到GBDT類裏面去看看效果了。現在我們用新參數擬合數據:

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 : %.4g" % metrics.accuracy_score(y.values, y_pred)
print"AUC Score (Train): %f" % metrics.roc_auc_score(y, y_predprob) 

輸出如下:

Accuracy: 0.984

AUCScore (Train): 0.908099

對比我們最開始完全不調參的擬合效果,可見精確度稍有下降,主要原理是我們使用了0.8的子採樣,20%的數據沒有參與擬合。

 

現在我們再對最大特徵數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.grid_scores_,gsearch4.best_params_, gsearch4.best_score_ 

輸出如下:

([mean:0.82220, std: 0.02250, params: {'max_features': 7},

  mean: 0.82241, std: 0.02421, params:{'max_features': 9},

  mean: 0.82108, std: 0.02302, params:{'max_features': 11},

  mean: 0.82064, std: 0.01900, params:{'max_features': 13},

  mean: 0.82198, std: 0.01514, params:{'max_features': 15},

  mean: 0.81355, std: 0.02053, params:{'max_features': 17},

  mean: 0.81877, std: 0.01863, params:{'max_features': 19}],

 {'max_features': 9},

 0.822412506351626)


現在我們再對子採樣的比例進行網格搜索:

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

輸出如下:

([mean:0.81828, std: 0.02392, params: {'subsample': 0.6},

  mean: 0.82344, std: 0.02708, params:{'subsample': 0.7},

  mean: 0.81673, std: 0.02196, params:{'subsample': 0.75},

  mean: 0.82241, std: 0.02421, params:{'subsample': 0.8},

  mean: 0.82285, std: 0.02446, params:{'subsample': 0.85},

  mean: 0.81738, std: 0.02236, params:{'subsample': 0.9}],

 {'subsample': 0.7},

 0.8234378969766262)

 

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

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 : %.4g" % metrics.accuracy_score(y.values, y_pred)
print"AUC Score (Train): %f" % metrics.roc_auc_score(y, y_predprob) 

輸出如下:

Accuracy: 0.984

AUCScore (Train): 0.905324

可以看到AUC分數比起之前的版本稍有下降,這個原因是我們爲了增加模型泛化能力,爲防止過擬合而減半步長,最大迭代次數加倍,同時減小了子採樣的比例,從而減少了訓練集的擬合程度。

 

下面我們繼續將步長縮小5倍,最大迭代次數增加5倍,繼續擬合我們的模型:

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 : %.4g" % metrics.accuracy_score(y.values, y_pred)
print"AUC Score (Train): %f" % metrics.roc_auc_score(y, y_predprob) 

輸出如下,可見減小步長增加迭代次數可以在保證泛化能力的基礎上增加一些擬合程度

Accuracy: 0.984

AUCScore (Train): 0.908581

 

最後我們繼續步長縮小一半,最大迭代次數增加2倍,擬合我們的模型:

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 : %.4g" % metrics.accuracy_score(y.values, y_pred)
print"AUC Score (Train): %f" % metrics.roc_auc_score(y, y_predprob)

輸出如下,此時由於步長實在太小,導致擬合效果反而變差,也就是說,步長不能設置的過小。

Accuracy: 0.984

AUCScore (Train): 0.908232

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