XGBOOST的基本原理以及使用
XGBOOST的基本原理以及使用
XGBOOST的基本原理
XGBOOST的模型形式
XGBOOST是boosting方法的一種加法模型,訓(xùn)練的時(shí)候采用前向分布算法進(jìn)行貪婪學(xué)習(xí),每次迭代都學(xué)習(xí)一顆CART樹(shù)來(lái)擬合之前t-1棵樹(shù)的預(yù)測(cè)結(jié)果與訓(xùn)練樣本真實(shí)值的殘差。
XGBOOST的模型形式比較類似于GBDT算法。其基本形式為對(duì)于給定數(shù)據(jù)集
學(xué)習(xí)包括N棵樹(shù)的加法模型,其中K是子分類器的數(shù)量,f是子分類器,F是子分類器從屬的函數(shù)空間
XGBOOST的損失函數(shù)
XGBOOST的目標(biāo)函數(shù)如下所示,其中還包含了正則項(xiàng)
對(duì)于f是決策樹(shù)而不是連續(xù)函數(shù),所以沒(méi)辦法用梯度下降的辦法進(jìn)行優(yōu)化,所以我們使用貪心算法來(lái)獲得最優(yōu)解。
將上述目標(biāo)函數(shù)按照泰勒級(jí)數(shù)展開(kāi)
假設(shè)子分類器f的正則項(xiàng)有葉子節(jié)點(diǎn)的數(shù)量,以及葉子節(jié)點(diǎn)的權(quán)重的平方和兩部分組成。
則XGBOOST最終的損失函數(shù)如下所示
上述公式對(duì)w求導(dǎo)后為0,得到
XGBOOST的學(xué)習(xí)策略
上一節(jié)最后紅色的部分就是學(xué)習(xí)優(yōu)化的關(guān)鍵,要讓紅色的部分月大越好。因此XGBoost中計(jì)算增益的方法入下圖所示:
在選擇分裂點(diǎn)的過(guò)程中,如果使用精確貪心算法,對(duì)每個(gè)特征排序完之后,枚舉完所有分裂點(diǎn)之后。假設(shè)樹(shù)的深度為H,特征數(shù)為d,則復(fù)雜度為O(Hdnlogn),其中排序?yàn)镺(nlogn)。
當(dāng)數(shù)據(jù)量十分龐大,無(wú)法全部存入內(nèi)存中時(shí),精確算法很慢。所以要采用近似算法,即根據(jù)特征的分布將特征分為l個(gè)桶。按照不同的桶進(jìn)行切分。在將特征分為不同的桶的過(guò)程中,XGBOOST并沒(méi)有采取簡(jiǎn)單的分為數(shù)方法,而是以二階梯度h作為權(quán)重進(jìn)行劃分。
對(duì)特征k構(gòu)造multi-set的數(shù)據(jù)集
XGBOOST的控制處理
XGBoost能對(duì)缺失值進(jìn)行自動(dòng)處理,原理就是將缺失值分別劃分到左子樹(shù)和右子樹(shù),分別計(jì)算增益。看哪個(gè)方向的增益比較大就把缺失值放到哪個(gè)方向。
XGBOOST的工程實(shí)現(xiàn)
在建樹(shù)的過(guò)程中,最耗時(shí)的是尋找最優(yōu)切分點(diǎn),而在這個(gè)過(guò)程中,最耗時(shí)的部分是將數(shù)據(jù)排序。為了減少排序時(shí)間,XGBOOST使用了Block結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)。
Block中的數(shù)據(jù)以稀疏格式CSC進(jìn)行存儲(chǔ)
Block中的特征進(jìn)行預(yù)排序,并通過(guò)索引獲得內(nèi)存中的梯度信息
使用Block結(jié)構(gòu)的缺點(diǎn)是取梯度的時(shí)候,是通過(guò)索引來(lái)獲取的,而這些梯度的獲取順序是按照特征的大小排序的。這將導(dǎo)致非連續(xù)的內(nèi)存訪問(wèn),可能使CPU Cache中緩存命中率低,從而影響算法的效率。對(duì)于精確算法中,使用緩存預(yù)取。具體來(lái)說(shuō),對(duì)于每個(gè)線程分配一個(gè)連續(xù)的buffer,讀取梯度信息并且存入Buffer中,然后再統(tǒng)計(jì)梯度信息。這種方式在大樣本的情況下非常的有用。
XGBOOST的優(yōu)缺點(diǎn)總結(jié)
優(yōu)點(diǎn):
- 精度更高:GBDT 只用到一階泰勒展開(kāi),而 XGBoost 對(duì)損失函數(shù)進(jìn)行了二階泰勒展開(kāi)。XGBoost 引入二階導(dǎo)一方面是為了增加精度,另一方面也是為了能夠自定義損失函數(shù),二階泰勒展開(kāi)可以近似大量損失函數(shù)
- 靈活性更強(qiáng):GBDT 以 CART 作為基分類器,XGBoost 不僅支持 CART 還支持線性分類器,(使用線性分類器的 XGBoost 相當(dāng)于帶 L1 和 L2 正則化項(xiàng)的邏輯斯蒂回歸(分類問(wèn)題)或者線性回歸(回歸問(wèn)題))。此外,XGBoost 工具支持自定義損失函數(shù),只需函數(shù)支持一階和二階求導(dǎo)
- 正則化:XGBoost 在目標(biāo)函數(shù)中加入了正則項(xiàng),用于控制模型的復(fù)雜度。正則項(xiàng)里包含了樹(shù)的葉子節(jié)點(diǎn)個(gè)數(shù)、葉子節(jié)點(diǎn)權(quán)重的 L2 范式。正則項(xiàng)降低了模型的方差,使學(xué)習(xí)出來(lái)的模型更加簡(jiǎn)單,有助于防止過(guò)擬合
- 缺失值處理:XGBoost 采用的稀疏感知算法極大的加快了節(jié)點(diǎn)分裂的速度
- 可以并行化操作:塊結(jié)構(gòu)可以很好的支持并行計(jì)算
缺點(diǎn):
- 雖然利用預(yù)排序和近似算法可以降低尋找最佳分裂點(diǎn)的計(jì)算量,但在節(jié)點(diǎn)分裂過(guò)程中仍需要遍歷數(shù)據(jù)集
- 預(yù)排序過(guò)程的空間復(fù)雜度過(guò)高,不僅需要存儲(chǔ)特征值,還需要存儲(chǔ)特征對(duì)應(yīng)樣本的梯度統(tǒng)計(jì)值的索引,相當(dāng)于消耗了兩倍的內(nèi)存
XGBOOST Python實(shí)用調(diào)參過(guò)程
XGBOOST的參數(shù)一般分為三類:
通用參數(shù):
booster:可全gbtree,和gblinear。gbtree采用樹(shù)的結(jié)構(gòu),gblinear采用線性的方式
nthread:使用的線程數(shù),一般選擇-1就是使用所有線程進(jìn)行計(jì)算
booster參數(shù):
n_estimators:迭代次數(shù)
learning_rate:shrink的速率,默認(rèn)是0.3
gamma:默認(rèn)是0。分裂后造成
subsample:每個(gè)booster采用率,默認(rèn)是1,一般選擇0.5-0.8
colsample_bytree:樹(shù)層面的列抽樣
colsample_bylevel:每一次分裂的列抽樣,默認(rèn)是1
max_depth:樹(shù)的最大深度
max_delta_step:限制了每棵樹(shù)權(quán)重該表的最大步長(zhǎng)。默認(rèn)是0就是沒(méi)有約束。通常不需要設(shè)置,但是在部分樣本不平衡的情況下,由于存在二階導(dǎo),所以可以防止權(quán)重異常的增加。
lambda:L2正則項(xiàng),默認(rèn)0
alpha:L1正則項(xiàng),默認(rèn)0
scale_pos_weight:默認(rèn)1,用來(lái)平衡樣本的數(shù)量
學(xué)習(xí)目標(biāo)參數(shù)
objective:默認(rèn)reg:linear
- reg:linear :線性回歸
- reg:logistic :邏輯回歸
- binary:logistic :二分類邏輯回歸
- binary:logitraw :二分類邏輯回歸,輸出為wTx
- count:poisson :計(jì)數(shù)問(wèn)題poisson回歸
- multi:softmax :設(shè)置XGBOOST使用softmax目標(biāo)函數(shù)做多分類,需要設(shè)置參數(shù)num_class
- multi:softprob :如同softmax,但輸出結(jié)果為ndata*nclass的向量,其中的值是每個(gè)數(shù)據(jù)分為每個(gè)類的概率
eval_metric: 默認(rèn)是使用objective相同的參數(shù) - rmse:均方根誤差
- mae:絕對(duì)值誤差
- logloss:最大似然取負(fù)
- error:二分類錯(cuò)誤率
- merror: 多分類錯(cuò)誤率
- mlogloss:多分類log損失
- auc: auc曲線下面的面積
- ndcg:Normalized Discounted Cumulative Gain
- map: 平均正確率
我們先查看一下調(diào)整scale_pos_weight對(duì)輸出產(chǎn)生的影響
class_weight=1,mean Y result=0.064
class_weight=2,mean Y result=0.100
class_weight=10,mean Y result=0.256
class_weight=20,mean Y result=0.354
我們可以看出,基本上scale_pos_weight越大,概率輸出也越大。如果對(duì)概率的正確性有要求,一般不用調(diào)scale_pos_weight
調(diào)整n_estimators,和learning_rate
我們發(fā)現(xiàn)n_estimators越大效果越好,然而learning_rate則不一定,選取0.1的時(shí)候是最優(yōu)的
我隨后嘗試調(diào)整一下樣本抽樣subsample和列抽樣colsample_bytree,看看是否對(duì)準(zhǔn)去率有一定的影響
可以看出,這兩個(gè)值越大,auc值越多,但是colsample_bytree超過(guò)0.8之后邊際效益就出來(lái)了,所以最終選擇subsample=0.5,colsample_bytree=0.8
調(diào)整max_depth和gamma,看看剪枝是否可以提升模型的效果
我們發(fā)現(xiàn)max_depth=10的時(shí)候效果最好,gamma沒(méi)有明顯影響
我們?cè)噲D加入L2正則項(xiàng)Lambda,看看正則化對(duì)模型效果是否有影響
最后發(fā)現(xiàn)正則化對(duì)模型最終區(qū)分能力AUC沒(méi)有太大的影響,但會(huì)減小模型的方差。這里選取lambda=0.1即可
總結(jié)
以上是生活随笔為你收集整理的XGBOOST的基本原理以及使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 1111
- 下一篇: 喜报|云南永兴元科技顺利通过CMMI三级