xgboost原理及調(diào)參方法-通俗易懂版本

??xgboost是各種比賽中最常使用的方法锉桑,網(wǎng)上介紹非常多铺厨,但是大部分看起來都比較費勁,這篇文章我將通俗的講一下xgboost是在干什么颈走,是怎么實現(xiàn)的膳灶,每一步的細節(jié)中要注意什么問題,達到理解—應用的程度立由,想了解具體理論的各位看官請移步其他文章轧钓。

1.xgboost原理

??說起xgboost,我們不得不提一下GBDT锐膜,也就是梯度提升決策樹毕箍,這是一種基于樹的集成算法,至于什么方法構(gòu)成了GBDT的決策樹道盏,無非就是ID3而柑、C4.5、C5.0捞奕、CART,最常用的就是那個CART拄轻,多棵樹的集合就構(gòu)成了GBDT颅围。其實GBDT是對殘差的擬合,什么意思呢恨搓?假設(shè)目標函數(shù)是9院促,第一棵樹預測為5,剩下4的誤差斧抱,那么下一顆樹繼續(xù)擬合4常拓,直至誤差滿足我們的要求,這和xgboost的思路是一樣的辉浦。那么問題來了弄抬,有了GBDT為啥還要用xgboost呢,有一種說法是宪郊,GBDT的每一步優(yōu)化都依賴于上一步的誤差掂恕,當大數(shù)據(jù)量的時候就太慢了拖陆,xgboost通過改變目標函數(shù)來避免了這個問題。
??GBDT的目標函數(shù)是預測值和真實值差的累加懊亡,也就是誤差累加依啰,可以看出每一步計算都依賴于上面所有步的誤差,效率比較低店枣。xgboost自然要做出改進速警,怎么優(yōu)化呢,一步步分解來看鸯两。

  • 形式上闷旧,在目標函數(shù)后面加一個懲罰項:
    xgboost目標函數(shù)
  • 目標函數(shù)簡化,采用高數(shù)中的泰勒展開甩卓,回憶一下泰勒展開是什么:
    泰勒展開模式

    ??好了怎么應用到上面的目標函數(shù)中呢鸠匀,先來確認f(x)是啥,這個f(x)是上面說的那個損失函數(shù)l(yi,),也就是我們只泰勒展開這個l(yi,)就行了逾柿,那么扎展開的時候我們需要知道這個▽x是什么缀棍,來看損失函數(shù)的形式,yi-\hat{y(t-1)}是個常量我們上一步求的机错,可以當f(x)來看爬范,其中x自然是變量\hat{y(t-1)},求導也要對它求弱匪。f(xi)是這把我們求的青瀑,是導致函數(shù)值變化的原因,巧了這個▽x也表示變化的原因萧诫,那么他兩是一個東西斥难。
    ??現(xiàn)在能展開了吧,請看下式:
    損失函數(shù)的泰勒展開

    ??這不還是坑人嗎帘饶,怎么變得這么簡潔的哑诊,其實吧gi和hi是下面這樣的:

    ??好了前面那個l,我們上一步不是求出來了嗎及刻,把它忽略掉吧镀裤,損失函數(shù)變成這樣了:
    損失函數(shù)的簡化形式

    ??到了這一步,目標函數(shù)已經(jīng)和上一步的損失無關(guān)了缴饭,也就是xgboost擺脫了GBDT的缺點暑劝,可以并行計算了,核心做法是做了個泰勒展開颗搂,但你以為xgboost就這樣了嗎担猛,那你就太年輕了,繼續(xù)來看。
  • 樹復雜度表達式展開
    ??怎么還有個Ω沒給我解釋呢毁习,別急啊智嚷,來了,這個Ω是表示樹的復雜度的纺且,你想啊樹的復雜度能怎么表示盏道,首先你得考慮葉子節(jié)點個數(shù)吧,然后xgboost人家考慮的更多一些载碌,還把葉子節(jié)點的得分給考慮進去了猜嘱,并且為了防止葉子節(jié)點太多影響你計算,給你加了個L2正則化嫁艇,啥不懂L2正則化朗伶,自己去百度吧。同時為了平衡這兩個指標步咪,人家還給加了兩個權(quán)重论皆,是不是很貼心。


    樹的復雜度的表示方法

    ??等一下啊猾漫,道理我都明白点晴,但是你能不能告訴我葉子節(jié)點得分是怎么算的。這個吧悯周,其實對于單顆決策樹是很好理解的粒督,如果是分類問題那么這個數(shù)就是0-1之間的一個數(shù),代表的是樣本分到這個節(jié)點上的得分值禽翼,如果是回歸問題屠橄,那么這個值就是樣本的平均值。但是對于xgboost闰挡,我們都把決策樹的目標給改了锐墙,這個東西你不得算出來啊,計算方法在后邊說长酗,就是一個最優(yōu)目標函數(shù)對應一個最優(yōu)得分值溪北。

  • 目標函數(shù)的整合,目標函數(shù)的兩個部分都知道咋回事了吧花枫,把它放到一起吧刻盐,這樣的話我們才能看怎么去優(yōu)化掏膏,合并以后的公式是這樣子的:


    整合以后的目標函數(shù)形式

    ??這個w好像能合并到一起啊劳翰,合到一起試試。


    進一步整合目標函數(shù)

    ??看上去頭暈眼花的馒疹,什么東西啊佳簸,能不能再簡單點,當然能。先這樣:

    ??然后再這樣:


    目標函數(shù)的最終形式
  • 目標函數(shù)的優(yōu)化生均,都到這一步了可以優(yōu)化了吧听想,這里邊變量就剩葉子節(jié)點的得分了,我們來求導马胧,得到下面這個東西:


    目標函數(shù)的優(yōu)化

    ??等一下啊汉买,這個w不就是前面說的葉子節(jié)點得分值,原來是這么算的佩脊,求這個其實就是為了求目標函數(shù)值蛙粘。好了有了目標函數(shù)值,接下來干嘛威彰〕瞿粒回頭想想我們的目標,我們現(xiàn)在知道要擬合的殘差歇盼,我們有特征舔痕,接下來我們要找一顆最優(yōu)的樹進行樣本劃分啊,咋找豹缀,決策樹找最優(yōu)劃分點不是算增益最大嗎伯复,那么我們拿著這個目標函數(shù)去找最大的增益不就是現(xiàn)在這棵樹的目標了嗎。好了怎么算呢耿眉,看下面式子:


    樹結(jié)構(gòu)劃分標準

    ??其實劃分算法太多了边翼,有很多是為了提高效率的,這個就交給包內(nèi)部去解決吧鸣剪,我們知道他是要劃分樹了就好了组底。
    ??如此循環(huán)往復,一個xgboost過程就完成了筐骇,其實大概就是拿到值先找到一顆差不多的樹债鸡,一看不行啊還有誤差啊,拿著這個誤差再去找一棵樹繼續(xù)擬合铛纬,等到擬合的差不多了厌均,這些個樹就集成到一起進行劃分。那么xgboost是怎么預測的告唆,其實一句話就可以理解棺弊,就是每棵樹葉子節(jié)點得分的加和,想想你的指標在每棵樹上都有滿足條件的劃分擒悬,如果劃分到那一類就把葉子節(jié)點的得分加起來模她。其實xgboost還有縮減和列取樣的問題,意思是防止過擬合懂牧,就是說每一步葉子節(jié)點的權(quán)重都要乘上一個系數(shù)侈净,這樣的話使每棵樹葉子節(jié)點權(quán)重對結(jié)果影響不會太大,剩下更多的空間交給模型去擬合,還有一個列取樣其實是為了計算簡便畜侦,每次計算時從特征空間中選出幾個來構(gòu)建樹元扔。

