【零基礎(面試考點/競賽用)】boosting算法中的佼佼者 LightGBM = GOSS + histogram + EFB

之前一直在用LightGBM模型,但是它的原理並不是非常的瞭解,與之前講過的GBDT的區別也不甚清楚,所以今日一鼓作氣,好好整明白這個運行的原理。
先放一個GBDT的鏈接:
【零基礎學習(面試考點/競賽不用)】GBDT Gradient-Boosting-Decision-Tree 梯度下降樹


其實在上面的講解GBDT的博客中提到了:GBDT中尋找分隔點分割特徵是使用窮舉法。窮舉所有可能的情況然後比較哪一個最好。所以可以看的出來GBDT和XGBoost(這個也是類似的)這兩個Boosting算法是針對小規模小維度的數據集的。

窮舉法固然可以找到最優的分割點,但是對於現在動不動就幾千萬的數據集來說,難免過於消耗時間,所以LightGBM就是針對這種窮舉耗費時間的問題作出了改善:

  1. GOSS:基於梯度的單邊採樣;
  2. EFB:互斥特徵捆綁。
    下面主要講解一下GOSS和EFB。

1. GOSS

  • Gradient-based One-Side Sampling,基於梯度的單邊採樣。簡單的說,因爲數據太多了,所以從大量數據中採樣出一些與原來數據分佈、本質相同的數據,這樣大數據變成小數據,可以提高速度,因爲分佈相同,所以精度減少的不會多。

先講一下這個GOSS的流程吧,先上僞代碼:
在這裏插入圖片描述
可以看到,流程就是:

  1. 先根據模型計算出一個預測值preds;
  2. 計算這個preds和真實值的損失,可能是均方誤差或者是其他的,這個損失計算出來;
  3. 然後對這個損失進行排序,這裏需要注意的是,這個損失是一個數組,每一個樣本的預測值和真實值都會有一個損失,並不是像是神經網絡中的一個batch損失一樣把多個樣本的損失加和。假設有100個樣本,那麼就會有100個損失,對這個100個損失進行排序,排序後的數組叫做sorted;
  4. 選取sorted中前面topN個樣本,就是選取100個樣本中預測效果最差的topN個樣本,叫做大梯度數據(large gradient data)
  5. 然後隨機從剩下的預測比較準確的樣本(小梯度數據)中選取一些,選取比率就是上面圖片中提到的b。假設有100個樣本,a爲0.2,b爲0.3,那麼就會讓損失最大的20個樣本作爲大梯度數據,然後在剩下的80個樣本中隨機選取30個樣本作爲小梯度數據;
  6. 將小梯度的樣本乘上一個權重係數(1-a)/b,
  7. 然後用選出取來的大梯度數據和小梯度數據,還有這個權重,來訓練一個新的弱學習器。
  8. 最後把這個弱學習器加到models裏面;然後再來一遍整個流程。這裏可以看到,在第一步中 根據模型 得到預測值的這個模型,就是models,其實是當前已經訓練的所有弱分類器共同得到的一個預測值。

擴展知識就是,當a=0時候,那麼其實就只會採樣出小梯度樣本,其實就是從全部樣本中進行比率b的隨機採樣,所以a=0的時候,GOSS算法就會退化成隨機採樣算法;而a=1的時候,GOSS算法就會變成用全部數據進行訓練的算法。

總之,GOSS算法就是一個很簡單的過程,既然數據太多,耗費時間太多,那麼我就會少量數據來訓練,但是我選取數據非常有技巧,我選取的數據訓練出來的效果好。

2. 直方圖算法

  • Histogram optimization
    之前提到的GBDT找分割的特徵和閾值就是窮舉,這個肯定非常的耗費時間,所以LightGBM使用Histogram optimization來尋找次優解的分割特徵和閾值。

整個流程就是,要把數據的某一個特徵轉化成一個直方圖,然後再直方圖中的某一個bin作爲分隔點,計算loss。

其實也是要窮舉所有的特徵,但是並不會窮舉樣本中該特徵的所有可能的值作爲分割點,而是將樣本離散化成直方圖,然後用直方圖的bin作爲分割點。假如總共有100個樣本,在考慮特徵A的時候,可能分割成10個bin,這樣這個特徵A就只會有10個分割點的可能性。

下面看運算的流程:

  1. 首先是給每一個特徵都會做一個直方圖,每一個直方圖都是由多個bin組成的,第一個bin可能是0-5,第二個bin是5-10……
  2. 先遍歷一遍所有的樣本,然後把每一個樣本分到對應的bin中,計算每一個bin中包含的樣本數量,以及bin中所有樣本的梯度和(梯度可以看成預測效果,梯度越大預測越差,距離真實值越遠)
  3. 然後遍歷所有的bin作爲分割點,計算這個分割點的loss(也可以理解爲增益)。不難想象,一個分割bin會把整個直方圖分成兩部分,分割bin左邊的bins和右邊的bins。
    Δloss=(SL)2nL+(SR)2nR(SP)2nP\Delta loss = \frac{(S_L)^2}{n_L}+\frac{(S_R)^2}{n_R}-\frac{(S_P)^2}{n_P}
    • SLS_L是左邊的bins的梯度和,nLn_L是左邊的bins的樣本數量,SRS_R,nRn_R是右邊的
    • SPS_P是父節點梯度和nPn_P是父節點的樣本數量

這裏要理解一下,分割bin會把一個直方圖分成左右兩部分,然後每一個部分又會找某一個特徵的分割bin,形成一個樹狀的結構。

這裏呢?可以發現一個等式:SL+SR=SP,nL+nR=nSS_L+S_R = S_P,n_L+n_R=n_S所以,只用計算SLS_L就可以根據父輩節點的信息快速得到SRS_R,這樣計算的就更快了。

相比:傳統的方法,就是pre-sorted方法,優勢在哪裏呢?

  1. 傳統的方法排序的是連續值,而histogram是將連續值離散化,所以離散數據可以用更小的內存來存儲。比方說,連續數據可能是4.234252131,但是改成離散值可能就是4.2;
  2. 傳統方法,需要計算多少次增益呢?特徵值乘上樣本數量。現在histogram只需要計算特徵值乘上直方圖bin的數量,一般會設置爲一個常數。

可以看出來,histogram其實就是一個連續值離散化的方法。這也會讓分割的精度下降,但是決策樹本來就是一個弱分類器,所以次優解也夠用了。

3. EFB

  • Exclusive Feature Bundling 互斥特徵捆綁
    LightGBM通過GOSS算法可以進行數據採樣,他還可以進行特徵抽樣,讓數據的規模進一步的減小。

思想很簡單:就是在高緯度空間中數據,是使用稀疏編碼的,比如one-hot,這樣,在稀疏特徵空間中,很少同時出現非0值。這樣,就兩個特徵就可以安全的綁定在一起形成一個新的特徵。

在這裏插入圖片描述
這個流程圖就是在尋找哪兩個特徵可以捆綁。這裏我在學習的時候產生了一個疑問,目前還沒有解決,所以關於EFB就只能給出自己的看法和理解:

  1. 直觀理解就是因爲對特徵進行稀疏編碼,所以兩個特徵同時是1的概率就會比較小,然後這樣的特徵就可以進行合併。而綁定在一起的特徵就是同時爲1的樣本數量小於一個閾值就可以了。這樣就可以找到要綁定的特徵。
  2. 如何合併特徵:一般都會給出這樣的例子:
    在這裏插入圖片描述
    在這裏插入圖片描述
    所以我就有些困惑,如何選擇兩個連續特徵是否衝突?兩個特徵在稀疏特徵空間同時出現非零值算是一個衝突樣本,但是具體的過程還是不理解。是把兩個特徵onehot之後再怎麼比較還是怎麼的?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章