XgBoost

GBDT與XGBoost

boosting(包括GBDT、XGBoost)是一個加法模型,有以下優缺點:

優點:
• 可解釋性強
• 可處理混合類型特徵
• 具體伸縮不變性(不用歸一化特徵)
• 有特徵組合的作用
• 可自然地處理缺失值
• 對異常點魯棒
• 有特徵選擇作用
• 可擴展性強,容易並行
缺點:
• 缺乏平滑性(迴歸預測時輸出值只能輸出有限的若干種數值)
• 不適合處理高維稀疏數據

一、GBDT

GBDT泛指所有梯度提升樹算法,包括XGBoost,它也是GBDT的一種變種,爲了區分它們,GBDT一般特指“Greedy Function Approximation:A Gradient Boosting Machine”裏提出的算法,只用了一階導數信息。

GBDT是在函數空間上利用梯度下降進行優化
GBDT是多個弱分類器合成強分類器的過程(加權求和),每次迭代產生一個弱分類器,當前弱分類器是在之前分類器殘差基礎上訓練。
目標:損失函數儘可能快減小,則讓損失函數沿着梯度方向下降。--> gbdt 的gb的核心了。

算法流程如下:

2.1 :求之前分類器損失函數的負梯度作爲本次弱分類器需要擬合的輸出
2.2:對迴歸樹的學習,一般選擇CART TREE(分類迴歸樹),對應的葉節點區域爲w,CART TREE生成就用平方誤差最小化
2.3:在葉結點區域上損失函數最小,求弱分類器權重
2.4:合成新的分類器

算法流程圖也可以如下圖:

不同問題的提升樹學習方法使用的損失函數不同,迴歸問題一般用平方誤差損失函數,分類問題一般用指數損失函數,以及其它一般決策問題的一般損失函數。

GBDT常用損失函數
分類算法:
分類算法中CART樹也是採用迴歸樹
(1) 指數損失函數:

負梯度計算和葉子節點的最佳負梯度擬合與Adaboost相似。
(2) 對數損失函數:
二元分類:

多元分類:

迴歸算法:
(1)均方差:

(2)絕對損失:

負梯度誤差爲:

(3)Huber損失:
均方差和絕對損失的折中,對遠離中心的異常點,採用絕對損失,而中心附近的點採用均方差。界限一般用分位數點度量。損失函數如下:

負梯度誤差:

(4) 分位數損失:分位數迴歸的損失函數,表達式爲

θ爲分位數,需要我們在迴歸前指定。對應的負梯度誤差爲:

Huber損失和分位數損失,減少異常點對損失函數的影響。

問題:GBDT如何減少異常點的影響?

(1) 使用健壯損失函數,如Huber損失函數和分位數(Quantile)損失函數;
(2) 增加正則化項;
(3) 採用無放回的子採樣。
異常點的魯棒性,隨機森林要比GBDT好。原因是GBDT的模型在迭代過程中較遠的異常點殘差往往會比正常點大,導致最終建立的模型出現偏差。一般的經驗是,異常點少的樣本集GBDT表現更加優秀,而異常點多的樣本集,隨機森林表現更好。

GBDT優點:

(1)處理各種類型的數據(非線性數據),包括連續值和離散值,處理多特徵類型。
(2)在相對少的調參時間情況下,預測的準備率也可以比較高(相對SVM)。
(樹的個數 100~10000、葉子的深度 3~8、學習速率 0.01~1、葉子上最大節點樹 20、訓練採樣比例 0.5~1、訓練特徵採樣比例 (√n)(n))
(3)能適應多種損失函數,使用健壯的損失函數,對異常值的魯棒性強。如 Huber損失函數和Quantile損失函數。
(4)適合低維稠密數據,模型可解釋性好
(5)不需要做特徵的歸一化,可以自動選擇特徵

GBDT缺點:

(1)弱學習器之間依賴,難以並行訓練數據。可以通過自採樣SGBT達到部分並行。
(2)計算複雜度大
(3)不使用高維稀疏特徵

Adaboost與GBDT:

Adaboost是通過提高錯分樣本的權重來定位模型的不足,採用指數損失,基分類器是最常見爲決策樹(深度爲1)
GBDT是通過負梯度來定位模型的不足,因此GBDT可以使用更多種類的損失函數

RF與GBDT:

1、組成RF的樹可以是分類樹,也可以是迴歸樹;而GBDT只由迴歸樹組成,因爲GBDT對所有樹的結果累加,累加無法通過分類完成
2、組成RF的樹並行生成;GBDT串行生成 ,GBDT更容易過擬合
3、輸出結果,RF採用多數投票等;GBDT將所有結果累加,或加權累加
4、RF對異常值不敏感,GBDT對異常值敏感
5、RF對訓練集一視同仁,每棵樹分裂特徵隨機;GBDT基於權值的弱分類器的集成 ,前面的樹優先分裂對大部分樣本區分的特徵,後分裂對小部分樣本區分的特徵
6、RF通過減少模型方差提高性能,GBDT通過減少模型偏差提高性能(低方差和高偏差)
7、RF參數主要是樹的棵樹,GBDT主要是樹的深度,一般爲1

RF優點:

1、易理解和解釋,樹可以被可視化。
2、不需要太多的數據預處理,不需要數據歸一化等。
3、隱含創造多個聯合特徵,解決非線性問題。
4、和決策樹模型、GBDT模型相比,RF不易過擬合。
5、自帶out-of-bag (oob)錯誤評估功能。 RF的重要特性是不用進行交叉驗證或使用一個獨立的測試集獲得無偏估計,它可以在內部進行評估,在生成的過程中可以對誤差進行無偏估計,由於每個基學習器只使用了訓練集中約63.2%的樣本,剩下約36.8%的樣本可用做驗證集來對其泛化性能進行‘包外估計’。
6、易於並行化。

RF缺點:

1、不適合小樣本,只適合大樣本。
2、大多數情況下,RF模型的精度略低於GBDT模型的精度。
3、適合決策邊界是矩形的,不適合對角線型的。


二、XGBoost

XGBoost應用牛頓法(二階泰勒展開)
加入正則項,對每棵樹的複雜度進行懲罰,防止過擬合

XGBoost目標函數及歸一化公式

歸一化解釋

XGBoost參數定義

XGBoost第t次迭代:訓練第t棵子樹,損失函數最小求參數,計算過程如下

上圖最小損失L是衡量第t棵CART樹的結構好壞的標準。L只和Gj和Hj和T有關,它們又只和樹的結構(q(x))有關,與葉子節點的值沒有關係。

假設分到j這個葉子節點上的樣本只有一個。那麼,w*j如下:

,w*j的最佳值是負的梯度乘以權重係數,該係數類似於隨機梯度下降中的學習率。hj越大,係數越小,學習率越小。hj代表在該點附近梯度變化非常劇烈,只要一點改變,梯度就從10000變到了1,所以在使用反向梯度更新時步子就要小,也就是權重係數要更小。

迴歸樹的學習策略

XGBoost的打分函數

上圖中Gain是單節點的L*減去切分後的兩個節點的樹L*,Gain如果是正的,且值越大,表示切分後L*越小於單節點的L*,越值得切分。Gain的左半部分如果小於右側的γ,則Gain就是負的,表明切分後L*變大。γ是一個臨界值,值越大,表示對切分後L*下降幅度要求越嚴。這個值可以在xgboost中設定。

γ是加入新葉子節點引入的複雜度代價

xgboost切分和普通的決策樹切分過程不同。普通的決策樹在切分的時候並不考慮樹的複雜度,而依賴後續的剪枝操作來控制。xgboost在切分的時候就考慮樹的複雜度,就是γ參數。不需要進行單獨的剪枝操作。

樹節點分裂方法

對於連續型特徵值,當樣本數量非常大,特徵取值過多時,遍歷所有取值會花費很多時間,且容易過擬合。因此XGBoost思想是對特徵進行分桶,即找到l個劃分點,將位於相鄰分位點之間的樣本分在一個桶中。在遍歷該特徵的時候,只需要遍歷各個分位點,從而計算最優劃分。從算法僞代碼中該流程還可以分爲兩種,全局的近似是在新生成一棵樹之前就對各個特徵計算分位點並劃分樣本,之後在每次分裂過程中都採用近似劃分,而局部近似就是在具體的某一次分裂節點的過程中採用近似算法。
近似算法流程如下:

尋找分爲點可以使用Weighted Quantile Sketch—分佈式加權直方圖算法

稀疏值處理

輸入x稀疏很常見。 稀疏性有多種可能原因:
(1)數據中存在缺失值
(2)統計中頻繁的零項
(3)特徵工程,例如one-hot編碼。
特徵值缺失時,無法利用該特徵進行劃分,則將每個樹節點中添加一個默認方向,如下圖,當稀疏矩陣x中缺少一個值時,樣本被分類爲默認方向。
默認方向選擇:將該樣本分別劃分到左結點和右結點,計算增益,分到增益大的一側。

關鍵的改進是隻訪問非缺失的條目Ik。 所提出的算法將不存在的值視爲缺失值並且學習處理缺失值的最佳方向。稀疏感知算法運行速度比初始版本快50倍

XGBoost的其它特性

Shrinkage and Column Subsampling
Shrinkage and Column Subsampling均是爲了防止過擬合