2.python導入相關(guān)包

??python簡直太友好了,可以直接調(diào)用xgboost包跑程序旋膳,我們要做的就是提取指標和調(diào)參澎语,提取指標這個事我教不了你,得根據(jù)業(yè)務(wù)來验懊,調(diào)參倒是有套路可尋咏连。首先你要實現(xiàn)一個xgboost,你要知道你用什么工具去實現(xiàn)鲁森,python里有兩個包祟滴,一個就叫xgboost,另外一個是xgboost的sklearn接口歌溉,叫XGBClassifer垄懂。另外要調(diào)參還有一個并行的網(wǎng)格搜索包,sklearn里的GridSearchCV痛垛。其他還有一些包需要引入就是打打輔助草慧。

import pandas as pd
import numpy as np
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from sklearn import cross_validation, metrics   #交叉驗證和效果評估,其他模型也很常用匙头。
from sklearn.grid_search import GridSearchCV   #并行搜索漫谷,加快速度。

3.xgboost調(diào)參

??準備工作已經(jīng)做好了蹂析,接下來開始調(diào)參工作了舔示,調(diào)參之前大家記得要做兩件件事,就是先把數(shù)據(jù)整理好电抚,把模型搭建好惕稻。

3.1 搭建模型

??簡單的很,已經(jīng)引入了XGBClassifier蝙叛,直接把相關(guān)默認參數(shù)設(shè)置好就可以了俺祠。

