xgboost gbdt特征點分烈點


lightGBM與XGBoost的區別:(來源於:http://baijiahao.baidu.com/s?id=1588002707760744935&wfr=spider&for=pc)

切分算法(切分點的選取)

占用的內存更低,只保存特征離散化后的值,而這個值一般用8位整型存儲就足夠了,內存消耗可以降低為原來的1/8。

降低了計算的代價:預排序算法每遍歷一個特征值就需要計算一次分裂的增益,而直方圖算法只需要計算k次(k可以認為是常數),時間復雜度從O(#data#feature)優化到O(k#features)。(相當於LightGBM犧牲了一部分切分的精確性來提高切分的效率,實際應用中效果還不錯)

空間消耗大,需要保存數據的特征值以及特征排序的結果(比如排序后的索引,為了后續快速計算分割點),需要消耗兩倍於訓練數據的內存

時間上也有較大開銷,遍歷每個分割點時都需要進行分裂增益的計算,消耗代價大

對cache優化不友好,在預排序后,特征對梯度的訪問是一種隨機訪問,並且不同的特征訪問的順序不一樣,無法對cache進行優化。同時,在每一層長樹的時候,需要隨機訪問一個行索引到葉子索引的數組,並且不同特征訪問的順序也不一樣,也會造成較大的cache miss。

XGBoost使用的是pre-sorted算法(對所有特征都按照特征的數值進行預排序,基本思想是對所有特征都按照特征的數值進行預排序;然后在遍歷分割點的時候用O(#data)的代價找到一個特征上的最好分割點最后,找到一個特征的分割點后,將數據分裂成左右子節點。優點是能夠更精確的找到數據分隔點;但這種做法有以下缺點

LightGBM使用的是histogram算法,基本思想是先把連續的浮點特征值離散化成k個整數,同時構造一個寬度為k的直方圖。在遍歷數據的時候,根據離散化后的值作為索引在直方圖中累積統計量,當遍歷一次數據后,直方圖累積了需要的統計量,然后根據直方圖的離散值,遍歷尋找最優的分割點;優點在於

決策樹生長策略上:

XGBoost采用的是帶深度限制的level-wise生長策略,Level-wise過一次數據可以能夠同時分裂同一層的葉子,容易進行多線程優化,不容易過擬合;但不加區分的對待同一層的葉子,帶來了很多沒必要的開銷(因為實際上很多葉子的分裂增益較低,沒必要進行搜索和分裂)

LightGBM采用leaf-wise生長策略,每次從當前所有葉子中找到分裂增益最大(一般也是數據量最大)的一個葉子,然后分裂,如此循環;但會生長出比較深的決策樹,產生過擬合(因此 LightGBM 在leaf-wise之上增加了一個最大深度的限制,在保證高效率的同時防止過擬合)。

histogram 做差加速。一個容易觀察到的現象:一個葉子的直方圖可以由它的父親節點的直方圖與它兄弟的直方圖做差得到。通常構造直方圖,需要遍歷該葉子上的所有數據,但直方圖做差僅需遍歷直方圖的k個桶。利用這個方法,LightGBM可以在構造一個葉子的直方圖后,可以用非常微小的代價得到它兄弟葉子的直方圖,在速度上可以提升一倍。

直接支持類別特征:LightGBM優化了對類別特征的支持,可以直接輸入類別特征,不需要額外的0/1展開。並在決策樹算法上增加了類別特征的決策規則。

分布式訓練方法上(並行優化)

在特征並行算法中,通過在本地保存全部數據避免對數據切分結果的通信;

在數據並行中使用分散規約(Reduce scatter)把直方圖合並的任務分攤到不同的機器,降低通信和計算,並利用直方圖做差,進一步減少了一半的通信量。基於投票的數據並行(Parallel Voting)則進一步優化數據並行中的通信代價,使通信代價變成常數級別。

特征並行的主要思想是在不同機器在不同的特征集合上分別尋找最優的分割點,然后在機器間同步最優的分割點。

數據並行則是讓不同的機器先在本地構造直方圖,然后進行全局的合並,最后在合並的直方圖上面尋找最優分割點。

原始

LightGBM針對這兩種並行方法都做了優化,

Cache命中率優化

基於直方圖的稀疏特征優化

DART(Dropout + GBDT)

GOSS(Gradient-based One-Side Sampling):一種新的Bagging(row subsample)方法,前若干輪(1.0f / gbdtconfig->learning_rate)不Bagging;之后Bagging時, 采樣一定比例g(梯度)大的樣本

LightGBM優點小結(相較於XGBoost)

速度更快

內存消耗更低

 

 

分裂點尋找算法

  • Basic Exact Greedy Algorithm

在每一次尋找中,枚舉所有可能的分裂點,然后利用score確定最佳分裂點。
代表的實現軟件有:sklearn, R的GBM, 單機版的XGBoost。
算法首先對特征進行排序,然后依次訪問數據,並以此數據該維特征的值作為分裂點,計算score。

    • 近似方法
      精確尋找不適用與分布式數據,近似方法通過特征的分布,按照百分比確定一組候選分裂點,通過遍歷所有的候選分裂點來找到最佳分裂點。
      兩種策略:全局策略和局部策略。在全局策略中,對每一個特征確定一個全局的候選分裂點集合,就不再改變;而在局部策略中,每一次分裂
      都要重選一次分裂點。前者需要較大的分裂集合,后者可以小一點。論文中對比了補充候選集策略與分裂點數目對模型的影響。
      全局策略需要更細的分裂點才能和局部策略差不多
    •  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM