GBDT理解二三事

2021-08-04 22:58:35 字數 2315 閱讀 1906

**:

一、要理解gbdt當然要從gb(gradient boosting)和dt(decision tree)兩個角度來理解了;

二、gb其實是一種理念,他並不是這乙個具體的演算法,意思是說沿著梯度方向,構造一系列的弱分類器函式,並以一定權重組合起來,形成最終決策的強分類器;注意,這裡的梯度下降法是在函式空間中通過梯度下降法尋找使得loss最小的乙個函式,即l(y,f)對f求層,區別於傳統的梯度下降法選擇乙個方向(對x求導);那麼問題就來了,對函式求導?這也太難了吧。所以就有了乙個近似的方法,根據經驗風險最小化原則,我們認為在訓練集上使得loss最小的函式,往往在測試集上表現會好,即在訓練集上尋優;因此,把求導的函式理解成在訓練集上該函式對應的離散的函式值,對函式求導就變成了對樣本的函式值向量求導;因此就可以得到乙個梯度向量,表示尋找到的最優函式, 這個函式就是乙個新的弱分類器;

三、通過回歸樹來擬合這個梯度向量,就得到了dt,而每棵樹就對應上面的函式,其**值就是函式值;

四、當我們選擇平方差損失函式時,函式向量就表示成前一棵回歸樹在樣本空間上的**值,則對函式向量求梯度就等於目標值減去**值,即我們所說的殘差向量;因此,下一棵回歸樹就是在擬合這個殘差向量;

五、回歸樹擬合可以通過平均最小均方差來尋找**點,生成乙個樹;當然這棵樹不可能完全擬合得好,因此,又會通過對損失函式求梯度,得到新的殘差向量;

六、對初始分類器(函式)的選擇就可以直接用0,通過平方差loss函式求得的殘差當然就是樣本本身了;也可以選擇樣本的均值;

七、一棵樹的**過程只需要找到找到每個結點的**的特徵id與特徵值,而尋找的方法可以是平均最小均方差,也可以是使得(左子樹樣本目標值和的平方均值+右子樹樣本目標值和的平方均值-父結點所有樣本目標值和的平方均值)最大的那個**點與**特徵值等等方法;從而將樣本分到左右子樹中,繼續上面過程;

八、用殘差更新每個樣本的目標值:葉子節點的均值作為落到該葉子節點的樣本的**值,使用目標值減去**值,得到該樣本的殘差,作為下一棵樹的訓練目標;

九、對於使用logistic作為損失函式的多分類問題,下面單獨進行推導說明:

1、多分類問題與回歸問題不同,每棵樹的樣本的目標就不是乙個數值了,而是每個樣本在每個分類下面都有乙個估值fk(x);

2、同邏輯回歸一樣,假如有k類,每乙個樣本的估計值為f1(x)...fk(x),對其作logistic變化之後得到屬於每一類的概率是p1(x)...pk(x),則損失函式可以定義為負的log似然:

可以看出對多分類問題,新的一棵樹擬合的目標仍是殘差向量;

3、訓練過程如下:

對第一棵樹,可以初始化每個樣本在每個分類上的估計值fk(x)都為0;計算logistic變換pk(x),計算殘差向量,作為當前樹的回歸的目標,回歸樹的**過程仍可採用【左子樹樣本目標值(殘差)和的平方均值+右子樹樣本目標值(殘差)和的平方均值-父結點所有樣本目標值(殘差)和的平方均值】最大的那個**點與**特徵值等方法;當回歸樹的葉子節點數目達到要求示,則該樹建立完成;對每個葉子節點,利用落到該葉子節點的所有樣本的殘差向量,計算增益rjkm;更新每乙個樣本的估計值fk(x);因此,又可以對估計進行logistic變化,利用樣本的目標值計算殘差向量,訓練第二棵樹了;

4、注意樣本的估計值fk(x)是前面所有樹的估值之和,因此,計算殘差時,用樣本的目標值減去fk(x)就可以得到殘差了;

十、gbdt並行化:

1、按行並行化,將樣本按行分成n份,分別在n個節點上做計算;

2、並行建立一棵的過程:

1>在0號節點上對特徵隨機取樣,生成建立一棵樹需要用到的特徵,並分發到n個節點上;

2>在0號結點上維護每一維取樣特徵所有可能的特徵值;

3>將每一維特徵的每乙個可能的特徵值分發到n個節點上;

4>每乙個節點平行計算該節點上所有樣本與分發得到的特徵值的比較結果,分割成左右子樹,並計算增益;

5>歸併所有節點的增益,在0號結點得到每乙個特徵在每乙個特徵值的增益(f,v,incr);

6>在0號結點上找出最大的(f,v,incr),並作為本次的最佳裂點,分發到n個節點上;

7>n個節點將樣本分割成左右子樹;

8>對左右子樹繼續上面過程,直到葉子節點數目滿足要求;

3、並行建立第二棵樹;

因此,gbdt並行化包括了樣本並行化與特徵**點計算的並行化;其中最耗時的仍然是需要遍歷特徵的所有可能的特徵值,並計算增益尋找最優**點的過程;可以採用對特徵值直方圖取樣,不用遍歷所有特徵值來優化。

這裡參考了對分類問題的解釋,寫得非常好,treelink裡面的**基本就是按照這個流程實現的。

埠二三事

最近在看0 1024熟知埠所對應的內容,然後寫了指令碼對iana資料庫所提供的埠和服務對應的關係進行了歸類,發現如下的埠是值得注意的地方。就在處理0 1024埠的時候,出現的值得注意的地方列舉如下。總的來說,有些埠已經加入了對sctp以及dccp的支援。sctp和dccp可以看成分別是對tcp和ud...

今日二三事

上午早起去辦租賃備案,辦完了回來啟用了信用卡並稍微摸索了下,中午和室友一起訂烤魚和小龍蝦,吃完都十二點多,午睡未睡著看了一會漫畫和 去書房三點多,買了一杯咖啡,看看一些前端文章,狀態好的情況下還是可以看進去一些英文文件的。晚飯後繼續看,邊看邊跟老弟聊天,他最近要學python,我打算也學一學,順便帶...

生活二三事

今天遭遇了一系列的事情,這些事情用當前的我個人的認知來說算是衰事吧,乙個倒也見怪不怪,但今天的接憧而至的架勢的的確確給我挫折感。然後呢我不得不散了會步,按照平時的狀態我是極其不喜歡乙個人散步的,因為那樣會感覺很孤獨,畢竟大學校園三五成群,兩兩相依的情景隨處可見,總以別人的眼光來看待自己很是累,恩。路...