clf1 = XGBClassifier(learning_rate =0.1,
 n_estimators=1000,
 max_depth=5,
 min_child_weight=1,
 gamma=0,
 subsample=0.8,
 colsample_bytree=0.8,
 objective= 'binary:logistic',
 nthread=4,
 scale_pos_weight=1,
 seed=27)

3.2 參數(shù)解釋

我們看到在建立xgboost的模型時,有很多參數(shù)借帘,這些參數(shù)是什么意思呢蜘渣,我們來看一下。

  • 一般參數(shù)
    這些參數(shù)用來控制XGBoost的整體功能肺然,是一些通用的設(shè)置蔫缸,有的時候都不用調(diào)整。
    (1)booster[默認gbtree]
    每次迭代的模型選擇狰挡,有兩個gbtree:基于樹的模型和gbliner:線性模型捂龄,顯然我們一般都會選擇gbtree。
    (2)silent[默認0]
    是否開啟靜默模式加叁,0為不開啟倦沧,1為開啟,開啟后不輸出任何信息它匕,顯然這不利于我們調(diào)參展融,默認選0就好了。
    (3)nthread[默認取最大線程數(shù)]
    這個參數(shù)用來控制最大并行的線程數(shù)豫柬,如果你希望取得所有CPU的核告希,那么你就不用管它。
  • booster參數(shù)或者說樹的參數(shù)
    這些參數(shù)是要重點調(diào)整的烧给,比較重要燕偶,主要是用來控制每一步樹的生成。
    (1)eta [default=0.3]
    學習率參數(shù)础嫡,就是原理中說的縮減指么,保證每一顆樹對于結(jié)果的影響不太大,從而保證模型的效果榴鼎。更新葉子節(jié)點權(quán)重時伯诬,乘以該系數(shù),避免步長過大巫财。參數(shù)值越大盗似,越可能無法收斂。把學習率 eta 設(shè)置的小一些平项,小學習率可以使得后面的學習更加仔細赫舒。 典型值為0.01-0.2。
    (2)min_child_weight [default=1]
    大家對他的解釋是決定最小葉子節(jié)點樣本權(quán)重和闽瓢,不太好理解号阿。看了一些解釋的文章鸳粉,這個值可以理解為H值扔涧,還記得H值嗎,就是損失函數(shù)對y(t-1)的二階導數(shù)和届谈,那么如果損失函數(shù)是平方函數(shù)(回歸問題)枯夜,這個就是1,如果是對數(shù)損失函數(shù)(分類問題)艰山,導數(shù)是a(1-a)的形式湖雹,a代表sigmoid函數(shù),這樣的話當y預測值非常大的時候曙搬,這個式子的值接近于0摔吏,這當然是不好的鸽嫂,因此你要給他設(shè)定一個閾值,小于這個閾值就不分裂了≌鹘玻現(xiàn)在可以解釋了据某,這個值代表所有樣本二階導數(shù)的和,和上邊說的葉子得分不是一個事诗箍,如果是回歸問題實際代表樣本個數(shù)癣籽,如果是分類問題實際代表a(1-a)所有樣本計算值的加和。
    明白這個參數(shù)是啥以后滤祖,來看他是干嘛的筷狼,這個參數(shù)用于避免過擬合,當它的值較大時匠童,可以避免模型學習到局部的特殊樣本埂材。舉個栗子來說,對正負樣本不均衡時的 0-1 分類而言汤求,假設(shè) h 在 0.01 附近楞遏,min_child_weight 為 1 意味著葉子節(jié)點中最少需要包含 100 個樣本,實際是通過控制樣本數(shù)來控制過擬合的首昔。你們應該看出來這個值越小越容易過擬合寡喝,需要通過cv進行調(diào)整優(yōu)化。
    (3)max_depth [default=6]
    這個沒啥好說的勒奇,每棵樹的最大深度预鬓,也是用來避免過擬合的,max_depth越大赊颠,模型會學到更具體更局部的樣本格二,典型值3-10,要用cv調(diào)優(yōu)竣蹦。
    (4)max_leaf_nodes
    樹上最大節(jié)點的數(shù)量顶猜,和上面的那個參數(shù)一樣,如果定義了這個參數(shù)就會忽略掉max_depth參數(shù)痘括,我們調(diào)優(yōu)還是以max_depth為主吧长窄。
    (5)gamma[default=0]
    一聽這種希臘字母就知道是個系數(shù),在樹的葉子節(jié)點上作進一步分區(qū)所需的最小損失減少纲菌。越大挠日,算法越保守。取值在[0,∞] 翰舌。通俗點講就是嚣潜,這個節(jié)點還劃不劃分,先看看損失減不減少了再說椅贱。同樣需要cv調(diào)優(yōu)懂算。
    (6)max_delta_step [default=0]
    這參數(shù)限制每棵樹權(quán)重改變的最大步長只冻。如果這個參數(shù)的值為0,那就意味著沒有約束计技。如果它被賦予了某個正值喜德,那么它會讓這個算法更加保守。通常酸役,這個參數(shù)不需要設(shè)置。但是當各類別的樣本十分不平衡時驾胆,它對邏輯回歸是很有幫助的涣澡。也就是說這個參數(shù)不用管啊沃斤。
    (7)subsample [default=1]
    樣本采樣用的柄慰,減小這個參數(shù)的值冗美,算法會更加保守腋妙,避免過擬合某宪,但是如果這個值設(shè)置得過小栋操,它可能會導致欠擬合僵腺。典型值:0.5-1衡查。既然有個范圍呵晚,給他個面子cv調(diào)優(yōu)一把吧蜘腌。
    (8)colsample_bytree [default=1]
    列采樣,就是選擇生成樹的特征饵隙,前面介紹過了撮珠,和設(shè)置縮減率一樣是為了干嘛來著,是為了防止過擬合的金矛,一般設(shè)置為: 0.5-1 芯急,也要用cv擬合。
    (9)colsample_bylevel[default=1]
    等一下哈驶俊,這個怎么和上面參數(shù)這么像娶耍,哦,它是在上面樹的基礎(chǔ)上饼酿,對每一級進行分裂時對列(就是特征)進行采樣榕酒,大神們都說這個參數(shù)不用用了,用上面那個就行了故俐。
    (10)lambda [default=1]
    又是個系數(shù)奈应,這個是控制L2正則的,就是目標函數(shù)里的那個葉子節(jié)點得分前邊的系數(shù)购披,用不用看你自己了杖挣。
    (11)alpha [default=0]
    想必你也想到了吧,有L2就有L1刚陡,用不用全憑自己了惩妇。
    (12) scale_pos_weight [default=1]
    這個是控制樣本均衡與否的株汉,如果是不均衡樣本,設(shè)置一個正數(shù)可以保證快速收斂歌殃,具體為什么乔妈,也沒人解釋,先留著吧氓皱。
    (13)tree_method[default=’auto’]
    還記得我說過樹的生成有很多方法吧路召,他們介紹的老復雜了,別看了波材,人家自動給我們打包好了股淡,有三個可選的值, {‘a(chǎn)uto’, ‘exact’, ‘a(chǎn)pprox’} 廷区,分別對應 貪心算法(小數(shù)據(jù)集)/近似算法(大數(shù)據(jù)集) 唯灵。
    大概就這么多吧,如果看到了別的隙轻,我再補充埠帕。
  • 學習目標參數(shù)
    這個是最后一類參數(shù)了,跟目標函數(shù)有關(guān)玖绿。
    (1)objective [ default=reg:linear ]
    這是返回目標函數(shù)值敛瓷,這個東西包含的函數(shù)還挺多,默認是線形的斑匪。此外你還可以選擇:binary:logistic 二分類的邏輯回歸琐驴,返回預測的概率(不是類別)。multi:softmax 使用softmax的多分類器秤标,返回預測的類別(不是概率)绝淡。在這種情況下,你還需要多設(shè)一個參數(shù):num_class(類別數(shù)目)苍姜。multi:softprob 和multi:softmax參數(shù)一樣牢酵,但是返回的是每個數(shù)據(jù)屬于各個類別的概率。
    (2)eval_metric[默認值取決于objective參數(shù)的取值]
    也就是說怎么計算目標函數(shù)值衙猪,根據(jù)你目標函數(shù)的形式來馍乙,對于回歸問題,默認值是rmse垫释,對于分類問題丝格,默認值是error。比較典型的有(我直接截圖了懶得打字):


    損失函數(shù)計算方法

    你應該知道吧目標函數(shù)值和實際值之間的差距棵譬,就是這個參數(shù)要計算的重點显蝌。
    (3)seed(default=0)
    這個叫隨機數(shù)種子,還記得random包里那個seed嗎订咸,這個參數(shù)就是為了可以使結(jié)果復現(xiàn)曼尊。

  • 命令行參數(shù)
    n_estimators 這個參數(shù)叫迭代次數(shù)酬诀,也就是說生成樹的個數(shù)。
  • 更多參數(shù)
    更多參數(shù)請移步官方文檔:xgboost官方文檔

