模型融合和提升的算法------算法面試題


● bagging和boosting的區別

參考回答:

Bagging是從訓練集中進行子抽樣組成每個基模型所需要的子訓練集,然后對所有基模型預測的結果進行綜合操作產生最終的預測結果。

Boosting中基模型按次序進行訓練,而基模型的訓練集按照某種策略每次都進行一定的轉化,最后以一定的方式將基分類器組合成一個強分類器。

Bagging的訓練集是在原始集中有放回的選取,而Boosting每輪的訓練集不變,只是訓練集中的每個樣本在分類器中的權重都會發生變化,此權值會根據上一輪的結果進行調整。

Bagging的各個預測函數可以並行生成,Boosting的各預測函數只能順序生成。

Bagging中整體模型的期望近似於基模型的期望,所以整體模型的偏差相似於基模型的偏差,因此Bagging中的基模型為強模型(強模型擁有低偏差高方差)。

Boosting中的基模型為弱模型,若不是弱模型會導致整體模型的方差很大。

● boosting和 bagging區別

參考回答:

Bagging和Boosting的區別:

1)樣本選擇上:Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的。Boosting:每一輪的訓練集不變,只是訓練集中每個樣例在分類器中的權重發生變化。而權值是根據上一輪的分類結果進行調整。

2)樣例權重:Bagging:使用均勻取樣,每個樣例的權重相等。Boosting:根據錯誤率不斷調整樣例的權值,錯誤率越大則權重越大。

3)預測函數:Bagging:所有預測函數的權重相等。Boosting:每個弱分類器都有相應的權重,對於分類誤差小的分類器會有更大的權重。

4)並行計算:Bagging:各個預測函數可以並行生成。Boosting:各個預測函數只能順序生成,因為后一個模型參數需要前一輪模型的結果。

● XGBOOST和GDBT的區別

參考回答:

