機器學習-XGB算法梳理


1,CART樹

  

  原理:

    Classification And Regression Tree(CART)是決策樹的一種,並且是非常重要的決策樹,屬於Top Ten Machine Learning Algorithm。顧名思義,CART算法既可以用於創建分類樹(Classification Tree),也可以用於創建回歸樹(Regression Tree)、模型樹(Model Tree),兩者在建樹的過程稍有差異。
    創建分類樹遞歸過程中,CART每次都選擇當前數據集中具有最小Gini信息增益的特征作為結點划分決策樹。ID3算法和C4.5算法雖然在對訓練樣本集的學習中可以盡可能多地挖掘信息,但其生成的決策樹分支、規模較大,CART算法的二分法可以簡化決策樹的規模,提高生成決策樹的效率。對於連續特征,CART也是采取和C4.5同樣的方法處理。為了避免過擬合(Overfitting),CART決策樹需要剪枝。預測過程當然也就十分簡單,根據產生的決策樹模型,延伸匹配特征值到最后的葉子節點即得到預測的類別。 
    創建回歸樹時,觀察值取值是連續的、沒有分類標簽,只有根據觀察數據得出的值來創建一個預測的規則。在這種情況下,Classification Tree的最優划分規則就無能為力,CART則使用最小剩余方差(Squared Residuals Minimization)來決定Regression Tree的最優划分,該划分准則是期望划分之后的子樹誤差方差最小。創建模型樹,每個葉子節點則是一個機器學習模型,如線性回歸模型

    CART算法的重要基礎包含以下三個方面: 

      1)二分(Binary Split):在每次判斷過程中,都是對觀察變量進行二分。 
        CART算法采用一種二分遞歸分割的技術,算法總是將當前樣本集分割為兩個子樣本集,使得生成的決策樹的每個非葉結點都只有兩個分枝。因此CART算法生成的決策樹是結構簡潔的二叉樹。因此CART算法適用於樣本特征的取值為是或非的場景,對於連續特征的處理則與C4.5算法相似。 
        2)單變量分割(Split Based on One Variable):每次最優划分都是針對單個變量。 
        3)剪枝策略:CART算法的關鍵點,也是整個Tree-Based算法的關鍵步驟。 
        剪枝過程特別重要,所以在最優決策樹生成過程中占有重要地位。有研究表明,剪枝過程的重要性要比樹生成過程更為重要,對於不同的划分標准生成的最大樹(Maximum Tree),在剪枝之后都能夠保留最重要的屬性划分,差別不大。反而是剪枝方法對於最優樹的生成更為關鍵。

  過程:

    CART假設決策樹是二叉樹,內部結點特征的取值為“是”和“否”,左分支是取值為“是”的分支,右分支是取值為“否”的分支。這樣的決策樹等價於遞歸地二分每個特征,將輸入空間即特征空間划分為有限個單元,並在這些單元上確定預測的概率分布,也就是在輸入給定的條件下輸出的條件概率分布。

    CART算法由以下兩步組成:

      1.決策樹生成:基於訓練數據集生成決策樹,生成的決策樹要盡量大; 決策樹剪枝:用驗證數據集對已生成的樹進行剪枝並選擇最優子樹,這時損失函數最小作為剪枝的標准。

      2.CART決策樹的生成就是遞歸地構建二叉決策樹的過程。CART決策樹既可以用於分類也可以用於回歸。本文我們僅討論用於分類的CART。對分類樹而言,CART用Gini系數最小化准則來進行特征選擇,生成二叉樹。 CART生成算法如下:

    輸入:訓練數據集D,停止計算的條件: 
    輸出:CART決策樹。

    根據訓練數據集,從根結點開始,遞歸地對每個結點進行以下操作,構建二叉決策樹:

    設結點的訓練數據集為D,計算現有特征對該數據集的Gini系數。此時,對每一個特征A,對其可能取的每個值a,根據樣本點對A=a的測試為“是”或 “否”將D分割成D1和D2兩部分,計算A=a時的Gini系數。 
    在所有可能的特征A以及它們所有可能的切分點a中,選擇Gini系數最小的特征及其對應的切分點作為最優特征與最優切分點。依最優特征與最優切分點,從現結點生成兩個子結點,將訓練數據集依特征分配到兩個子結點中去。 
    對兩個子結點遞歸地調用步驟l~2,直至滿足停止條件。 
    生成CART決策樹。 
    算法停止計算的條件是結點中的樣本個數小於預定閾值,或樣本集的Gini系數小於預定閾值(樣本基本屬於同一類),或者沒有更多特征。