??知道了這些參數(shù)骆撇,想要弄明白調(diào)參是干啥瞒御,調(diào)整什么就很容易了,下面會結(jié)合例子來說明神郊。

3.3 調(diào)參方法

??先來推薦一個大哥的博客肴裙,這個鏈接里https://blog.csdn.net/u014465639/article/details/74351982寫了好幾種模型的調(diào)參方法,想要了解的不妨去看看涌乳。
??開始之前蜻懦,給大家介紹一個新朋友,這個東西可以很好的幫助我們進行調(diào)參爷怀,它是sklearn里的一個包阻肩,[sklearn.model_selection.GridSearchCV],我們調(diào)參就是基于這個包的。那么這個包怎么實現(xiàn)調(diào)參呢,來看一眼它的常用參數(shù)纺讲。
(1)estimator:優(yōu)化器肋坚,也就是你建立的模型诲泌,這里自然就是xgboost模型敷扫,如果要對其他集成算法調(diào)優(yōu),那就寫其他模型了脊髓,注意模型需要初始化哦屏镊。
(2)param_grid:字典或者列表律罢,一般用字典歌逢,請在這里輸入你要優(yōu)化的參數(shù)值砰苍。
(3)scoring :用啥子估計誤差,如果不設(shè)置,那我沒辦法了,就用estimator的誤差來衡量吧厂置。
??有了上面的方法,我們還會怕調(diào)參數(shù)嗎瞧栗,當然不會了,先設(shè)置好常用的參數(shù),然后再依次調(diào)參。請注意,調(diào)參是有順序的,按照下面這個來栗恩。

  • 1.n_estimators
    ??叫迭代次數(shù)乳乌,也就是生成樹的個數(shù)磷瘤。