GDBT在函數空間中利用梯度下降法進行優化而XGB在函數空間中使用了牛頓法進行優化。即GDBT在優化中使用了一階導數信息,而XGB對損失函數進行了二階泰勒展開,用到了一階和二階倒數信息。XGB在損失函數中加入了正則項(樹葉子節點個數,每個葉子節點上輸出score的L2模平方和。對於缺失的樣本,XGB可以自動學習出它的分裂方向。GDBT的節點分裂方式使用的是gini系數,XGB通過優化推導出分裂前后的增益來選擇分裂節點。XGB在處理每個特征列時可以做到並行。

● GDBT的原理,以及常用的調參參數

參考回答:

先用一個初始值去學習一棵樹,然后在葉子處得到預測值以及預測后的殘差,之后的樹則基於之前樹的殘差不斷的擬合得到,從而訓練出一系列的樹作為模型。

n_estimators基學習器的最大迭代次數,learning_rate學習率,max_lead_nodes最大葉子節點數,max_depth樹的最大深度,min_samples_leaf葉子節點上最少樣本數。

● stacking和blending的區別?

參考回答:

Stacking和blending的區別在於數據的划分,blending用不相交的數據訓練不同的基模型,並將其輸出取加權平均。而stacking是將數據集划分為兩個不相交的集合,在第一個集合的數據集中訓練多個模型,在第二個數據集中測試這些模型,將預測結果作為輸入,將正確的標簽作為輸出,再訓練一個高層的模型。

● AdaBoost和GBDT的區別,AdaBoost和GBDT的區別

參考回答:

AdaBoost通過調整錯分的數據點的權重來改進模型,而GBDT是從負梯度的方向去擬合改進模型。

AdaBoost改變了訓練數據的權值,即樣本的概率分布,減少上一輪被正確分類的樣本權值,提高被錯誤分類的樣本權值,而隨機森林在訓練每棵樹的時候,隨機挑選部分訓練集進行訓練。在對新數據進行預測時,AdaBoost中所有樹加權投票進行預測,每棵樹的權重和錯誤率有關,而隨機森林對所有樹的結果按照少數服從多數的原則進行預測。

● gbdt推導

參考回答:

GBDT 全稱為 Gradient Boosting Decision Tree。顧名思義,它是一種基於決策樹(decision tree)實現的分類回歸算法。

Gradient Descent: method of steepest descent

梯度下降作為求解確定可微方程的常用方法而被人所熟知。它是一種迭代求解過程,具體就是使解沿着當前解所對應梯度的反方向迭代。這個方向也叫做最速下降方向。具體推導過程如下。假定當前已經迭代到第 k 輪結束,那么第 k+1 輪的結果怎么得到呢?我們對函數 f 做如下一階泰勒展開:

為了使得第k+1 輪的函數值比第 k 輪的小,即如下不等式成立。

則只需使:

按照這樣一直迭代下去,直到 ∇f(xk)=0,  xk+1=xk ,函數收斂,迭代停止。由於在做泰勒展開時,要求xk+1−xk 足夠小。因此,需要γ比較小才行,一般設置為 0~1 的小數。

順帶提一下,Gradient Descent 是一種一階優化方法,為什么這么說呢?因為它在迭代過程中不需要二階及以上的信息。如果我們在泰勒展開時,不是一階展開,而是二階展開。那對應的方法就是另一個被大家所熟知的可微方程求解方法:Newton Method,關於牛頓法的詳細內容,我們會在后續文章介紹。

Boosting: Gradient Descent in functional space

Boosting一般作為一種模型組合方式存在,這也是它在 GBDT 中的作用。那Boosting 與 gradient descent 有什么關系呢?上一節我們說到 gradient descent 是一種確定可微方程的求解方法。這里的可微有一個要求,就是說上文中的損失函數 f 針對模型 x 直接可微。因此模型x可以根據梯度迭代直接求解。而這種損失函數針對模型直接可微是一個很強的假設,不是所有的模型都滿足,比如說決策樹模型。現在我們回到第一節,將f(x)寫的更具體一點:

f(x)=l(h(x,D),Y)

其中D 為數據特征;Y 為數據 label;h 為模型函數,解決由 D->Y 的映射,x為模型函數參數,即通常我們說的模型;l 為目標函數或損失函數。

以邏輯回歸為例, x為權重向量, h模型函數展開為:

目標函數l展開為:

我們發現函數1對h可微,同時h對x可微,因此l對x可微。因此,我們可以通過 gradient descent的方式對x進行直接求解,而不用將h保存下來。然而,如果l對h可微,但h對x不可微呢?我們仍按照第一節的方法先對l進行泰勒展開,只不過不是針對x,而是對 h。為了簡單起見,我們省略D,Y。

其中:

按照第一節的邏輯,我們不難得出如下迭代公式:

但別忘了,我們的目的不是求 h,而是 x。由於 h 對 x 不可微,所以 x 必須根據數據重新學習得到。而此時我們重新學習 x 的目標已經不是源目標 Y,而是原損失函數 l 在當前 H 處的梯度,即:

 

這個重新學習x的過程正是每個base weak learner所做的事情。而這種通過weak learner 擬合每一步迭代后的梯度,進而實現weak learner組合的方式,就是Boosting。又由於我們在求導過程中,損失函數l沒法對模型x直接求導,而只能對模型函數h求導。因此 Boosting又有一個別名:“函數空間梯度下降“。

此外,你可能會聽過boosting的可加性(additive)。這里順便提一句,可加性指的是 h 的可加,而不是x的可加。比如x是決策樹,那兩棵決策樹本身怎么加在一起呢?你頂多把他們並排放在一起。可加的只是樣本根據決策樹模型得到的預測值 h(x,D)罷了。

Decision Tree: the based weak learner

Boosting 的本質就是使用每個weak learner來擬合截止到當前的梯度。則這里的D,還是原來數據中的D,而Y已經不是原來的Y了。而GBDT 中的這個weak learner 就是一棵分類回歸樹(CART)。因此我們可以使用決策樹直接擬合梯度:∇l(H(xt))。此時我們要求的x就變成了這樣一棵有k個葉子節點的、使得如下目標函數最小化的決策樹:

其中T為目標∇l(H(xt)),W為每個葉子節點的權重,L為葉子節點集合。容易求得每個葉子節點的權重為歸屬到當前葉子節點的樣本均值。即 :
 

每個樣本的預測值即為其所歸屬的葉子節點的權重,即h(xt+1)

● boosting和bagging在不同情況下的選用

參考回答:

Bagging與Boosting的區別:

1)取樣方式(樣本權重):Bagging是均勻選取,樣本的權重相等,Boosting根據錯誤率取樣,錯誤率越大則權重越大。2)訓練集的選擇:Bagging隨機選擇訓練集,訓練集之間相互獨立,Boosting的各輪訓練集的選擇與前面各輪的學習結果有關。3)預測函數:Bagging各個預測函數沒有權重,可以並行生成,Boosting有權重,順序生成。4)Bagging是減少variance,Boosting是減少bias。