2,算法原理

  2.1定義樹的復雜度

  

  把樹拆分成結構部分q和葉子權重部分w。 
  樹的復雜度函數和樣例:

 

  定義樹的結構和復雜度的原因很簡單,這樣就可以衡量模型的復雜度了啊,從而可以有效控制過擬合。

  2.2 xgboost中的boosting tree模型

 

 

  和傳統的boosting tree模型一樣,xgboost的提升模型也是采用的殘差(或梯度負方向),不同的是分裂結點選取的時候不一定是最小平方損失。

 

 

 

  2.3 對目標函數的改寫 
這里寫圖片描述

  最終的目標函數只依賴於每個數據點的在誤差函數上的一階導數和二階導數。這么寫的原因很明顯,由於之前的目標函數求最優解的過程中只對平方損失函數時候方便求,對於其他的損失函數變得很復雜,通過二階泰勒展開式的變換,這樣求解其他損失函數變得可行了。很贊! 

 

  當定義了分裂候選集合的時候,這里寫圖片描述可以進一步改目標函數。分裂結點的候選響集是很關鍵的一步,這是xgboost速度快的保證,怎么選出來這個集合,后面會介紹。 
這里寫圖片描述

  求解: 

 

2.4 樹結構的打分函數 
  Obj代表了當指定一個樹的結構的時候,在目標上面最多減少多少。(structure score)

這里寫圖片描述

  對於每一次嘗試去對已有的葉子加入一個分割 

這里寫圖片描述 
  這樣就可以在建樹的過程中動態的選擇是否要添加一個結點。 

這里寫圖片描述 
  假設要枚舉所有x < a 這樣的條件,對於某個特定的分割a,要計算a左邊和右邊的導數和。對於所有的a,我們只要做一遍從左到右的掃描就可以枚舉出所有分割的梯度和GL、GR。然后用上面的公式計算每個分割方案的分數就可以了。

3,損失函數

  給定一個數據集D中有n個樣本,每個樣本有m維特征。通過訓練數據集D,我們得到K棵樹。這K棵樹累加的值為我們的預測值。

 
  Boosting Tree的最終預測結果

  其中fk(xi)是樣本xi在第k棵樹的葉子上的權值。因此我們也可以這樣定義。

 
  樣本xi在第k棵樹上的的權值

  有了輸出值,我們就可以代入損失函數當中,損失函數可以是Mean Square Error,也可以是Cross entropy Loss。當然這個不是特別重要,因為我們最后要的是他們梯度。最后我們加上我們的Regularized Learning Objective,整個損失函數就出來了。

 
 

4,分裂結點算法


  1、暴力枚舉

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

  3、Weighted Quantile Sketch

 

5,正則化

  

  正則項用於控制模型的復雜度,也就是防止模型過擬合。

  左上角描繪的是用戶隨着時間的變化對某話題的感興趣程度的變化,如果使用step function來建模,可以看到右上角的模型基本上擬合到每一個數據點,然而也可以看到它太復雜了,也就是模型復雜度太高;而對於左下角模型,它雖然比較簡單,但是很多數據都沒有擬合到;最后看看右下角的模型,它簡單,而且基本擬合到所有數據點。因此我們說右下角的模型是最好的,對於一個機器學習的模型的通用原則是:簡單並且准確。模型往往需要在簡單和准確之中做一個折中,這種折中也成為偏差-方差的折中(bias-variance tradeoff)。


