XGBoost
XGBoost(Extreme Gradient Boosting)全名叫極端梯度提升樹鸥拧,XGBoost是集成學(xué)習(xí)方法的王牌,在Kaggle數(shù)據(jù)挖掘比賽中拆宛,大部分獲勝者用了XGBoost浑厚。XGBoost在絕大多數(shù)的回歸和分類問題上表現(xiàn)的十分頂尖
最優(yōu)模型的構(gòu)建方法
我們在前面已經(jīng)知道蔓罚,構(gòu)建最優(yōu)模型的一般方法是最小化訓(xùn)練數(shù)據(jù)的損失函數(shù)。
我們用字母 L表示損失瞻颂,如下式
其中豺谈,F(xiàn)是假設(shè)空間假設(shè)空間是在已知屬性和屬性可能取值的情況下,對所有可能滿足目標(biāo)的情況的一種毫無遺漏的假設(shè)集合贡这。式(1.1)稱為經(jīng)驗風(fēng)險最小化茬末,訓(xùn)練得到的模型復(fù)雜度較高。當(dāng)訓(xùn)練數(shù)據(jù)較小時盖矫,模型很容易出現(xiàn)過擬合問題丽惭。
因此,為了降低模型的復(fù)雜度辈双,常采用下式:
其中J(f)為模型的復(fù)雜度责掏,式(2.1)稱為
結(jié)構(gòu)風(fēng)險最小化
,結(jié)構(gòu)風(fēng)險最小化的模型往往對訓(xùn)練數(shù)據(jù)以及未知的測試數(shù)據(jù)都有較好的預(yù)測
應(yīng)用:
- 決策樹的生成和剪枝分別對應(yīng)了經(jīng)驗風(fēng)險最小化和結(jié)構(gòu)風(fēng)險最小化湃望,
- XGBoost的決策樹生成是結(jié)構(gòu)風(fēng)險最小化的結(jié)果
XGBoost的目標(biāo)函數(shù)推導(dǎo)
目標(biāo)函數(shù)確定
目標(biāo)函數(shù)换衬,即損失函數(shù),通過最小化損失函數(shù)來構(gòu)建最優(yōu)模型证芭。
由前面可知瞳浦, 損失函數(shù)應(yīng)加上表示模型復(fù)雜度的正則項,且XGBoost對應(yīng)的模型包含了多個CART樹废士,因此叫潦,模型的目標(biāo)函數(shù)為:
(3.1)式是正則化的損失函數(shù);中
yi
是模型的實際輸出結(jié)果官硝,yhati
是模型的輸出結(jié)果矗蕊;等式右邊第一部分是模型的訓(xùn)練誤差,第二部分是正則化項氢架,這里的正則化項是K棵樹
的正則化項相加而來的傻咖。
CART樹
上圖為第K棵CART樹,確定一棵CART樹需要確定兩部分达箍,第一部分就是樹的結(jié)構(gòu)没龙,這個結(jié)構(gòu)將輸入樣本映射到一個確定的葉子節(jié)點上,記為f_k(x) 第二部分就是各個葉子節(jié)點的值,q(x)表示輸出的葉子節(jié)點序號, w_q(x)表示對應(yīng)葉子節(jié)點序號的值硬纤。由定義得:
樹的復(fù)雜度定義
-
定義每課樹的復(fù)雜度
假設(shè)我們要預(yù)測一家人對電子游戲的喜好程度解滓,考慮到年輕和年老相比,年輕更可能喜歡電子游戲筝家,以及男性和女性相比洼裤,男性更喜歡電子游戲,故先根據(jù)年齡大小區(qū)分小孩和大人溪王,然后再通過性別區(qū)分開是男是女腮鞍,逐一給各人在電子游戲喜好程度上打分,如下圖所示:
就這樣莹菱,訓(xùn)練出了2棵樹tree1和tree2移国,類似之前gbdt的原理,兩棵樹的結(jié)論累加起來便是最終的結(jié)論道伟,所以: - 小男孩的預(yù)測分數(shù)就是兩棵樹中小孩所落到的結(jié)點的分數(shù)相加:2 + 0.9 = 2.9迹缀。
- 爺爺?shù)念A(yù)測分數(shù)同理:-1 + (-0.9)= -1.9。
具體如下圖所示
如下例樹的復(fù)雜度表示:
目標(biāo)函數(shù)推導(dǎo)
根據(jù)(3.1)式蜜徽,共進行t次迭代的學(xué)習(xí)模型的目標(biāo)函數(shù)為:
由前向分布算法可知祝懂,前t-1棵樹的結(jié)構(gòu)為常數(shù)
我們知道,泰勒公式的二階導(dǎo)近似表示:
XGBoost的回歸樹構(gòu)建方法
計算分裂節(jié)點
在實際訓(xùn)練過程中拘鞋,當(dāng)建立第 t 棵樹時砚蓬,XGBoost采用貪心法進行樹結(jié)點的分裂:
從樹深為0時開始:對樹中的每個葉子結(jié)點嘗試進行分裂;每次分裂后盆色,原來的一個葉子結(jié)點繼續(xù)分裂為左右兩個子葉子結(jié)點灰蛙,原葉子結(jié)點中的樣本集將根據(jù)該結(jié)點的判斷規(guī)則分散到左右兩個葉子結(jié)點中;新分裂一個結(jié)點后傅事,我們需要檢測這次分裂是否會給損失函數(shù)帶來增益缕允,增益的定義如下:
如果增益Gain>0,即分裂為兩個葉子節(jié)點后蹭越,目標(biāo)函數(shù)下降了,那么我們會考慮此次分裂的結(jié)果教届。
那么一直這樣分裂响鹃,什么時候才會停止呢
停止分裂條件判斷
情況一:上節(jié)推導(dǎo)得到的打分函數(shù)是衡量樹結(jié)構(gòu)好壞的標(biāo)準,因此案训,可用打分函數(shù)來選擇最佳切分點买置。首先確定樣本特征的所有切分點,對每一個確定的切分點進行切分强霎,切分好壞的標(biāo)準如下:
Gain表示單節(jié)點obj與切分后的兩個節(jié)點的樹obj之差忿项,遍歷所有特征的切分點,找到最大Gain的切分點即是最佳分裂點,根據(jù)這種方法繼續(xù)切分節(jié)點轩触,得到CART樹寞酿。若 值設(shè)置的過大,則Gain為負脱柱,表示不切分該節(jié)點伐弹,因為切分后的樹結(jié)構(gòu)變差了。 值越大榨为,表示對切分后obj下降幅度要求越嚴惨好,這個值可以在XGBoost中設(shè)定。
情況二:當(dāng)樹達到最大深度時随闺,停止建樹日川,因為樹的深度太深容易出現(xiàn)過擬合,這里需要設(shè)置一個超參數(shù)max_depth矩乐。
情況三:當(dāng)引入一次分裂后逗鸣,重新計算新生成的左、右兩個葉子結(jié)點的樣本權(quán)重和绰精。如果任一個葉子結(jié)點的樣本權(quán)重低于某一個閾值撒璧,也會放棄此次分裂。這涉及到一個超參數(shù):最小樣本權(quán)重和笨使,是指如果一個葉子節(jié)點包含的樣本數(shù)量太少也會放棄分裂卿樱,防止樹分的太細,這也是過擬合的一種措施硫椰。
XGBoost與GDBT的區(qū)別
- 區(qū)別一:
- XGBoost生成CART樹考慮了樹的復(fù)雜度繁调,
- GDBT未考慮,GDBT在樹的剪枝步驟中考慮了樹的復(fù)雜度靶草。
- 區(qū)別二:
- XGBoost是擬合上一輪損失函數(shù)的二階導(dǎo)展開
- GDBT是擬合上一輪損失函數(shù)的一階導(dǎo)展開
- 因此蹄胰,XGBoost的準確性更高,且滿足相同的訓(xùn)練效果奕翔,需要的迭代次數(shù)更少裕寨。
- 區(qū)別三:
- XGBoost與GDBT都是逐次迭代來提高模型性能,但是XGBoost在選取最佳切分點時可以開啟多線程進行派继,大大提高了運行速度宾袜。
API
1 . xgboost的安裝:
官網(wǎng)鏈接:https://xgboost.readthedocs.io/en/latest/
pip3 install xgboost
2 . xgboost參數(shù)介紹
xgboost雖然被稱為kaggle比賽神奇,但是驾窟,我們要想訓(xùn)練出不錯的模型庆猫,必須要給參數(shù)傳遞合適的值。
xgboost中封裝了很多參數(shù)绅络,主要由三種類型構(gòu)成:通用參數(shù)(general parameters)月培,Booster 參數(shù)(booster parameters)和學(xué)習(xí)目標(biāo)參數(shù)(task parameters)
- 通用參數(shù):主要是宏觀函數(shù)控制嘁字;
- Booster參數(shù):取決于選擇的Booster類型,用于控制每一步的booster(tree, regressiong)杉畜;
- 學(xué)習(xí)目標(biāo)參數(shù):控制訓(xùn)練目標(biāo)的表現(xiàn)纪蜒。
2.1 通用參數(shù)(general parameters)
- booster [缺省值=gbtree]
- 決定使用哪個booster,可以是gbtree寻行,gblinear或者dart霍掺。gbtree和dart使用基于樹的模型(dart 主要多了 Dropout),而gblinear 使用線性函數(shù).
- silent [缺省值=0]設(shè)置為0打印運行信息拌蜘;設(shè)置為1靜默模式杆烁,不打印
- nthread [缺省值=設(shè)置為最大可能的線程數(shù) 并行運行xgboost的線程數(shù),輸入的參數(shù)應(yīng)該<=系統(tǒng)的CPU核心數(shù)简卧,若是沒有設(shè)置算法會檢測將其設(shè)置為CPU的全部核心數(shù)
下面的兩個參數(shù)不需要設(shè)置兔魂,使用默認的就好了
- num_pbuffer [xgboost自動設(shè)置,不需要用戶設(shè)置]預(yù)測結(jié)果緩存大小举娩,通常設(shè)置為訓(xùn)練實例的個數(shù)析校。該緩存用于保存最后boosting操作的預(yù)測結(jié)果。
- num_feature [xgboost自動設(shè)置铜涉,不需要用戶設(shè)置]在boosting中使用特征的維度,設(shè)置為特征的最大維度
2.2 Booster 參數(shù)(booster parameters)
Parameters for Tree Booster
eta [缺省值=0.3芙代,別名:learning_rate] 更新中減少的步長來防止過擬合吊奢。在每次boosting之后,可以直接獲得新的特征權(quán)值纹烹,這樣可以使得boosting更加魯棒页滚。范圍: [0,1]
gamma [缺省值=0,別名: min_split_loss](分裂最小loss)在節(jié)點分裂時铺呵,只有分裂后損失函數(shù)的值下降了裹驰,才會分裂這個節(jié)點。Gamma指定了節(jié)點分裂所需的最小損失函數(shù)下降值片挂。 這個參數(shù)的值越大幻林,算法越保守。這個參數(shù)的值和損失函數(shù)息息相關(guān)宴卖,所以是需要調(diào)整的滋将。范圍: [0,∞]
max_depth [缺省值=6] 這個值為樹的最大深度。 這個值也是用來避免過擬合的症昏。max_depth越大,模型會學(xué)到更具體更局部的樣本父丰。設(shè)置為0代表沒有限制 ,范圍: [0,∞]
min_child_weight [缺省值=1]決定最小葉子節(jié)點樣本權(quán)重和肝谭。XGBoost的這個參數(shù)是最小樣本權(quán)重的和.當(dāng)它的值較大時掘宪,可以避免模型學(xué)習(xí)到局部的特殊樣本。 但是如果這個值過高攘烛,會導(dǎo)致欠擬合魏滚。這個參數(shù)需要使用CV來調(diào)整。范圍: [0,∞]
subsample [缺省值=1]這個參數(shù)控制對于每棵樹坟漱,隨機采樣的比例鼠次。減小這個參數(shù)的值,算法會更加保守芋齿,避免過擬合腥寇。但是,如果這個值設(shè)置得過小觅捆,它可能會導(dǎo)致欠擬合赦役。典型值:0.5-1,0.5代表平均采樣栅炒,防止過擬合.范圍: (0,1]
colsample_bytree [缺省值=1] 用來控制每棵隨機采樣的列數(shù)的占比(每一列是一個特征)掂摔。典型值:0.5-1范圍: (0,1]
colsample_bylevel [缺省值=1] 用來控制樹的每一級的每一次分裂,對列數(shù)的采樣的占比赢赊。
我個人一般不太用這個參數(shù)乙漓,因為subsample參數(shù)和colsample_bytree參數(shù)可以起到相同的作用。但是如果感興趣释移,可以挖掘這個參數(shù)更多的用處叭披。范圍: (0,1]lambda [缺省值=1,別名: reg_lambda]權(quán)重的L2正則化項(和Ridge regression類似)秀鞭。
這個參數(shù)是用來控制XGBoost的正則化部分的趋观。雖然大部分數(shù)據(jù)科學(xué)家很少用到這個參數(shù),但是這個參數(shù)
在減少過擬合上還是可以挖掘出更多用處的锋边。.alpha [缺省值=0皱坛,別名: reg_alpha]權(quán)重的L1正則化項。(和Lasso regression類似)豆巨。 可以應(yīng)用在很高維度的情況下剩辟,使得算法的速度更快。
scale_pos_weight[缺省值=1] 在各類別樣本十分不平衡時往扔,把這個參數(shù)設(shè)定為一個正值贩猎,可以使算法更快收斂。通称继牛可以將其設(shè)置為負 樣本的數(shù)目與正樣本數(shù)目的比值吭服。
Parameters for Linear Booster
linear booster一般很少用到。
lambda [缺省值=0蝗罗,別稱: reg_lambda]
L2正則化懲罰系數(shù)艇棕,增加該值會使得模型更加保守蝌戒。alpha [缺省值=0,別稱: reg_alpha]
L1正則化懲罰系數(shù)沼琉,增加該值會使得模型更加保守北苟。lambda_bias [缺省值=0,別稱: reg_lambda_bias]
偏置上的L2正則化(沒有在L1上加偏置打瘪,因為并不重要)
學(xué)習(xí)目標(biāo)參數(shù)(task parameters)
objective [缺省值=reg:linear]
“reg:linear” – 線性回歸
“reg:logistic” – 邏輯回歸
“binary:logistic” – 二分類邏輯回歸友鼻,輸出為概率
“multi:softmax” – 使用softmax的多分類器,返回預(yù)測的類別(不是概率)闺骚。在這種情況下彩扔,你還需要多設(shè)一個參數(shù):num_class(類別數(shù)目)
“multi:softprob” – 和multi:softmax參數(shù)一樣,但是返回的是每個數(shù)據(jù)屬于各個類別的概率葛碧。eval_metric [缺省值=通過目標(biāo)函數(shù)選擇]
可供選擇的如下所示:
“rmse”: 均方根誤差
“mae”: 平均絕對值誤差
“l(fā)ogloss”: 負對數(shù)似然函數(shù)值
“error”: 二分類錯誤率借杰。
其值通過錯誤分類數(shù)目與全部分類數(shù)目比值得到。對于預(yù)測进泼,預(yù)測值大于0.5被認為是正類蔗衡,其它歸為負類。
“error@t”: 不同的劃分閾值可以通過 ‘t’進行設(shè)置
“merror”: 多分類錯誤率乳绕,計算公式為(wrong cases)/(all cases)
“mlogloss”: 多分類log損失
“auc”: 曲線下的面積seed [缺省值=0]
隨機數(shù)的種子 ,設(shè)置它可以復(fù)現(xiàn)隨機數(shù)據(jù)的結(jié)果绞惦,也可以用于調(diào)整參數(shù)