Bagging 是 Bootstrap Aggregating的簡稱,意思就是再取樣 (Bootstrap) 然后在每個樣本上訓練出來的模型取平均,所以是降低模型的 variance. Bagging 比如 Random Forest 這種先天並行的算法都有這個效果。

Boosting 則是迭代算法,每一次迭代都根據上一次迭代的預測結果對樣本進行加權,所以隨着迭代不不斷進行行,誤差會越來越小,所以模型的 bias 會不不斷降低。這種算法無法並行。

● gbdt推導和適用場景

參考回答:

1)明確損失函數是誤差最小

2)構建第一棵回歸樹

3)學習多棵回歸樹

迭代:計算梯度/殘差gm(如果是均方誤差為損失函數即為殘差)

步長/縮放因子p,用 a single Newton-Raphson step 去近似求解下降方向步長,通常的實現中 Step3 被省略,采用 shrinkage 的策略通過參數設置步長,避免過擬合:第m棵樹fm=p*gm;模型Fm=Fm-1+p*gm

4)F(x)等於所有樹結果累加

適用場景:GBDT幾乎可用於所有回歸問題(線性/非線性),GBDT的適用面非常廣。亦可用於二分類問題(設定閾值,大於閾值為正例,反之為負例)。

● 說一下gbdt的全部算法過程

參考回答:

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種用於回歸的機器學習算法,該算法由多棵回歸決策樹組成,所有樹的結論累加起來做最終答案。當把目標函數做變換后,該算法亦可用於分類或排序。
1)明確損失函數是誤差最小

2)構建第一棵回歸樹

3)學習多棵回歸樹

迭代:計算梯度/殘差gm(如果是均方誤差為損失函數即為殘差)

步長/縮放因子p,用 a single Newton-Raphson step 去近似求解下降方向步長,通常的實現中 Step3 被省略,采用 shrinkage 的策略通過參數設置步長,避免過擬合

第m棵樹fm=p*gm

模型Fm=Fm-1+p*gm

4)F(x)等於所有樹結果累加

● rf和gbdt基分類器區別,里面的決策樹分別長啥樣,怎么剪枝

參考回答:

GBDT和RF都是集成方法中的經典模型,我們需要弄清楚下面幾個問題:1)GBDT是采用boosing方法,RF采用的是baggging方法;2)bias和variance是解釋模型泛化性能的,其實還有噪聲。

然后,理解GBDT和RF執行原理,其中GBDT中的核心是通過用分類器(如CART、RF)擬合損失函數梯度,而損失函數的定義就決定了在子區域內各個步長,其中就是期望輸出與分類器預測輸出的查,即bias;而RF的核心就是自采樣(樣本隨機)和屬性隨機(所有樣本中隨機選擇K個子樣本選擇最優屬性來划分),樣本數相同下的不同訓練集產生的各個分類器,即數據的擾動導致模型學習性能的變化,即variance。

Gradient boosting Decision Tree(GBDT)