6,對缺失值處理

  關於缺失值的處理將其看與稀疏矩陣的處理看作一樣。在尋找split point的時候,不會對該特征為missing的樣本進行遍歷統計,只對該列特征值為non-missing的樣本上對應的特征值進行遍歷,通過這個技巧來減少了為稀疏離散特征尋找split point的時間開銷。在邏輯實現上,為了保證完備性,會分別處理將missing該特征值的樣本分配到左葉子結點和右葉子結點的兩種情形,計算增益后選擇增益大的方向進行分裂即可。可以為缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率。如果在訓練中沒有缺失值而在預測中出現缺失,那么會自動將缺失值的划分方向放到右子樹
7,優缺點

  與GBDT相比,xgBoosting有以下進步:

  1)GBDT以傳統CART作為基分類器,而xgBoosting支持線性分類器,相當於引入L1和L2正則化項的邏輯回歸(分類問題)和線性回歸(回歸問題);

  2)GBDT在優化時只用到一階導數,xgBoosting對代價函數做了二階Talor展開,引入了一階導數和二階導數;

  3)當樣本存在缺失值是,xgBoosting能自動學習分裂方向;

  4)xgBoosting借鑒RF的做法,支持列抽樣,這樣不僅能防止過擬合,還能降低計算;

  5)xgBoosting的代價函數引入正則化項,控制了模型的復雜度,正則化項包含全部葉子節點的個數,每個葉子節點輸出的score的L2模的平方和。從貝葉斯方差角度考慮,正則項降低了模型的方差,防止模型過擬合;

  6)xgBoosting在每次迭代之后,為葉子結點分配學習速率,降低每棵樹的權重,減少每棵樹的影響,為后面提供更好的學習空間;

  7)xgBoosting工具支持並行,但並不是tree粒度上的,而是特征粒度,決策樹最耗時的步驟是對特征的值排序,xgBoosting在迭代之前,先進行預排序,存為block結構,每次迭代,重復使用該結構,降低了模型的計算;block結構也為模型提供了並行可能,在進行結點的分裂時,計算每個特征的增益,選增益最大的特征進行下一步分裂,那么各個特征的增益可以開多線程進行;

  8)可並行的近似直方圖算法,樹結點在進行分裂時,需要計算每個節點的增益,若數據量較大,對所有節點的特征進行排序,遍歷的得到最優分割點,這種貪心法異常耗時,這時引進近似直方圖算法,用於生成高效的分割點,即用分裂后的某種值減去分裂前的某種值,獲得增益,為了限制樹的增長,引入閾值,當增益大於閾值時,進行分裂;

  然而,與LightGBM相比,又表現出了明顯的不足:

  1)xgBoosting采用預排序,在迭代之前,對結點的特征做預排序,遍歷選擇最優分割點,數據量大時,貪心法耗時,LightGBM方法采用histogram算法,占用的內存低,數據分割的復雜度更低;

  2)xgBoosting采用level-wise生成決策樹,同時分裂同一層的葉子,從而進行多線程優化,不容易過擬合,但很多葉子節點的分裂增益較低,沒必要進行跟進一步的分裂,這就帶來了不必要的開銷;LightGBM采用深度優化,leaf-wise生長策略,每次從當前葉子中選擇增益最大的結點進行分裂,循環迭代,但會生長出更深的決策樹,產生過擬合,因此引入了一個閾值進行限制,防止過擬合

8,應用場景

  處理各種不規則的數據
9,sklearn參數

1. eta [默認 0.3]

和 GBM 中的 learning rate 參數類似。 通過減少每一步的權重,可以提高模型的穩定性。 典型值為 0.01-0.2。

2. min_child_weight [默認 1]