cv_params = {'n_estimators': [400, 500, 600, 700, 800]}
other_params = {'learning_rate': 0.1, 'n_estimators': 500, 'max_depth': 5, 'min_child_weight': 1, 'seed': 0,
                    'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}

??咦扳抽,這里邊有n_estimators的值了镰烧,其實就是以他為基準進行挑選啊,首先給個基礎(chǔ)值進去楞陷,給誰啊怔鳖,當然是建立的初始模型了。

model = xgb.XGBRegressor(**other_params)

??然后跑一下模型固蛾,這個我最后統(tǒng)一說败砂,反正最后給出一個最優(yōu)值,但是我們設(shè)置的粒度太粗了魏铅,不能直接用昌犹,接下來細調(diào),同樣方法跑一遍览芳。

cv_params = {'n_estimators': [550, 575, 600, 650, 675]}
  • 2.min_child_weight和max_depth
    ??這兩個參數(shù)是控制樹生成的斜姥,樹的結(jié)構(gòu)對于最終的結(jié)果影響還是很大的,所以這個放到第二個調(diào)整批次是應當?shù)牟拙梗瑑蓚€參數(shù)可以一起調(diào)铸敏。
cv_params = {'max_depth': [3, 4, 5, 6, 7, 8, 9, 10], 'min_child_weight': [1, 2, 3, 4, 5, 6]}
other_params = {'learning_rate': 0.1, 'n_estimators': 550, 'max_depth': 5, 'min_child_weight': 1,
 'seed': 0,'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}

  • 3.gamma
    ??控制節(jié)點分裂標準的。
cv_params = {'gamma': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]}
  • 4.subsample和colsample_bytree
    ??采樣的放一起悟泵,都是比例杈笔。