GB算法中最典型的基學習器是決策樹,尤其是CART,正如名字的含義,GBDT是GB和DT的結合。要注意的是這里的決策樹是回歸樹,GBDT中的決策樹是個弱模型,深度較小一般不會超過5,葉子節點的數量也不會超過10,對於生成的每棵決策樹乘上比較小的縮減系數(學習率<0.1),有些GBDT的實現加入了隨機抽樣(subsample 0.5<=f <=0.8)提高模型的泛化能力。通過交叉驗證的方法選擇最優的參數。

Random Forest:

bagging (你懂得,原本叫Bootstrap aggregating),bagging 的關鍵是重復的對經過bootstrapped采樣來的觀測集子集進行擬合。然后求平均。。。一個bagged tree充分利用近2/3的樣本集。。。所以就有了OOB預估(outof bag estimation)

GBDT和隨機森林的相同點:

1)都是由多棵樹組成;2)最終的結果都是由多棵樹一起決定

GBDT和隨機森林的不同點:

1)組成隨機森林的樹可以是分類樹,也可以是回歸樹;而GBDT只由回歸樹組成;

2)組成隨機森林的樹可以並行生成;而GBDT只能是串行生成;

3)對於最終的輸出結果而言,隨機森林采用多數投票等;而GBDT則是將所有結果累加起來,或者加權累加起來;

4)隨機森林對異常值不敏感,GBDT對異常值非常敏感;

5)隨機森林對訓練集一視同仁,GBDT是基於權值的弱分類器的集成;

6)隨機森林是通過減少模型方差提高性能,GBDT是通過減少模型偏差提高性能。

RF決策樹:

學習隨機森林模型前,一定要先了解決策樹模型。樹越深,模型越復雜。

決策樹模型的優點如下。1)容易理解和解釋,樹可以被可視化。2)不需要太多的數據預處理工作,即不需要進行數據歸一化,創造啞變量等操作。3)隱含地創造了多個聯合特征,並能夠解決非線性問題。

GBDT決策樹:

迭代決策樹GBDT(Gradient Boosting Decision Tree)也被稱為是MART(Multiple Additive Regression Tree))或者是GBRT(Gradient Boosting Regression Tree),也是一種基於集成思想的決策樹模型,但是它和Random Forest有着本質上的區別。不得不提的是,GBDT是目前競賽中最為常用的一種機器學習算法,因為它不僅可以適用於多種場景,更難能可貴的是,GBDT有着出眾的准確率。

樹的剪枝:

(1)前剪枝( Pre-Pruning)

通過提前停止樹的構造來對決策樹進行剪枝,一旦停止該節點下樹的繼續構造,該節點就成了葉節點。一般樹的前剪枝原則有:a.節點達到完全純度;b.樹的深度達到用戶所要的深度;c.節點中樣本個數少於用戶指定個數;d.不純度指標下降的最大幅度小於用戶指定的幅度。

(2)后剪枝( Post-Pruning)

首先構造完整的決策樹,允許決策樹過度擬合訓練數據,然后對那些置信度不夠的結點的子樹用葉結點來替代。CART 采用Cost-Complexity Pruning(代價-復雜度剪枝法),代價(cost) :主要指樣本錯分率;復雜度(complexity) :主要指樹t的葉節點數,(Breiman…)定義樹t的代價復雜度(cost-complexity):信息熵H(X),信息增益=H(D)-H(Y|X),信息增益率=gain(x)/H(x),Gini系數=1-sum(pk^2),基尼系數就是熵在x=1的地方一階泰勒展開得到f(x)=1-x,所以gini=sum[x(1-x)]=1-sum(x^2)。

● 隨機森林和 GBDT 的區別

參考回答:

1)隨機森林采用的bagging思想,而GBDT采用的boosting思想。這兩種方法都是Bootstrap思想的應用,Bootstrap是一種有放回的抽樣方法思想。雖然都是有放回的抽樣,但二者的區別在於:Bagging采用有放回的均勻取樣,而Boosting根據錯誤率來取樣(Boosting初始化時對每一個訓練樣例賦相等的權重1/n,然后用該算法對訓練集訓練t輪,每次訓練后,對訓練失敗的樣例賦以較大的權重),因此Boosting的分類精度要優於Bagging。Bagging的訓練集的選擇是隨機的,各訓練集之間相互獨立,弱分類器可並行,而Boosting的訓練集的選擇與前一輪的學習結果有關,是串行的。2)組成隨機森林的樹可以是分類樹,也可以是回歸樹;而GBDT只能由回歸樹組成。3)組成隨機森林的樹可以並行生成;而GBDT只能是串行生成。4)對於最終的輸出結果而言,隨機森林采用多數投票等;而GBDT則是將所有結果累加起來,或者加權累加起來。5)隨機森林對異常值不敏感;GBDT對異常值非常敏感。6)隨機森林對訓練集一視同仁;GBDT是基於權值的弱分類器的集成。7)隨機森林是通過減少模型方差提高性能;GBDT是通過減少模型偏差提高性能。

● xgboost的特征重要性計算

參考回答:

Xgboost根據結構分數的增益情況計算出來選擇哪個特征作為分割點,而某個特征的重要性就是它在所有樹中出現的次數之和。

● xgboost的正則項表達式

參考回答:

 T為葉子節點的個數,w為葉子節點的分數

● xgboost原理,怎么防過擬合

參考回答:

XGBoost是一個樹集成模型,它使用的是K(樹的總數為K)個樹的每棵樹對樣本的預測值的和作為該樣本在XGBoost系統中的預測,定義函數如下:

對於所給的數據集有n個樣本,m個特征,定義為:

其中Xi表示第i個樣本,yi表示第i個樣本的類別標簽。CART樹的空間為F,如下:

其中q表示每棵樹的結構映射每個樣本到相應的葉節點的分數,即q表示樹的模型,輸入一個樣本,根據模型將樣本映射到葉節點輸出預測的分數;Wq(x)表示樹q的所有葉節點的分數組成集合;T是樹q的葉節點數量。

所以,由(1)式可以看出,XGBoost的預測值為每棵樹的預測值之和,即每棵樹相應的葉節點的得分之和(Wi的和,Wi表示第i個葉節點的得分)。

我們的目標就是學習這樣的K個樹模型f(x).。為了學習模型f(x),我們定義下面的目標函數:

其中,(2)式右邊第一項為損失函數項,即訓練誤差,是一個可微的凸函數(比如用於回歸的均方誤差和用於分類的Logistic誤差函數等),第二項為正則化項,即每棵樹的復雜度之和,目的是控制模型的復雜度,防止過擬合。我們的目標是在L(φ)取得最小化時得出對應的模型f(x)。

由於XGBoost模型中的優化參數是模型f(x),不是一個具體的值,所以不能用傳統的優化方法在歐式空間中進行優化,而是采用additive training的方式去學習模型。每一次保留原來的模型不變,加入一個新的函數f到模型中,如下:

預測值在每一次迭代中加入一個新的函數f目的是使目標函數盡量最大地降低。

因為我們的目標是最小化L(φ)時得到模型f(x),但是L(φ)中並沒有參數f(x),所以,我們將上圖中的最后一式代入L(φ)中可得到如下式子:

對於平方誤差(用於回歸)來說(3)式轉換成如下形式:

對於不是平方誤差的情況下,一般會采用泰勒展開式來定義一個近似的目標函數,以方便我們的進一步計算。

根據如下的泰勒展開式,移除高階無窮小項,得:

(3)式等價於下面的式子:

由於我們的目標是求L(φ)最小化時的模型f(x)(也是變量),當移除常數項時模型的最小值變化,但是取最小值的變量不變(比如:y=x^2+C,無論C去何值,x都在0處取最小值)。所以,為了簡化計算,我們移除常數項,得到如下的目標函數:

定義 為葉節點j的實例,重寫(4)式,將關於樹模型的迭代轉換為關於樹的葉子節點的迭代,得到如下過程:

