xgboost gbdt特征点分烈点
lightGBM與XGBoost的區(qū)別:(來源于:http://baijiahao.baidu.com/s?id=1588002707760744935&wfr=spider&for=pc)
切分算法(切分點(diǎn)的選取)
占用的內(nèi)存更低,只保存特征離散化后的值,而這個值一般用8位整型存儲就足夠了,內(nèi)存消耗可以降低為原來的1/8。
降低了計算的代價:預(yù)排序算法每遍歷一個特征值就需要計算一次分裂的增益,而直方圖算法只需要計算k次(k可以認(rèn)為是常數(shù)),時間復(fù)雜度從O(#data#feature)優(yōu)化到O(k#features)。(相當(dāng)于LightGBM犧牲了一部分切分的精確性來提高切分的效率,實際應(yīng)用中效果還不錯)
空間消耗大,需要保存數(shù)據(jù)的特征值以及特征排序的結(jié)果(比如排序后的索引,為了后續(xù)快速計算分割點(diǎn)),需要消耗兩倍于訓(xùn)練數(shù)據(jù)的內(nèi)存
時間上也有較大開銷,遍歷每個分割點(diǎn)時都需要進(jìn)行分裂增益的計算,消耗代價大
對cache優(yōu)化不友好,在預(yù)排序后,特征對梯度的訪問是一種隨機(jī)訪問,并且不同的特征訪問的順序不一樣,無法對cache進(jìn)行優(yōu)化。同時,在每一層長樹的時候,需要隨機(jī)訪問一個行索引到葉子索引的數(shù)組,并且不同特征訪問的順序也不一樣,也會造成較大的cache miss。
XGBoost使用的是pre-sorted算法(對所有特征都按照特征的數(shù)值進(jìn)行預(yù)排序,基本思想是對所有特征都按照特征的數(shù)值進(jìn)行預(yù)排序;然后在遍歷分割點(diǎn)的時候用O(#data)的代價找到一個特征上的最好分割點(diǎn)最后,找到一個特征的分割點(diǎn)后,將數(shù)據(jù)分裂成左右子節(jié)點(diǎn)。優(yōu)點(diǎn)是能夠更精確的找到數(shù)據(jù)分隔點(diǎn);但這種做法有以下缺點(diǎn)
LightGBM使用的是histogram算法,基本思想是先把連續(xù)的浮點(diǎn)特征值離散化成k個整數(shù),同時構(gòu)造一個寬度為k的直方圖。在遍歷數(shù)據(jù)的時候,根據(jù)離散化后的值作為索引在直方圖中累積統(tǒng)計量,當(dāng)遍歷一次數(shù)據(jù)后,直方圖累積了需要的統(tǒng)計量,然后根據(jù)直方圖的離散值,遍歷尋找最優(yōu)的分割點(diǎn);優(yōu)點(diǎn)在于
決策樹生長策略上:
XGBoost采用的是帶深度限制的level-wise生長策略,Level-wise過一次數(shù)據(jù)可以能夠同時分裂同一層的葉子,容易進(jìn)行多線程優(yōu)化,不容易過擬合;但不加區(qū)分的對待同一層的葉子,帶來了很多沒必要的開銷(因為實際上很多葉子的分裂增益較低,沒必要進(jìn)行搜索和分裂)
LightGBM采用leaf-wise生長策略,每次從當(dāng)前所有葉子中找到分裂增益最大(一般也是數(shù)據(jù)量最大)的一個葉子,然后分裂,如此循環(huán);但會生長出比較深的決策樹,產(chǎn)生過擬合(因此 LightGBM 在leaf-wise之上增加了一個最大深度的限制,在保證高效率的同時防止過擬合)。
histogram 做差加速。一個容易觀察到的現(xiàn)象:一個葉子的直方圖可以由它的父親節(jié)點(diǎn)的直方圖與它兄弟的直方圖做差得到。通常構(gòu)造直方圖,需要遍歷該葉子上的所有數(shù)據(jù),但直方圖做差僅需遍歷直方圖的k個桶。利用這個方法,LightGBM可以在構(gòu)造一個葉子的直方圖后,可以用非常微小的代價得到它兄弟葉子的直方圖,在速度上可以提升一倍。
直接支持類別特征:LightGBM優(yōu)化了對類別特征的支持,可以直接輸入類別特征,不需要額外的0/1展開。并在決策樹算法上增加了類別特征的決策規(guī)則。
分布式訓(xùn)練方法上(并行優(yōu)化)
在特征并行算法中,通過在本地保存全部數(shù)據(jù)避免對數(shù)據(jù)切分結(jié)果的通信;
在數(shù)據(jù)并行中使用分散規(guī)約(Reduce scatter)把直方圖合并的任務(wù)分?jǐn)偟讲煌臋C(jī)器,降低通信和計算,并利用直方圖做差,進(jìn)一步減少了一半的通信量。基于投票的數(shù)據(jù)并行(Parallel Voting)則進(jìn)一步優(yōu)化數(shù)據(jù)并行中的通信代價,使通信代價變成常數(shù)級別。
特征并行的主要思想是在不同機(jī)器在不同的特征集合上分別尋找最優(yōu)的分割點(diǎn),然后在機(jī)器間同步最優(yōu)的分割點(diǎn)。
數(shù)據(jù)并行則是讓不同的機(jī)器先在本地構(gòu)造直方圖,然后進(jìn)行全局的合并,最后在合并的直方圖上面尋找最優(yōu)分割點(diǎn)。
原始
LightGBM針對這兩種并行方法都做了優(yōu)化,
Cache命中率優(yōu)化
基于直方圖的稀疏特征優(yōu)化
DART(Dropout + GBDT)
GOSS(Gradient-based One-Side Sampling):一種新的Bagging(row subsample)方法,前若干輪(1.0f / gbdtconfig->learning_rate)不Bagging;之后Bagging時, 采樣一定比例g(梯度)大的樣本
LightGBM優(yōu)點(diǎn)小結(jié)(相較于XGBoost)
速度更快
內(nèi)存消耗更低
?
?
分裂點(diǎn)尋找算法
- Basic Exact Greedy Algorithm
在每一次尋找中,枚舉所有可能的分裂點(diǎn),然后利用score確定最佳分裂點(diǎn)。
代表的實現(xiàn)軟件有:sklearn, R的GBM, 單機(jī)版的XGBoost。
算法首先對特征進(jìn)行排序,然后依次訪問數(shù)據(jù),并以此數(shù)據(jù)該維特征的值作為分裂點(diǎn),計算score。
-
- 近似方法
精確尋找不適用與分布式數(shù)據(jù),近似方法通過特征的分布,按照百分比確定一組候選分裂點(diǎn),通過遍歷所有的候選分裂點(diǎn)來找到最佳分裂點(diǎn)。
兩種策略:全局策略和局部策略。在全局策略中,對每一個特征確定一個全局的候選分裂點(diǎn)集合,就不再改變;而在局部策略中,每一次分裂
都要重選一次分裂點(diǎn)。前者需要較大的分裂集合,后者可以小一點(diǎn)。論文中對比了補(bǔ)充候選集策略與分裂點(diǎn)數(shù)目對模型的影響。
全局策略需要更細(xì)的分裂點(diǎn)才能和局部策略差不多
- 近似方法
總結(jié)
以上是生活随笔為你收集整理的xgboost gbdt特征点分烈点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文让你彻底理解 Java HashMa
- 下一篇: GBDT和RF的区别