Shrinkage:每次迭代中對樹的每個葉子結點的分數乘上一個縮減權重η,降低了每棵獨立樹的影響,併爲將,留更大的空間給後面生成的樹去優化模型。類似於學習速率。
Column Subsampling:類似於隨機森林中的選取部分特徵進行建樹。
一種是按層隨機採樣,在對同一層內每個結點分裂之前,先隨機選擇一部分特徵,然後只需要遍歷這部分的特徵,來確定最優的分割點。
另一種是隨機選擇特徵,建樹前隨機選擇一部分特徵然後分裂就只遍歷這些特徵。一般情況下前者效果更好。

XGBoost的系統設計

Column Block
xgboost的並行不是tree粒度的並行,而是特徵粒度上。

決策樹學習中最耗時的部分是將數據按照特徵值進行排序。爲了降低排序成本,xgboost將數據存儲在內存單元中(block)。每個block數據以壓縮列(CSC)格式存儲,每列按特徵值排序。輸入數據佈局僅需要在訓練之前計算一次,在以後的迭代中重複使用,減少了計算量。block結構使並行變成可能。在進行結點的分裂時,需要計算每個特徵的增益,最終選擇增益最大的特徵做分裂,各個特徵的增益計算可以多進程進行。

1、精確的貪婪算法:整個數據集存儲在一個block,通過線性掃描預先排序的條目來運行拆分搜索算法。對所有葉子集體的進行拆分查找,因此對block進行一次掃描將收集所有葉子分支中的劃分候選者的統計數據。
2、近似算法:block結構也是有效的。使用多個塊,每個block對應數據集中行的子集。不同的block可以跨機器分佈,也可以在覈外設置中存儲在磁盤上。使用排序結構,quantile查找步驟變爲對排序列的線性掃描。對經常在每個分支處生成的局部提議算法有用,直方圖聚合中的二分搜索也變爲線性時間合併樣式算法。。

緩存感知訪問(Cache-aware Access)

Column Block算法通過行索引間接提取梯度統計,由於值是按特徵的順序訪問的。 這是一種非連續的內存訪問。 分裂枚舉的簡單實現在累積和非連續存儲器read/write操作之間引入了immediate read/write依賴性。 當梯度統計信息不適合CPU緩存併發生緩存未命中時,減慢拆分查找速度。

1、精確的貪心算法:通過緩存感知預取算法(cache-aware prefetching algorith)緩解問題。 在每個線程中分配一個內部緩衝區,獲取梯度統計信息,然後以小批量(mini-batch)方式執行累積。 此預取將direct read/write依賴性更改爲更長的依賴性,在有大量行數時幫助減少運行時開銷。 數據集很大時,精確貪婪算法的緩存感知實現的運行速度是普通版本的兩倍。
2、近似算法:通過選擇正確的塊大小解決問題。將塊大小定義爲塊中包含的最大示例數,這反映了梯度統計的高速緩存存儲成本。
選擇過小的塊大小會導致每個線程的工作量很小,並導致低效的並行化。
過大的塊會導致緩存未命中,因爲梯度統計信息不送入CPU緩存。

XGBoost的優點

1、多種防止過擬合方法,正則化、Shrinkage、Column Subsampling等。
2、 目標函數優化利用損失函數關於待求函數的二階導數
3、支持並行化,閃光點,雖然樹與樹串行,但同層級節點可並行。候選分裂點計算增益用多線程並行。訓練速度快。
4、添加對稀疏數據的處理。
5、交叉驗證,early stop,當預測結果已經很好的時候可以提前停止建樹,加快訓練速度。
6、分裂點尋找近似算法。
7、面向體系結構的優化,針對cache和內存做了性能優化。

XGBoost與GBDT對比

1、GBDT以CART作爲基分類器,XGBoost還支持線性分類器。可以通過booster[default=gbtree]設置參數:gbtree:tree-based models;gblinear:linear models,這個時候xgboost相當於帶L1和L2正則化項的邏輯斯蒂迴歸(分類問題)或者線性迴歸(迴歸問題)
2、GBDT用到一階導數信息,XGBoost對代價函數進行了二階泰勒展開,同時用到一階與二階導數,支持自定義代價函數(二階可導)
3、XGBoost在代價函數中加入正則化項,控制模型複雜度,降低模型variance,模型更加簡單,防止過擬合,正則項包含樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。代替剪枝
4、分裂結點處通過結構打分和分割損失動態生長。結構分數代替了迴歸樹的誤差平方和
5、新增shronkage和column subsampling,爲了防止過擬合
6、對缺失值處理。對特徵值有缺失的樣本,XGBoost可以自動學習它的分裂方向
7、 xgboost工具支持並行。
8、可並行的近似直方圖算法
9、Xgboost的訓練速度快於GBDT,10倍量級。