此時我們的目標是求每棵樹的葉節點j的分數Wj,求出Wj后,將每棵樹的Wj相加,即可得到最終的預測的分數。而要想得到最優的Wj的值,即最小化我們的目標函數,所以上式對Wj求偏導,並令偏導數為0,算出此時的W*j為:

將W*j代入原式得:

方程(5)可以用作得分(score)函數來測量樹結構q的質量。該得分類似於評估決策樹的不純度得分,除了它是針對更廣泛的目標函數得出的。

在xgboost調中,一般有兩種方式用於控制過擬合:1)直接控制參數的復雜度:包括max_depth min_child_weight gamma;2)add randomness來使得對訓練對噪聲魯棒。包括subsample colsample_bytree,或者也可以減小步長 eta,但是需要增加num_round,來平衡步長因子的減小。

● xgboost,rf,lr優缺點場景。。。

參考回答:

Xgboost:

優缺點:1)在尋找最佳分割點時,考慮傳統的枚舉每個特征的所有可能分割點的貪心法效率太低,xgboost實現了一種近似的算法。大致的思想是根據百分位法列舉幾個可能成為分割點的候選者,然后從候選者中根據上面求分割點的公式計算找出最佳的分割點。2)xgboost考慮了訓練數據為稀疏值的情況,可以為缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率,paper提到50倍。3)特征列排序后以塊的形式存儲在內存中,在迭代中可以重復使用;雖然boosting算法迭代必須串行,但是在處理每個特征列時可以做到並行。4)按照特征列方式存儲能優化尋找最佳的分割點,但是當以行計算梯度數據時會導致內存的不連續訪問,嚴重時會導致cache miss,降低算法效率。paper中提到,可先將數據收集到線程內部的buffer,然后再計算,提高算法的效率。5)xgboost 還考慮了當數據量比較大,內存不夠時怎么有效的使用磁盤,主要是結合多線程、數據壓縮、分片的方法,盡可能的提高算法的效率。

適用場景:分類回歸問題都可以。

Rf:

優點:1)表現性能好,與其他算法相比有着很大優勢。2)隨機森林能處理很高維度的數據(也就是很多特征的數據),並且不用做特征選擇。3)在訓練完之后,隨機森林能給出哪些特征比較重要。4)訓練速度快,容易做成並行化方法(訓練時,樹與樹之間是相互獨立的)。5)在訓練過程中,能夠檢測到feature之間的影響。6)對於不平衡數據集來說,隨機森林可以平衡誤差。當存在分類不平衡的情況時,隨機森林能提供平衡數據集誤差的有效方法。7)如果有很大一部分的特征遺失,用RF算法仍然可以維持准確度。8)隨機森林算法有很強的抗干擾能力(具體體現在6,7點)。所以當數據存在大量的數據缺失,用RF也是不錯的。9)隨機森林抗過擬合能力比較強(雖然理論上說隨機森林不會產生過擬合現象,但是在現實中噪聲是不能忽略的,增加樹雖然能夠減小過擬合,但沒有辦法完全消除過擬合,無論怎么增加樹都不行,再說樹的數目也不可能無限增加的)。10)隨機森林能夠解決分類與回歸兩種類型的問題,並在這兩方面都有相當好的估計表現。(雖然RF能做回歸問題,但通常都用RF來解決分類問題)。11)在創建隨機森林時候,對generlization error(泛化誤差)使用的是無偏估計模型,泛化能力強。

缺點:1)隨機森林在解決回歸問題時,並沒有像它在分類中表現的那么好,這是因為它並不能給出一個連續的輸出。當進行回歸時,隨機森林不能夠做出超越訓練集數據范圍的預測,這可能導致在某些特定噪聲的數據進行建模時出現過度擬合。(PS:隨機森林已經被證明在某些噪音較大的分類或者回歸問題上回過擬合)。2)對於許多統計建模者來說,隨機森林給人的感覺就像一個黑盒子,你無法控制模型內部的運行。只能在不同的參數和隨機種子之間進行嘗試。3)可能有很多相似的決策樹,掩蓋了真實的結果。4)對於小數據或者低維數據(特征較少的數據),可能不能產生很好的分類。(處理高維數據,處理特征遺失數據,處理不平衡數據是隨機森林的長處)。5)執行數據雖然比boosting等快(隨機森林屬於bagging),但比單只決策樹慢多了。