cv_params = {'subsample': [0.6, 0.7, 0.8, 0.9], 'colsample_bytree': [0.6, 0.7, 0.8, 0.9]}
    1. reg_alpha和reg_lambda
      ??正則化的指標,這里有一點需要注意你看這個寫法和上面原理好像不一樣啊糕非,其實就是直接XGB包和XGB包的sklearn接口的區(qū)別蒙具,一般都調(diào)用sklearn接口,所以就寫成符合sklearn習慣的樣子了朽肥。
cv_params = {'reg_alpha': [0.05, 0.1, 1, 2, 3], 'reg_lambda': [0.05, 0.1, 1, 2, 3]}
  • 6.learning_rate
    ??學習率禁筏,每一葉子節(jié)點得分需要乘上這個數(shù),一般比較小衡招,從小的數(shù)字調(diào)起篱昔。
cv_params = {'learning_rate': [0.01, 0.05, 0.07, 0.1, 0.2]}

??基本調(diào)參就告一段落了,這里需要特別指出一點就是調(diào)參可以提高模型性能始腾,但是更重要的還是特征選擇州刽,數(shù)據(jù)清洗,特征融合等工作浪箭,大家注意把基礎(chǔ)工作做好穗椅。

4.完整代碼

??基礎(chǔ)數(shù)據(jù)啥的我就不列了啊,大概說一下概要吧山林,和網(wǎng)上的不一樣房待,我也是按照自己的想法做了一些省略邢羔。

#1.建立一個初步的模型,看一下效果怎么樣桑孩。
xgb1 = XGBClassifier(
 learning_rate =0.1,
 n_estimators=1000,
 max_depth=5,
 min_child_weight=1,
 gamma=0,
 subsample=0.8,
 colsample_bytree=0.8,
 objective= 'binary:logistic',
 nthread=4,
 scale_pos_weight=1,
 seed=27)#經(jīng)驗值
xgb_param = xgb1.get_xgb_params()#得到模型的參數(shù) 
xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)#轉(zhuǎn)換成原生xgboost需要的數(shù)據(jù)格式拜鹤。
cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
        metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)#注意啊這是原生的模型自帶的,你只需傳參流椒,cv_folds=5敏簿,表示5%的數(shù)據(jù)用于交叉驗證。這個cvresults返回訓練集和測試集的誤差宣虾,行數(shù)就是最大迭代的次數(shù)惯裕。