GBDT算法流程明確下一次擬合的是損失的負梯度方向,然後擬合迴歸樹,最後計算疊加後強分類器的損失
XGBoost流程是從損失函數最小化開始推導,得到當前這顆樹最優權重和和分裂權重,分裂權重與損失一次導數和二次導數均有關係

問題:XGBoost爲什麼使用CART樹而不是用普通的決策樹呢?

分類問題,CART樹的葉子節點對應的值是一個實際的分數,而非一個確定的類別,有利於實現高效的優化算法。XGBoost一是準,二是快,之所以快,其中有選用CART樹的一份功勞。

XGBoost參數說明

補充:CART樹

迴歸樹生成算法如下,使用最小二乘偏差(LSD)。

分類樹算法流程如下,使用GINI指數

(1)對每個特徵 A所有可能取值 a,將數據集分爲 A=a和 A!=a 兩個子集,計算集合 D 基尼指數
(2)遍歷所有的特徵 A,計算所有可能取值 a 的基尼指數,選擇 D 的基尼指數最小值對應的特徵及切分點作爲最優劃分,數據分爲兩個子集。
(3)上述兩個子節點遞歸調用步驟(1)(2),直到滿足停止條件。
(4)生成 CART 決策樹。

GINI

GINI 指數:

1、一種不等性度量;
2、介於 0~1 之間的數,0-完全相等,1-完全不相等;
3、總體內包含的類別越雜亂,GINI指數就越大(跟熵的概念很相似)

分類中,假設 K 個類,樣本屬於第 k 類的概率爲 pk,概率分佈的基尼指數爲:

樣本集合 D 的基尼指數爲:

Ck爲數據集D中屬於第k類的樣本子集,| * |表示樣本集中樣本的個數。
數據集 D 根據特徵 A 在某一取值 a 上進行分割,得到 D1、D2兩部分,則在特徵 A 下集合 D 的基尼指數爲:

停止條件:

1、節點中樣本個數小於設定閾值
2、樣本集Gini係數小於設定閾值(樣本基本屬於同一類)
3、沒有更多特徵

剪枝
決策樹防止過擬合方法:

1、閾值控制終止條件,避免樹形結構分支過細
2、基於Bootstrap思想建立隨機森林
3、對已經形成決策樹剪枝來避免過擬合

代價複雜度剪枝 Cost-Complexity Pruning(CCP) 方法對CART剪枝,算法流程如下:

1、從整個樹 T0開始,先剪去一棵子樹,生成子樹 T1
2、在 T1上再剪去一棵子樹,生成子樹 T2
3、重複,直到最後只剩一個根節點的子樹 Tn
4、得到了子樹序列 T0~Tn
5、利用獨立的驗證數據集,計算每個子樹的平方誤差或者基尼指數
6、選擇誤差最小的子樹作爲最優的剪枝後樹

其中 C(T)爲誤差(例如基尼指數),|T| 爲 T 的葉節點個數,alpha 爲非負參數,用來權衡訓練數據的擬合程度和模型的複雜度。

在計算整體損失函數時,內部節點以外的值都沒變,只有判斷是否剪枝的內部節點的局部損失函數改變,因此本需要計算全局的損失函數,但現在只需要計算內部節點剪枝前和剪枝後的損失函數。

對於(3)中的公式,分母是葉子結點減少的數量,分子是誤差減小的數量,比值是誤差減小率,如果誤差減小率很小,剪枝。
每次都剪g(t)最小的Tt,g(t)越小,增加葉子帶來的誤差減小量越小,增加這個葉子節點的作用越小。

剪枝例子如下:

R(t)=C(t)訓練數據的預測誤差(如基尼指數)= 節點 t 上的數據佔所有數據的比例 * 節點 t 的誤差率
R(Tt)=C(Tt)是子樹Tt的預測誤差 = 子樹Tt上所有葉子節點的預測誤差之和(葉子節點的預測誤差 = 葉子節點上的數據佔所有數據的比例 * 葉子節點的誤差率)
節點 t 的誤差率 = 該節點較少類別的數/該節點類別總數(大多數原則,該節點想要區分的類別是落在該節點數目多的類別)

例如 t1節點,R(t)即剪枝後誤差,數據所佔比例16/16,節點誤差率 = 該節點較少類別的數/該節點類別總數 = 8/16
R(Tt)爲剪枝前誤差,即葉子節點誤差之和,以該節點爲根節點的4葉子節點均只有一個類別的樣本,該節點較少類別的數/該節點類別總數 = 0,所以R(Tt) = 0

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章