最近在弄畢設(shè)中需要用到GBDT,關(guān)于調(diào)參這塊一竅不通,然后找到了一篇很好的介紹它調(diào)參的文章,這里拿來共享一下恩脂。<a>http://www.07net01.com/2016/12/1742073.html</a>
在梯度提升樹(GBDT)原理小結(jié)中,我們對GBDT的原理做了總結(jié)趣斤,本文我們就從scikit-learn里GBDT的類庫使用方法作一個總結(jié)俩块,主要會關(guān)注調(diào)參中的一些要點。
- scikit-learn GBDT類庫概述
在sacikit-learn中浓领,GradientBoostingClassifier為GBDT的分類類玉凯, 而GradientBoostingRegressor為GBDT的回歸類。兩者的參數(shù)類型完全相同联贩,當然有些參數(shù)比如損失函數(shù)loss的可選擇項并不相同漫仆。這些參數(shù)中,類似于Adaboost泪幌,我們把重要參數(shù)分為兩類盲厌,第一類是Boosting框架的重要參數(shù)署照,第二類是弱學(xué)習(xí)器即CART回歸樹的重要參數(shù)。
下面我們就從這兩個方面來介紹這些參數(shù)的使用吗浩。 - GBDT類庫boosting框架參數(shù)
首先建芙,我們來看boosting框架相關(guān)的重要參數(shù)。由于GradientBoostingClassifier和GradientBoostingRegressor的參數(shù)絕大部分相同懂扼,我們下面會一起來講禁荸,不同點會單獨指出。
1) n_estimators: 也就是弱學(xué)習(xí)器的最大迭代次數(shù)阀湿,或者說最大的弱學(xué)習(xí)器的個數(shù)赶熟。一般來說n_estimators太小,容易欠擬合炕倘,n_estimators太大,又容易過擬合翰撑,一般選擇一個適中的數(shù)值罩旋。默認是100。在實際調(diào)參的過程中眶诈,我們常常將n_estimators和下面介紹的參數(shù)learning_rate一起考慮涨醋。
2) learning_rate: 即每個弱學(xué)習(xí)器的權(quán)重縮減系數(shù)$\nu$,也稱作步長逝撬,在原理篇的正則化章節(jié)我們也講到了浴骂,加上了正則化項,我們的強學(xué)習(xí)器的迭代公式為$f_{k}(x) = f_{k-1}(x) + \nu h_k(x) $宪潮。$\nu$的取值范圍為$0 < \nu \leq 1 $溯警。對于同樣的訓(xùn)練集擬合效果,較小的$\nu$意味著我們需要更多的弱學(xué)習(xí)器的迭代次數(shù)狡相。通常我們用步長和迭代最大次數(shù)一起來決定算法的擬合效果梯轻。所以這兩個參數(shù)n_estimators和learning_rate要一起調(diào)參。一般來說尽棕,可以從一個小一點的$\nu$開始調(diào)參喳挑,默認是1。
3) subsample: 即我們在原理篇的正則化章節(jié)講到的子采樣滔悉,取值為(0,1]伊诵。注意這里的子采樣和隨機森林不一樣,隨機森林使用的是放回抽樣回官,而這里是不放回抽樣曹宴。如果取值為1,則全部樣本都使用歉提,等于沒有使用子采樣浙炼。如果取值小于1份氧,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小于1的比例可以減少方差弯屈,即防止過擬合蜗帜,但是會增加樣本擬合的偏差,因此取值不能太低资厉。推薦在[0.5, 0.8]之間厅缺,默認是1.0,即不使用子采樣宴偿。
4) init: 即我們的初始化的時候的弱學(xué)習(xí)器湘捎,擬合對應(yīng)原理篇里面的$f_{0}(x)$,如果不輸入窄刘,則用訓(xùn)練集樣本來做樣本集的初始化分類回歸預(yù)測窥妇。否則用init參數(shù)提供的學(xué)習(xí)器做初始化分類回歸預(yù)測。一般用在我們對數(shù)據(jù)有先驗知識娩践,或者之前做過一些擬合的時候活翩,如果沒有的話就不用管這個參數(shù)了。
5) **loss: **即我們GBDT算法中的損失函數(shù)翻伺。分類模型和回歸模型的損失函數(shù)是不一樣的材泄。
對于分類模型,有對數(shù)似然損失函數(shù)"deviance"和指數(shù)損失函數(shù)"exponential"兩者輸入選擇吨岭。默認是對數(shù)似然損失函數(shù)"deviance"拉宗。在原理篇中對這些分類損失函數(shù)有詳細的介紹。一般來說辣辫,推薦使用默認的"deviance"旦事。它對二元分離和多元分類各自都有比較好的優(yōu)化。而指數(shù)損失函數(shù)等于把我們帶到了Adaboost算法急灭。
對于回歸模型族檬,有均方差"ls", 絕對損失"lad", Huber損失"huber"和分位數(shù)損失“quantile”。默認是均方差"ls"化戳。一般來說单料,如果數(shù)據(jù)的噪音點不多,用默認的均方差"ls"比較好点楼。如果是噪音點較多扫尖,則推薦用抗噪音的損失函數(shù)"huber"。而如果我們需要對訓(xùn)練集進行分段預(yù)測的時候掠廓,則采用“quantile”换怖。
6) alpha:這個參數(shù)只有GradientBoostingRegressor有,當我們使用Huber損失"huber"和分位數(shù)損失“quantile”時蟀瞧,需要指定分位數(shù)的值沉颂。默認是0.9条摸,如果噪音點較多,可以適當降低這個分位數(shù)的值铸屉。 - GBDT類庫弱學(xué)習(xí)器參數(shù)
這里我們再對GBDT的類庫弱學(xué)習(xí)器的重要參數(shù)做一個總結(jié)钉蒲。由于GBDT使用了CART回歸決策樹,因此它的參數(shù)基本來源于決策樹類彻坛,也就是說顷啼,和DecisionTreeClassifier和DecisionTreeRegressor的參數(shù)基本類似。如果你已經(jīng)很熟悉決策樹算法的調(diào)參昌屉,那么這一節(jié)基本可以跳過钙蒙。不熟悉的朋友可以繼續(xù)看下去。
1) 劃分時考慮的最大特征數(shù)max_features: 可以使用很多種類型的值间驮,默認是"None",意味著劃分時考慮所有的特征數(shù)躬厌;如果是"log2"意味著劃分時最多考慮$log_2N$個特征;如果是"sqrt"或者"auto"意味著劃分時最多考慮$\sqrt{N}$個特征竞帽。如果是整數(shù)扛施,代表考慮的特征絕對數(shù)。如果是浮點數(shù)抢呆,代表考慮特征百分比煮嫌,即考慮(百分比xN)取整后的特征數(shù)笛谦。其中N為樣本總特征數(shù)抱虐。一般來說,如果樣本特征數(shù)不多饥脑,比如小于50恳邀,我們用默認的"None"就可以了,如果特征數(shù)非常多灶轰,我們可以靈活使用剛才描述的其他取值來控制劃分時考慮的最大特征數(shù)谣沸,以控制決策樹的生成時間。
2) 決策樹最大深度max_depth: 默認可以不輸入笋颤,如果不輸入的話乳附,決策樹在建立子樹的時候不會限制子樹的深度。一般來說伴澄,數(shù)據(jù)少或者特征少的時候可以不管這個值赋除。如果模型樣本量多,特征也多的情況下非凌,推薦限制這個最大深度举农,具體的取值取決于數(shù)據(jù)的分布。常用的可以取值10-100之間敞嗡。
3) 內(nèi)部節(jié)點再劃分所需最小樣本數(shù)min_samples_split: 這個值限制了子樹繼續(xù)劃分的條件颁糟,如果某節(jié)點的樣本數(shù)少于min_samples_split航背,則不會繼續(xù)再嘗試選擇最優(yōu)特征來進行劃分。 默認是2.如果樣本量不大棱貌,不需要管這個值玖媚。如果樣本量數(shù)量級非常大,則推薦增大這個值键畴。
4) 葉子節(jié)點最少樣本數(shù)min_samples_leaf: 這個值限制了葉子節(jié)點最少的樣本數(shù)最盅,如果某葉子節(jié)點數(shù)目小于樣本數(shù),則會和兄弟節(jié)點一起被剪枝起惕。 默認是1,可以輸入最少的樣本數(shù)的整數(shù)涡贱,或者最少樣本數(shù)占樣本總數(shù)的百分比。如果樣本量不大惹想,不需要管這個值问词。如果樣本量數(shù)量級非常大,則推薦增大這個值嘀粱。
5)葉子節(jié)點最小的樣本權(quán)重和min_weight_fraction_leaf:這個值限制了葉子節(jié)點所有樣本權(quán)重和的最小值激挪,如果小于這個值,則會和兄弟節(jié)點一起被剪枝锋叨。 默認是0垄分,就是不考慮權(quán)重問題。一般來說娃磺,如果我們有較多樣本有缺失值薄湿,或者分類樹樣本的分布類別偏差很大,就會引入樣本權(quán)重偷卧,這時我們就要注意這個值了豺瘤。
6) 最大葉子節(jié)點數(shù)max_leaf_nodes: 通過限制最大葉子節(jié)點數(shù),可以防止過擬合听诸,默認是"None”坐求,即不限制最大的葉子節(jié)點數(shù)。如果加了限制晌梨,算法會建立在最大葉子節(jié)點數(shù)內(nèi)最優(yōu)的決策樹桥嗤。如果特征不多,可以不考慮這個值仔蝌,但是如果特征分成多的話泛领,可以加以限制,具體的值可以通過交叉驗證得到掌逛。
7) 節(jié)點劃分最小不純度**min_impurity_split: ** 這個值限制了決策樹的增長师逸,如果某節(jié)點的不純度(基于基尼系數(shù),均方差)小于這個閾值,則該節(jié)點不再生成子節(jié)點篓像。即為葉子節(jié)點 动知。一般不推薦改動默認值1e-7。 - GBDT調(diào)參實例
這里我們用一個二元分類的例子來講解下GBDT的調(diào)參员辩。這部分參考了這個Github上的數(shù)據(jù)調(diào)參過程Parameter_Tuning_GBM_with_Example盒粮。這個例子的數(shù)據(jù)有87000多行,單機跑會比較慢奠滑,下面的例子我只選擇了它的前面20000行丹皱,我將其打包后,下載地址在這宋税。
首先摊崭,我們載入需要的類庫:
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn import cross_validation, metricsfrom sklearn.grid_search
import GridSearchCVimport matplotlib.pylab as plt
%matplotlib inline
接著,我們把解壓的數(shù)據(jù)用下面的代碼載入杰赛,順便看看數(shù)據(jù)的類別分布呢簸。
train = pd.read_csv('train_modified.csv')
target='Disbursed' # Disbursed的值就是二元分類的輸出
IDcol = 'ID'train['Disbursed'].value_counts()
可以看到類別輸出如下,也就是類別0的占大多數(shù)乏屯。
0 19680
1 320
Name: Disbursed, dtype: int64
現(xiàn)在我們得到我們的訓(xùn)練集根时。最后一列Disbursed是分類輸出。前面的所有列(不考慮ID列)都是樣本特征辰晕。
x_columns = [x for x in train.columns if x not in [target, IDcol]]
X = train[x_columns]
y = train['Disbursed']
不管任何參數(shù)蛤迎,都用默認的,我們擬合下數(shù)據(jù)看看:
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)
輸出如下含友,可見擬合還可以替裆,我們下面看看怎么通過調(diào)參提高模型的泛化能力。
Accuracy : 0.9852
AUC Score (Train): 0.900531
首先我們從步長(learning rate)和迭代次數(shù)(n_estimators)入手唱较。一般來說,開始選擇一個較小的步長來網(wǎng)格搜索最好的迭代次數(shù)扎唾。這里召川,我們將步長初始值設(shè)置為0.1南缓。對于迭代次數(shù)進行網(wǎng)格搜索如下:
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_
輸出如下,可見最好的迭代次數(shù)是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)
找到了一個合適的迭代次數(shù)汉形,現(xiàn)在我們開始對決策樹進行調(diào)參。首先我們對決策樹最大深度max_depth和內(nèi)部節(jié)點再劃分所需最小樣本數(shù)min_samples_split進行網(wǎng)格搜索倍阐。
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,內(nèi)部節(jié)點再劃分所需最小樣本數(shù)是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是一個比較合理的值岔冀,我們把它定下來,對于內(nèi)部節(jié)點再劃分所需最小樣本數(shù)min_samples_split概耻,我們暫時不能一起定下來使套,因為這個還和決策樹其他的參數(shù)存在關(guān)聯(lián)罐呼。下面我們再對內(nèi)部節(jié)點再劃分所需最小樣本數(shù)min_samples_split和葉子節(jié)點最少樣本數(shù)min_samples_leaf一起調(diào)參。
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_
輸出結(jié)果如下侦高,可見這個min_samples_split在邊界值嫉柴,還有進一步調(diào)試小于邊界60的必要。由于這里只是例子奉呛,所以大家可以自己下來用包含小于60的網(wǎng)格搜索來尋找合適的值计螺。
([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)
我們調(diào)了這么多參數(shù)了,終于可以都放到GBDT類里面去看看效果了∏谱常現(xiàn)在我們用新參數(shù)擬合數(shù)據(jù):
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.984AUC
Score (Train): 0.908099
對比我們最開始完全不調(diào)參的擬合效果登馒,可見精確度稍有下降,主要原理是我們使用了0.8的子采樣咆槽,20%的數(shù)據(jù)沒有參與擬合谊娇。
現(xiàn)在我們再對最大特征數(shù)max_features進行網(wǎng)格搜索。
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)
現(xiàn)在我們再對子采樣的比例進行網(wǎng)格搜索:
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)
現(xiàn)在我們基本已經(jīng)得到我們所有調(diào)優(yōu)的參數(shù)結(jié)果了罗晕。這時我們可以減半步長济欢,最大迭代次數(shù)加倍來增加我們模型的泛化能力。再次擬合我們的模型:
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.984AUC
Score (Train): 0.905324
可以看到AUC分數(shù)比起之前的版本稍有下降小渊,這個原因是我們?yōu)榱嗽黾幽P头夯芰Ψㄈ欤瑸榉乐惯^擬合而減半步長,最大迭代次數(shù)加倍酬屉,同時減小了子采樣的比例半等,從而減少了訓(xùn)練集的擬合程度。
下面我們繼續(xù)將步長縮小5倍呐萨,最大迭代次數(shù)增加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 : %.4g" % metrics.accuracy_score(y.values, y_pred)
print "AUC Score (Train): %f" % metrics.roc_auc_score(y, y_predprob)
輸出如下,可見減小步長增加迭代次數(shù)可以在保證泛化能力的基礎(chǔ)上增加一些擬合程度谬擦。
Accuracy : 0.984AUC
Score (Train): 0.908581
最后我們繼續(xù)步長縮小一半切距,最大迭代次數(shù)增加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)
輸出如下惨远,此時由于步長實在太小谜悟,導(dǎo)致擬合效果反而變差,也就是說北秽,步長不能設(shè)置的過小葡幸。
Accuracy : 0.984AUC
Score (Train): 0.908232