【基础算法】 GBDT/XGBoost 常见问题
原文作者:Jack Stack
原文:https://zhuanlan.zhihu.com/p/81368182
在非深度學習的機器學習模型中,基于GBDT算法的XGBoost、lightgbm等有著非常優秀的性能,校招算法崗面試中“出鏡率”非常高。這方面的資料非常多,因此本文不是原創,參考了很多面經、解讀文章等,對GBDT相關的問題做了總結。
XGBoost的原理
這個我建議直接看陳天奇的PPT和原論文。由于理論還是比較復雜的,所以需要時不時的回頭讀一讀。
介紹一下XGBoost的原理
XGBoost是基于GBDT的一種算法或者說工程實現。
GBDT是一種基于boosting集成思想的加法模型,訓練時采用前向分布算法進行貪婪的學習,每次迭代都學習一棵CART樹來擬合之前 t-1 棵樹的預測結果與訓練樣本真實值的殘差。
XGBoost的基本思想和GBDT相同,但是做了一些優化,如默認的缺失值處理,加入了二階導數信息、正則項、列抽樣,并且可以并行計算等。
XGBoost和GBDT的不同點:
GBDT是機器學習算法,XGBoost是該算法的工程實現。
在使用CART作為基分類器時,XGBoost顯式地加入了正則項來控制模型的復雜度,有利于防止過擬合,從而提高模型的泛化能力。
GBDT在模型訓練時只是用了代價函數的一階導數信息,XGBoost對代價函數進行二階泰勒展開,可以同時使用一階和二階導數。(好處:相對于GBDT的一階泰勒展開,XGBoost采用二階泰勒展開,可以更為精準的逼近真實的損失函數。需要注意的是,損失函數需要二階可導。)
傳統的GBDT采用CART作為基分類器,XGBoost支持多種類型的基分類器,比如線性分類器。
傳統的GBDT在每輪迭代時使用全部的數據,XGBoost則采用了與隨機森林相似的策略,支持對數據進行列采樣。
傳統的GBDT沒有涉及對缺失值進行處理,XGBoost能夠自動學習出缺失值的處理策略。
特征維度上的并行化。XGBoost預先將每個特征按特征值排好序,存儲為塊結構,分裂結點時可以采用多線程并行查找每個特征的最佳分割點,極大提升訓練速度。
GBDT的梯度相關問題
GBDT中的梯度是什么對什么的梯度?
當前損失函數L(yi, F(x))對樹F(xi)的梯度。
給一個有m個樣本,n維特征的數據集,如果用LR算法,那么梯度是幾維?
對權重w有n維,對bias有1維,因此是n+1維。
m*n的數據集,如果用GBDT,那么梯度是幾維?m維?n維?m*n維?或者是與樹的深度有關?或者與樹的葉子節點的個數有關?
目前還不是很確定????,后面補充。
XGBoost的并行是怎么做的?
由于XGBoost是一種boosting算法,樹的訓練是串行的,不能并行。這里的并行指的是特征維度的并行。在訓練之前,每個特征按特征值對樣本進行預排序,并存儲為Block結構,在后面查找特征分割點時可以重復使用,而且特征已經被存儲為一個個block結構,那么在尋找每個特征的最佳分割點時,可以利用多線程對每個block并行計算。
XGBoost算法防止過擬合的方法有哪些?
在目標函數中添加了正則化。葉子節點個數+葉子節點權重的L2正則化。
列抽樣。訓練時只使用一部分的特征。
子采樣。每輪計算可以不使用全部樣本,類似bagging。
early stopping。如果經過固定的迭代次數后,并沒有在驗證集上改善性能,停止訓練過程。
shrinkage。調小學習率增加樹的數量,為了給后面的訓練留出更多的空間。
使用XGBoost訓練模型時,如果過擬合了怎么調參?
控制模型的復雜度。包括max_depth,min_child_weight,gamma 等參數。
增加隨機性,從而使得模型在訓練時對于噪音不敏感。包括subsample,colsample_bytree。
減小learning rate,但需要同時增加estimator 參數。
XGBoost的正則項是什么?
葉子節點個數和葉子節點權重的L2正則。
XGBoost為什么對缺失值不敏感?
一些涉及到對樣本距離的度量的模型,如SVM和KNN,如果缺失值處理不當,最終會導致模型預測效果很差。
而樹模型對缺失值的敏感度低,大部分時候可以在數據缺失時時使用。原因就是,一棵樹中每個結點在分裂時,尋找的是某個特征的最佳分裂點(特征值),完全可以不考慮存在特征值缺失的樣本,也就是說,如果某些樣本缺失的特征值缺失,對尋找最佳分割點的影響不是很大。
另外,XGBoost還有一些處理缺失值的方法。
XGBoost怎么處理缺失值?
這是XGBoost的一個優點。具體處理方法為:
在某列特征上尋找分裂節點時,不會對缺失的樣本進行遍歷,只會對非缺失樣本上的特征值進行遍歷,這樣減少了為稀疏離散特征尋找分裂節點的時間開銷。
另外,為了保證完備性,對于含有缺失值的樣本,會分別把它分配到左葉子節點和右葉子節點,然后再選擇分裂后增益最大的那個方向,作為預測時特征值缺失樣本的默認分支方向。
如果訓練集中沒有缺失值,但是測試集中有,那么默認將缺失值劃分到右葉子節點方向。
XGBoost中的一棵樹的停止生長條件
當樹達到最大深度時,停止建樹,因為樹的深度太深容易出現過擬合,這里需要設置一個超參數max_depth。
當新引入的一次分裂所帶來的增益Gain<0時,放棄當前的分裂。這是訓練損失和模型結構復雜度的博弈過程。
當引入一次分裂后,重新計算新生成的左、右兩個葉子結點的樣本權重和。如果任一個葉子結點的樣本權重低于某一個閾值,也會放棄此次分裂。這涉及到一個超參數:最小樣本權重和,是指如果一個葉子節點包含的樣本數量太少也會放棄分裂,防止樹分的太細。
XGBoost可以做特征選擇,它是如何評價特征重要性的?
XGBoost中有三個參數可以用于評估特征重要性:
weight?:該特征在所有樹中被用作分割樣本的總次數。
gain?:該特征在其出現過的所有樹中產生的平均增益。
cover?:該特征在其出現過的所有樹中的平均覆蓋范圍。覆蓋范圍這里指的是一個特征用作分割點后,其影響的樣本數量,即有多少樣本經過該特征分割到兩個子節點。
隨機森林和GBDT的異同點
相同點:
都是由多棵樹組成,最終的結果都是由多棵樹一起決定。
不同點:
集成學習:RF屬于bagging思想,而GBDT是boosting思想。
偏差-方差權衡:RF不斷的降低模型的方差,而GBDT不斷的降低模型的偏差。
訓練樣本:RF每次迭代的樣本是從全部訓練集中有放回抽樣形成的,而GBDT每次使用全部樣本。
并行性:RF的樹可以并行生成,而GBDT只能順序生成(需要等上一棵樹完全生成)。
最終結果:RF最終是多棵樹進行多數表決(回歸問題是取平均),而GBDT是加權融合。
數據敏感性:RF對異常值不敏感,而GBDT對異常值比較敏感。
泛化能力:RF不易過擬合,而GBDT容易過擬合。
邏輯回歸(LR)和GBDT的區別
LR是線性模型,可解釋性強,很容易并行化,但學習能力有限,需要大量的人工特征工程
GBDT是非線性模型,具有天然的特征組合優勢,特征表達能力強,但是樹與樹之間無法并行訓練,而且樹模型很容易過擬合;
對于高維稀疏數據,GBDT效果不如LR。
XGBoost中如何對樹進行剪枝
在目標函數中增加了正則項:使用葉子結點的數目和葉子結點權重的L2模的平方,控制樹的復雜度。
在結點分裂時,定義了一個閾值,如果分裂后目標函數的增益小于該閾值,則不分裂。
當引入一次分裂后,重新計算新生成的左、右兩個葉子結點的樣本權重和。如果任一個葉子結點的樣本權重低于某一個閾值(最小樣本權重和),也會放棄此次分裂。
XGBoost 先從頂到底建立樹直到最大深度,再從底到頂反向檢查是否有不滿足分裂條件的結點,進行剪枝。
XGBoost如何選擇最佳分裂點?
XGBoost在訓練前預先將特征按照特征值進行了排序,并存儲為block結構,以后在結點分裂時可以重復使用該結構。
因此,可以采用特征并行的方法利用多個線程分別計算每個特征的最佳分割點,根據每次分裂后產生的增益,最終選擇增益最大的那個特征的特征值作為最佳分裂點。如果在計算每個特征的最佳分割點時,對每個樣本都進行遍歷,計算復雜度會很大,這種全局掃描的方法并不適用大數據的場景。XGBoost還提供了一種直方圖近似算法,對特征排序后僅選擇常數個候選分裂位置作為候選分裂點,極大提升了結點分裂時的計算效率。
XGBoost的延展性很好,怎么理解?
可以有三個方面的延展性:
基分類器:弱分類器可以支持CART決策樹,也可以支持LR和Linear。
目標函數:支持自定義loss function,只需要其二階可導。因為需要用二階泰勒展開,得到通用的目標函數形式。
學習方法:Block結構支持并行化,支持 Out-of-core計算。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復“加群”獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/yFQV7am喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的【基础算法】 GBDT/XGBoost 常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【基础算法】常见的ML、DL编程题
- 下一篇: 一份数据挖掘入门指南!!!