博客園:梯度提升樹(GBDT)原理小結(jié)
博客園:一步一步理解GB谆趾、GBDT、xgboost
知乎:機器學(xué)習(xí)算法中GBDT和XGBOOST的區(qū)別有哪些凡壤?
介紹下rf第美,adaboost,gbdt挑庶,xgboost的算法原理言秸?(注意adaboost,gbdt迎捺,xgboost的區(qū)別)
RF的算法原理:
隨機森林是有很多隨機得決策樹構(gòu)成举畸,它們之間沒有關(guān)聯(lián)。得到RF以后凳枝,在預(yù)測時分別對每一個決策樹進行判斷抄沮,最后使用Bagging的思想進行結(jié)果的輸出;
**主要步驟: **
現(xiàn)在有N個訓(xùn)練樣本岖瑰,每個樣本的特征為M個叛买,需要建K顆樹
1)從N個訓(xùn)練樣本中有放回的取N個樣本作為一組訓(xùn)練集(其余未取到的樣本作為預(yù)測分類,評估其誤差)
2)從M個特征中取m個特征左右子集特征
3)重復(fù)上述過程K次
4)行程隨機森林蹋订,通過投票表決確定分類率挣;Adaboost算法原理:
該算法是模型為加法模型,損失函數(shù)為指數(shù)函數(shù)露戒,學(xué)習(xí)算法為前向分步算法時的學(xué)習(xí)方法椒功。Adaboost的訓(xùn)練誤差是以指數(shù)速率下降的捶箱,它具有自適應(yīng)性,它能自適應(yīng)弱分類器的訓(xùn)練誤差率蛾茉。另外, Adaboost算法是穩(wěn)健的讼呢,具有robost,調(diào)參數(shù)沒有這么麻煩谦炬。一般適用于分類問題悦屏,也可用于回歸。傳統(tǒng)的adaboost算法只能適用于二分類的情況键思。也可以將adaboost算法調(diào)整到適合處理多分類任務(wù)的方法础爬。
目標函數(shù)只能是:指數(shù)函數(shù)。
主要步驟:
1) 初始化樣本的權(quán)值為1/n吼鳞。
2) 基于樣本與權(quán)值訓(xùn)練弱分類器看蚜;這里的弱分類器就是個二分類器。
3) 根據(jù)分類器對樣本進行判別赔桌,如果判別正確供炎,此樣本的權(quán)值降低,判別錯誤疾党,降低樣本的權(quán)值音诫,同時根據(jù)識別率計算出此分類器的權(quán)值;
4) 利用改變權(quán)值的樣本訓(xùn)練下一個分類器雪位;
5) 循環(huán)得到N個分類器與其對應(yīng)的權(quán)值竭钝;
6) 基于加權(quán)的分類器組合成為最終的模型。gbdt的算法原理:
gbdt是一種提升樹算法雹洗,它每次迭代產(chǎn)生一個弱分類器模型香罐,并且累加到總模型中。但是gbdt每一次迭代中弱分類器的生成都是依據(jù)損失函數(shù)的梯度方向时肿,也就是用梯度下降的方法來擬合殘差庇茫。
目標函數(shù):分類(對數(shù)似然損失,指數(shù)損失(sklearn中螃成,如果函數(shù)是指數(shù)港令,則等價于adaboost))
回歸(‘LS’均方差, ‘lad’ 絕對誤差, Hube損失(魯棒性回歸損失锈颗,lad和LS的結(jié)合))
gbdt與adaboost的區(qū)別(除了目標函數(shù)外顷霹,其他一樣),gbdt將adaboost模型中的所分類器改為回歸決策樹(如果處理分類問題击吱,是通過設(shè)定閾值的方法)淋淀,目標函數(shù)不同,優(yōu)化過程不同覆醇。
主要步驟:
1) 將基本學(xué)習(xí)器初始化為一個常數(shù)朵纷;
2) 開始迭代:a.根據(jù)給定的誤差函數(shù)炭臭,來計算當前模型的梯度,近似殘差(對于最小均方誤差來說袍辞,梯度就是當前模型的結(jié)果和label的殘差)鞋仍;b.根據(jù)梯度(也叫作偽殘差)擬合下一個基學(xué)習(xí)器。c.根據(jù)一維線性搜索來計算步長搅吁;d.根據(jù)步長和學(xué)習(xí)率對當前模型進行更新威创;xgboost的算法原理:
xgboost可以說是一種基于梯度提升的加強版本;GBDT通過梯度來擬合殘差谎懦,只用到了一階導(dǎo)數(shù)信息肚豺。而xgboost對目標函數(shù)進行二階泰勒展開,同時用到了一階導(dǎo)數(shù)和二階導(dǎo)數(shù)信息來擬合殘差界拦,得到新的目標函數(shù)吸申。同時定義的每棵樹的復(fù)雜度結(jié)構(gòu)部分q和葉子權(quán)重部分w,作為正則項加入到新的目標函數(shù)中享甸。然后通過貪心算法獲取最優(yōu)切分點截碴,進行劃分直到滿足某個閾值或得到純節(jié)點。
除此之外蛉威,xgboost還有其他優(yōu)點:支持線性分類器隐岛,列抽樣,缺失值的處理瓷翻,并行計算等;補充LightGBM的特點:
微軟出了個LightGBM,號稱性能更強勁割坠,速度更快齐帚。
性能提升的原因主要是兩個:①histogram算法替換了傳統(tǒng)的Pre-Sorted,某種意義上是犧牲了精度(但是作者聲明實驗發(fā)現(xiàn)精度影響不大)換取速度彼哼,直方圖作差構(gòu)建葉子直方圖挺有創(chuàng)造力的对妄。(xgboost的分布式實現(xiàn)也是基于直方圖的,利于并行)②帶有深度限制的按葉子生長 (leaf-wise) 算法代替了傳統(tǒng)的(level-wise) 決策樹生長策略敢朱,提升精度剪菱,同時避免過擬合危險。
GBDT算法和隨機森林的區(qū)別拴签?
- 組成隨機森林的樹可以是分類樹孝常,也可以是回歸樹;而GBDT只由回歸樹組成
- 組成隨機森林的樹可以并行生成蚓哩;而GBDT只能是串行生成
- 對于最終的輸出結(jié)果而言构灸,隨機森林采用多數(shù)投票等;而GBDT則是將所有結(jié)果加權(quán)累加起來
- 隨機森林對訓(xùn)練集一視同仁岸梨,GBDT是基于權(quán)值的弱分類器的集成
- 隨機森林對異常值不敏感喜颁,GBDT對異常值非常敏感
- 隨機森林是通過減少模型方差提高性能稠氮,GBDT是通過減少模型偏差提高性能
GBDT和XGBOOST的區(qū)別?
- 傳統(tǒng)GBDT以CART作為基分類器半开,xgboost還支持線性分類器隔披,這個時候xgboost相當于帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。
- 傳統(tǒng)GBDT在優(yōu)化時只用到一階導(dǎo)數(shù)信息寂拆,xgboost則對代價函數(shù)進行了二階泰勒展開奢米,同時用到了一階和二階導(dǎo)數(shù)。順便提一下漓库,xgboost工具支持自定義代價函數(shù)恃慧,只要函數(shù)可一階和二階求導(dǎo)。
- xgboost在代價函數(shù)里加入了正則項渺蒿,用于控制模型的復(fù)雜度痢士。正則項里包含了樹的葉子節(jié)點個數(shù)、每個葉子節(jié)點上輸出的score的L2模的平方和茂装。從Bias-variance tradeoff角度來講怠蹂,正則項降低了模型的variance,使學(xué)習(xí)出來的模型更加簡單少态,防止過擬合城侧,這也是xgboost優(yōu)于傳統(tǒng)GBDT的一個特性。
- Shrinkage(縮減)彼妻,相當于學(xué)習(xí)速率(xgboost中的eta)嫌佑。xgboost在進行完一次迭代后,會將葉子節(jié)點的權(quán)重乘上該系數(shù)侨歉,主要是為了削弱每棵樹的影響屋摇,讓后面有更大的學(xué)習(xí)空間。實際應(yīng)用中幽邓,一般把eta設(shè)置得小一點炮温,然后迭代次數(shù)設(shè)置得大一點。(補充:傳統(tǒng)GBDT的實現(xiàn)也有學(xué)習(xí)速率)
- 列抽樣(column subsampling)牵舵。xgboost借鑒了隨機森林的做法柒啤,支持列抽樣,不僅能降低過擬合畸颅,還能減少計算担巩,這也是xgboost異于傳統(tǒng)gbdt的一個特性。
- 對缺失值的處理没炒。對于特征的值有缺失的樣本兵睛,xgboost可以自動學(xué)習(xí)出它的分裂方向。
- xgboost工具支持并行。xgboost的并行是在特征粒度上的祖很。xgboost在訓(xùn)練之前笛丙,預(yù)先對數(shù)據(jù)進行了排序,然后保存為block結(jié)構(gòu)假颇,后面的迭代中重復(fù)地使用這個結(jié)構(gòu)胚鸯,大大減小計算量。這個block結(jié)構(gòu)也使得并行成為了可能笨鸡,在進行節(jié)點的分裂時姜钳,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂形耗,那么各個特征的增益計算就可以開多線程進行哥桥。
- 可并行的近似直方圖算法。樹節(jié)點在進行分裂時激涤,我們需要計算每個特征的每個分割點對應(yīng)的增益拟糕,即用貪心法枚舉所有可能的分割點。當數(shù)據(jù)無法一次載入內(nèi)存或者在分布式情況下倦踢,貪心算法效率就會變得很低送滞,所以xgboost還提出了一種可并行的近似直方圖算法,用于高效地生成候選的分割點辱挥。
參數(shù)調(diào)節(jié)
GBDT調(diào)節(jié)參數(shù)犁嗅?
我們把重要參數(shù)分為兩類,第一類是Boosting框架的重要參數(shù)晤碘,第二類是弱學(xué)習(xí)器即CART回歸樹的重要參數(shù)褂微。一般先調(diào)框架參數(shù),再調(diào)弱學(xué)習(xí)器的參數(shù)园爷;
boosting框架相關(guān)的重要參數(shù)
- n_estimators: 也就是弱學(xué)習(xí)器的最大迭代次數(shù)宠蚂,或者說最大的弱學(xué)習(xí)器的個數(shù)。一般來說n_estimators太小腮介,容易欠擬合,n_estimators太大端衰,又容易過擬合叠洗,一般選擇一個適中的數(shù)值。默認是100旅东。在實際調(diào)參的過程中灭抑,我們常常將n_estimators和下面介紹的參數(shù)learning_rate一起考慮。
- learning_rate: 即每個弱學(xué)習(xí)器的權(quán)重縮減系數(shù)抵代,也稱作步長腾节,所以這兩個參數(shù)n_estimators和learning_rate要一起調(diào)參。一般來說,可以從一個小一點的步長開始調(diào)參案腺,默認是1庆冕。
- subsample: 樣本子采樣比例,取值為(0,1]劈榨。
- init: 即我們的初始化的時候的弱學(xué)習(xí)器访递,常數(shù);一般用在我們對數(shù)據(jù)有先驗知識同辣,或者之前做過一些擬合的時候拷姿,如果沒有的話就不用管這個參數(shù)了。
- loss: 即我們GBDT算法中的損失函數(shù)旱函。分類模型和回歸模型的損失函數(shù)是不一樣的响巢。
對于分類模型,有對數(shù)似然損失函數(shù)"deviance"和指數(shù)損失函數(shù)"exponential"兩者輸入選擇棒妨。默認是對數(shù)似然損失函數(shù)"deviance"踪古。
對于回歸模型,有均方差"ls", 絕對損失"lad", Huber損失"huber"和分位數(shù)損失“quantile”靶衍。如果數(shù)據(jù)的噪音點不多灾炭,用默認的均方差"ls"比較好。如果是噪音點較多颅眶,則推薦用抗噪音的損失函數(shù)"huber"蜈出。而如果我們需要對訓(xùn)練集進行分段預(yù)測的時候,則采用“quantile”涛酗。 - alpha:這個參數(shù)只有GradientBoostingRegressor有铡原,當我們使用Huber損失"huber"和分位數(shù)損失“quantile”時坡氯,需要指定分位數(shù)的值兢交。默認是0.9爆班,如果噪音點較多擂仍,可以適當降低這個分位數(shù)的值底哗。
GBDT類庫弱學(xué)習(xí)器參數(shù)
- max_features 劃分時考慮的最大特征數(shù): 默認是"None",意味著劃分時考慮所有的特征數(shù)臭蚁;如果是"log2"意味著劃分時最多考慮$log_2N$個特征簿废;如果是"sqrt"或者"auto"意味著劃分時最多考慮$\sqrt{N}$個特征心肪。如果是整數(shù)弥咪,代表考慮的特征絕對數(shù)过蹂。如果是浮點數(shù),代表考慮特征百分比聚至,即考慮(百分比xN)取整后的特征數(shù)酷勺。
- max_depth 決策樹最大深度。默認可以不輸入扳躬,如果不輸入的話脆诉,決策樹在建立子樹的時候不會限制子樹的深度甚亭。如果模型樣本量多,特征也多的情況下击胜,推薦限制這個最大深度亏狰,具體的取值取決于數(shù)據(jù)的分布。常用的可以取值10-100之間潜的。
- min_samples_split 內(nèi)部節(jié)點再劃分所需最小樣本數(shù)骚揍,默認是2.如果樣本量不大,不需要管這個值啰挪。如果樣本量數(shù)量級非常大信不,則推薦增大這個值。
- min_samples_leaf 葉子節(jié)點最少樣本數(shù)亡呵。這個值限制了葉子節(jié)點最少的樣本數(shù)抽活,如果某葉子節(jié)點數(shù)目小于樣本數(shù),則會和兄弟節(jié)點一起被剪枝锰什。如果樣本量數(shù)量級非常大下硕,則推薦增大這個值。
- min_weight_fraction_leaf 葉子節(jié)點最小的樣本權(quán)重和汁胆。這個值限制了葉子節(jié)點所有樣本權(quán)重和的最小值梭姓,如果小于這個值,則會和兄弟節(jié)點一起被剪枝嫩码。
- max_leaf_nodes最大葉子節(jié)點數(shù): 通過限制最大葉子節(jié)點數(shù)誉尖,可以防止過擬合;
- min_impurity_split 節(jié)點劃分最小不純度。這個值限制了決策樹的增長铸题,如果某節(jié)點的不純度(基于基尼系數(shù)铡恕,均方差)小于這個閾值,則該節(jié)點不再生成子節(jié)點丢间。即為葉子節(jié)點 探熔。
XGBOOST調(diào)節(jié)參數(shù)?
通用參數(shù)
- booster [default=gbtree] 有兩中模型可以選擇gbtree和gblinear烘挫。gbtree使用基于樹的模型進行提升計算诀艰,-
- gblinear使用線性模型進行提升計算。缺省值為gbtree饮六;
- silent [default=0] 取0時表示打印出運行時信息其垄,取1時表示以緘默方式運行,不打印運行時信息喜滨。缺省值為0
- nthread XGBoost運行時的線程數(shù)捉捅。缺省值是當前系統(tǒng)可以獲得的最大線程數(shù)
學(xué)習(xí)目標參數(shù)
- Objective “reg:linear” –線性回歸撤防∷浞纾“reg:logistic” –邏輯回歸棒口。“binary:logistic” –二分類的邏輯回歸問題辜膝,輸出為概率无牵。“binary:logitraw” –二分類的邏輯回歸問題厂抖,輸出的結(jié)果為wTx茎毁。“count:poisson” –計數(shù)問題的poisson回歸忱辅,輸出結(jié)果為poisson分布七蜘。
- “multi:softmax” –讓XGBoost采用softmax目標函數(shù)處理多分類問題,同時需要設(shè)置參數(shù)num_class(類別個數(shù))“multi:softprob” –和softmax一樣墙懂,但是輸出的是ndata * nclass的向量橡卤,可以將該向量reshape成ndata行nclass列的矩陣。沒行數(shù)據(jù)表示樣本所屬于每個類別的概率损搬”炭猓“rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss
- eval_metric:rmse 均方根誤差,mae 平均絕對誤差巧勤,logloss 負對數(shù)似然函數(shù)值error 二分類錯誤率(閾值為0.5)嵌灰,merror 多分類錯誤率,mlogloss 多分類颅悉,logloss損失函數(shù)沽瞭,auc 曲線下面積;
seed:隨機數(shù)的種子
Parameter for Tree Booster
- eta [default=0.3] 為了防止過擬合签舞,更新過程中用到的收縮步長秕脓。在每次提升計算之后,算法會直接獲得新特征的權(quán)重儒搭。 eta通過縮減特征的權(quán)重使提升計算過程更加保守吠架。
- gamma [default=0] 節(jié)點分裂所需的最小損失函數(shù)下降值,這個參數(shù)越大搂鲫,算法越保密傍药。
- max_depth [default=6] 數(shù)的最大深度。缺省值為6取值范圍為:[1,∞]
- subsample [default=1] GBM中的subsample參數(shù)一樣魂仍。這個參數(shù)控制對于每棵樹拐辽,隨機采樣的比例
- colsample_bytree [default=1] 和GBM里面的max_features參數(shù)類似。用來控制每棵隨機采樣的列數(shù)的占比(每一列是一個特征)擦酌。
- min_child_weight [default=1] 孩子節(jié)點中最小的樣本權(quán)重和俱诸。如果一個葉子節(jié)點的樣本權(quán)重和小于-
- min_child_weight則拆分過程結(jié)束。
- max_delta_step [default=0] 這參數(shù)限制每棵樹權(quán)重改變的最大步長
Parameter for Linear Booster
- lambda [default=0] L2正則的懲罰系數(shù)赊舶;
- alpha [default=0] L1正則的懲罰系數(shù)睁搭;
- lambda_bias 在偏置上的L2正則赶诊。缺省值為0(在L1上沒有偏置項的正則,因為L1時偏置不重要)