xgb1.set_params(n_estimators=cvresult.shape[0])
xgb1.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc')
dtrain_predictions = alg.predict(dtrain[predictors])#算準確率用的
dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1]#算auc用的
feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False)#算重要度的指標
#‘weight’ - the number of times a feature is used to split the data across all trees.‘gain’ - the average gain of the feature when it is used in trees.‘cover’ - the average coverage of the feature when it is used in trees.
#weight - 該特征在所有樹中被用作分割樣本的特征的次數(shù)。gain - 在所有樹中的平均增益绣硝。cover - 在樹中使用該特征時的平均覆蓋范圍蜻势。
#
#2開始按步驟調(diào)參用的XGBclassifer。
#第一步調(diào)優(yōu)
params_test1 = {'n_estimators': [400, 500, 600, 700, 800]}
other_params = {'learning_rate': 0.1, 'n_estimators': 500, 'max_depth': 5, 'min_child_weight': 1, 'seed': 27,
                    'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}
model = XGBClassfoer(**other_params)
optimized_XGB 1= GridSearchCV(estimator=model, param_grid=cv_params, scoring='r2', cv=5, verbose=1, n_jobs=4)
optimized_XGB.fit(X_train, y_train)
evalute_result = optimized_GBM.grid_scores_
##第二步調(diào)優(yōu)
param_test2 = { 'max_depth':range(3,10,2), 'min_child_weight':range(1,6,2)}
optimized_XGB2= GridSearchCV(estimator = XGBClassifier(         learning_rate =0.1, n_estimators=140, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8,             colsample_bytree=0.8,
 objective= 'binary:logistic', nthread=4,     scale_pos_weight=1, seed=27),  param_grid = param_test2,     scoring='roc_auc',n_jobs=4,iid=False, cv=5)
optimized_XGB2.fit(train[predictors],train[target])
optimized_XGB2.grid_scores_, optimized_XGB2.best_params_,     optimized_XGB2.best_score_
#依次類推鹉胖,得到最后的最優(yōu)參數(shù)集合握玛,再建立模型用于預測
#3.最終模型
model = XGBClassifer(learning_rate=0.1, n_estimators=550, max_depth=4, min_child_weight=5, seed=27,
                             subsample=0.7, colsample_bytree=0.7, gamma=0.1, reg_alpha=1, reg_lambda=1)
model.fit(X_train, y_train)
ans = model.predict(X_test)
  以上就是本篇的所有內(nèi)容,很多東西就是講思路甫菠,讓大家都知道怎么回事挠铲,準確性可能差點,如果你想有更深的理解寂诱,還是結(jié)合其他人的文章看看拂苹。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市痰洒,隨后出現(xiàn)的幾起案子瓢棒,更是在濱河造成了極大的恐慌,老刑警劉巖带迟,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件音羞,死亡現(xiàn)場離奇詭異囱桨,居然都是意外死亡仓犬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門舍肠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搀继,“玉大人,你說我怎么就攤上這事翠语∵辞” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵肌括,是天一觀的道長点骑。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么黑滴? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任憨募,我火速辦了婚禮,結(jié)果婚禮上袁辈,老公的妹妹穿的比我還像新娘菜谣。我一直安慰自己,他們只是感情好晚缩,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布尾膊。 她就那樣靜靜地躺著,像睡著了一般荞彼。 火紅的嫁衣襯著肌膚如雪冈敛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天鸣皂,我揣著相機與錄音莺债,去河邊找鬼。 笑死签夭,一個胖子當著我的面吹牛齐邦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播第租,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼措拇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慎宾?” 一聲冷哼從身側(cè)響起丐吓,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趟据,沒想到半個月后券犁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡汹碱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年粘衬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咳促。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡稚新,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出跪腹,到底是詐尸還是另有隱情褂删,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布冲茸,位于F島的核電站屯阀,受9級特大地震影響缅帘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜难衰,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一股毫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧召衔,春花似錦铃诬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至醇蝴,卻和暖如春宣肚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悠栓。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工霉涨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惭适。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓笙瑟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親癞志。 傳聞我的和親對象是個殘疾皇子往枷,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容