適用場景:數據維度相對低(幾十維),同時對准確性有較高要求時。因為不需要很多參數調整就可以達到不錯的效果,基本上不知道用什么方法的時候都可以先試一下隨機森林。

Lr:

優點:實現簡單,廣泛的應用於工業問題上;分類時計算量非常小,速度很快,存儲資源低;便利的觀測樣本概率分數;對邏輯回歸而言,多重共線性並不是問題,它可以結合L2正則化來解決該問題。

缺點:當特征空間很大時,邏輯回歸的性能不是很好;容易欠擬合,一般准確度不太高

不能很好地處理大量多類特征或變量;只能處理兩分類問題(在此基礎上衍生出來的softmax可以用於多分類),且必須線性可分;對於非線性特征,需要進行轉換。

適用場景:LR同樣是很多分類算法的基礎組件,它的好處是輸出值自然地落在0到1之間,並且有概率意義。因為它本質上是一個線性的分類器,所以處理不好特征之間相關的情況。雖然效果一般,卻勝在模型清晰,背后的概率學經得住推敲。它擬合出來的參數就代表了每一個特征(feature)對結果的影響。也是一個理解數據的好工具。

● xgboost特征並行化怎么做的

參考回答:

決策樹的學習最耗時的一個步驟就是對特征值進行排序,在進行節點分裂時需要計算每個特征的增益,最終選增益大的特征做分裂,各個特征的增益計算就可開啟多線程進行。而且可以采用並行化的近似直方圖算法進行節點分裂。

● xgboost和lightgbm的區別和適用場景

參考回答:

(1)xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,區別是xgboost對每一層所有節點做無差別分裂,可能有些節點的增益非常小,對結果影響不大,但是xgboost也進行了分裂,帶來了務必要的開銷。 leaft-wise的做法是在當前所有葉子節點中選擇分裂收益最大的節點進行分裂,如此遞歸進行,很明顯leaf-wise這種做法容易過擬合,因為容易陷入比較高的深度中,因此需要對最大深度做限制,從而避免過擬合。

(2)lightgbm使用了基於histogram的決策樹算法,這一點不同與xgboost中的 exact 算法,histogram算法在內存和計算代價上都有不小優勢。1)內存上優勢:很明顯,直方圖算法的內存消耗為(#data* #features * 1Bytes)(因為對特征分桶后只需保存特征離散化之后的值),而xgboost的exact算法內存消耗為:(2 * #data * #features* 4Bytes),因為xgboost既要保存原始feature的值,也要保存這個值的順序索引,這些值需要32位的浮點數來保存。2)計算上的優勢,預排序算法在選擇好分裂特征計算分裂收益時需要遍歷所有樣本的特征值,時間為(#data),而直方圖算法只需要遍歷桶就行了,時間為(#bin)

(3)直方圖做差加速,一個子節點的直方圖可以通過父節點的直方圖減去兄弟節點的直方圖得到,從而加速計算。

(4)lightgbm支持直接輸入categorical 的feature,在對離散特征分裂時,每個取值都當作一個桶,分裂時的增益算的是”是否屬於某個category“的gain。類似於one-hot編碼。

(5)xgboost在每一層都動態構建直方圖,因為xgboost的直方圖算法不是針對某個特定的feature,而是所有feature共享一個直方圖(每個樣本的權重是二階導),所以每一層都要重新構建直方圖,而lightgbm中對每個特征都有一個直方圖,所以構建一次直方圖就夠了。

其適用場景根據實際項目和兩種算法的優點進行選擇。


免責聲明!

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



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