決定最小葉子節點樣本權重和。和 GBM 的 min_child_leaf 參數類似,但不完全一樣。XGBoost 的這個參數是最小樣本權重的和,而 GBM 參數是最小樣本總數。這個參數用於避免過擬合。當它的值較大時,可以避免模型學習到局部的特殊樣本。但是如果這個值過高,會導致欠擬合。這個參數需要使用 CV 來調整。

3. max_depth [默認 6]

和 GBM 中的參數相同,這個值為樹的最大深度。這個值也是用來避免過擬合的。max_depth 越大,模型會學到更具體更局部的樣本。需要使用 CV 函數來進行調優。 典型值:3-10

4. max_leaf_nodes

樹上最大的節點或葉子的數量。 可以替代 max_depth 的作用。因為如果生成的是二叉樹,一個深度為 n 的樹最多生成 n2 個葉子。 如果定義了這個參數,GBM 會忽略 max_depth 參數。

5. gamma [默認 0]

在節點分裂時,只有分裂后損失函數的值下降了,才會分裂這個節點。Gamma 指定了節點分裂所需的最小損失函數下降值。 這個參數的值越大,算法越保守。這個參數的值和損失函數息息相關,所以是需要調整的。

6、max_delta_step[默認 0]

這參數限制每棵樹權重改變的最大步長。如果這個參數的值為 0,那就意味着沒有約束。如果它被賦予了某個正值,那么它會讓這個算法更加保守。 通常,這個參數不需要設置。但是當各類別的樣本十分不平衡時,它對邏輯回歸是很有幫助的。 這個參數一般用不到,但是你可以挖掘出來它更多的用處。

7. subsample [默認 1]

和 GBM 中的 subsample 參數一模一樣。這個參數控制對於每棵樹,隨機采樣的比例。 減小這個參數的值,算法會更加保守,避免過擬合。但是,如果這個值設置得過小,它可能會導致欠擬合。 典型值:0.5-1

8. colsample_bytree [默認 1]

和 GBM 里面的 max_features 參數類似。用來控制每棵隨機采樣的列數的占比 (每一列是一個特征)。 典型值:0.5-1

9. colsample_bylevel [默認 1]

用來控制樹的每一級的每一次分裂,對列數的采樣的占比。 我個人一般不太用這個參數,因為 subsample 參數和 colsample_bytree 參數可以起到相同的作用。但是如果感興趣,可以挖掘這個參數更多的用處。

10. lambda [默認 1]

權重的 L2 正則化項。(和 Ridge regression 類似)。 這個參數是用來控制 XGBoost 的正則化部分的。雖然大部分數據科學家很少用到這個參數,但是這個參數在減少過擬合上還是可以挖掘出更多用處的。

11. alpha [默認 1]

權重的 L1 正則化項。(和 Lasso regression 類似)。 可以應用在很高維度的情況下,使得算法的速度更快。

12. scale_pos_weight [默認 1]

在各類別樣本十分不平衡時,把這個參數設定為一個正值,可以使算法更快收斂。

學習目標參數

這個參數用來控制理想的優化目標和每一步結果的度量方法。

1. objective [默認 reg:linear]

這個參數定義需要被最小化的損失函數。最常用的值有:

binary:logistic 二分類的邏輯回歸,返回預測的概率 (不是類別)。 multi:softmax 使用 softmax 的多分類器,返回預測的類別 (不是概率)。

在這種情況下,你還需要多設一個參數:num_class(類別數目)。 multi:softprob 和 multi:softmax 參數一樣,但是返回的是每個數據屬於各個類別的概率。

2. eval_metric [默認值取決於 objective 參數的取值]

對於有效數據的度量方法。對於回歸問題,默認值是 rmse,對於分類問題,默認值是 error。 典型值有:

rmse 均方根誤差、mae 平均絕對誤差、logloss 負對數似然函數值、error 二分類錯誤率 (閾值為 0.5)、merror 多分類錯誤率、mlogloss 多分類 logloss 損失函數、auc 曲線下面積

3. seed [默認 0]

隨機數的種子設置它可以復現隨機數據的結果,也可以用於調整參數。


免責聲明!

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



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