日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

集成算法总结

發布時間:2024/3/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 集成算法总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • Bagging
  • Boosting
  • stacking
  • 常用的集成算法
    • 隨機森林 Random Forest
    • Adaboost
    • GBDT
    • xgboost
    • Lightgbm
  • 關于作者

集成算法是構建多個學習器,通過一定策略結合來完成學習任務。正所謂三個臭皮匠頂一個諸葛亮,當弱學習器被正確組合時,我們能得到更精確、魯棒性更好的學習器。由于個體學習器在準確性和多樣性存在沖突,追求多樣性勢必要犧牲準確性。這就需要將這些“好而不同”的個體學習器結合起來。而研究如何產生并結合個體學習器也是集成學習研究的核心。
集成學習的思想時將這些弱學習器的偏置或方差結合起來,從而創建一個強學習機,獲得更好的性能
按照個體學習器之間的關系,集成算法分為Bagging、Boosting、Stacking三大類。

Bagging

基于自主采樣法(bootstrap sampling)隨即得到一些樣本集訓練,用來分別訓練不同的基學習器,然后對不同的基學習器得到的結果投票得出最終的分類結果。自主采樣法得到的樣本大概會有63%的數據樣本被使用(有些數據樣本會被重復抽取,有些不會被抽取),剩下的可以用來做驗證集。

Bagging中各個算法之間沒有依賴,可以并行計算,他的結果參考了各種情況,實現的是在欠擬合和過擬合之間取折中。

Boosting

Boosting,提升算法,通過反復學習得到一系列弱分類器,然后組合這些弱分類器得到一個強分類器,吧弱學習器提升為強學習器的過程。主要分為兩個部分,加法模型和向前分布。
加法模型就是把一系列弱學習器相加串聯為強學習器,
F M ( x ; P ) = ∑ m = 1 n β m h ( x ; a m ) F_M(x;P) = \sum_{m=1}^n\beta_mh(x;a_m) FM?(x;P)=m=1n?βm?h(x;am?)
其中, h ( x ; a m ) h(x;a_m) h(x;am?)是一些列的弱學習器, a m a_m am?是該學習器訓練得到的最優參數, β m \beta_m βm?是對應弱學習器在強學習器中所占比例的系數。
向前分布是指本輪中的學習器是在上一輪學習器的基礎上迭代訓練得到的,
F m ( x ) = F m ? 1 ( x ) + β m h m ( x ; a m ) F_m(x) = F_{m-1}(x) + \beta_mh_m(x;a_m) Fm?(x)=Fm?1?(x)+βm?hm?(x;am?)

訓練過程為階梯狀,基模型按照次序一一進行訓練,基模型的訓練集按照某種策略每次都進行一定的轉化,如果某一個數據在這次分錯了,那么在下一次就會給他更大的權重。對所有基模型預測的結果進行線性綜合產生最終的預測結果。
一般來說,他的效果會比Bagging好一些,由于新模型是在就模型的基本上建立的,因此不能使用并行方式訓練,并且由于對錯誤樣本的關注,也可能造成過擬合。

stacking

stacking訓練一個模型用于組合其他各個基模型。具體方法是吧數據分成兩部分,用其中一部分訓練幾個基模型1、2、3,用另一部分數據測試這幾個基模型,把1、2、3的輸出作為輸入,訓練組合模型。注意,他不是把模型的結果組織起來,而把模型組織起來。理論上,stacking可以組織任何模型,實際中常用單層logistic回歸作為模型。

舉個栗子:

  • 首先我們會得到兩組數據:訓練集和測試集。將訓練集分成5份:train1,train2,train3,train4,train5。
  • 選定基模型。這里假定我們選擇了xgboost, lightgbm 和 randomforest這三種作為基模型。比如xgboost模型部分:依次用train1,train2,train3,train4,train5作為驗證集,其余4份作為訓練集,進行5折交叉驗證進行模型訓練;再在測試集上進行預測。這樣會得到在訓練集上由xgboost模型訓練出來的5份predictions,和在測試集上的1份預測值B1。將這五份縱向重疊合并起來得到A1。lightgbm和randomforest模型部分同理。
  • 三個基模型訓練完畢后,將三個模型在訓練集上的預測值作為分別作為3個"特征"A1,A2,A3,使用LR模型進行訓練,建立LR模型。
  • 使用訓練好的LR模型,在三個基模型之前在測試集上的預測值所構建的三個"特征"的值(B1,B2,B3)上,進行預測,得出最終的預測類別或概率。
  • stacking一般是兩層就夠了。

    常用的集成算法

    隨機森林 Random Forest

    概念:通過集成學習的思想將多棵樹集成的一種算法。基本單元是決策樹。隨機森林中每顆決策樹都是一個分類器,對于一個輸入樣本,N棵樹會有N個分類結果。隨機森林集成了所有的分類投票結果,將投票次數最多的類別指定為最終輸出。

    隨機森林生成規則

    • 如果訓練集大小為N,對于每棵樹而言,隨機且有放回的從訓練集中的抽取N個訓練樣本,作為該樹的訓練集。(隨機抽樣保證每棵樹的訓練集不同,有放回抽樣保證每棵樹的訓練樣本有交集,避免樹的結果有很大差異)
    • 特征隨機。如果每個樣本的特征維度是M。指定一個常數m<<M,隨機從M個特征中選取m個特征子集,每次樹進行分裂時,從m個特征中選擇最優的
    • 每棵樹盡最大程度生長,并沒有剪枝過程
    • 將生成的多棵樹組成隨機森林,用隨機森林對新的數據進行分類,分類結果按樹分類多少而定

    特點

    • 在當前所有算法中,具有極好的準確率
    • 能夠處理具有高維特征的輸入樣本,而且不需要降維
    • 能夠評估各個特征在分類問題上的重要性
    • 在生成過程中,能夠獲取到內部生成誤差的一種無偏估計
    • 對于缺省值也能夠獲得很好的結果
    • 隨機森林中的兩個“隨機性”是隨機森林不容易陷入過擬合,并且具有很好的抗噪能力
    • 能夠處理離散型/連續型數據,無需規范化
    • 隨機森林不使用全樣本,因為全樣本忽視了局部樣本的規律,不利于模型泛化能力

    缺點

    • 隨機森林在解決回歸問題時,表現較差,這是因為它并不能給出一個連續的輸出。
    • 隨機森林已經被證明在某些噪音較大的分類或者回歸問題上會過擬合
    • 隨機森林就像黑盒子,無法控制模型內部運行(可控性差)
    • 對于小數據或者低維數據,可能不能產生很好的分類

    Adaboost

    adaboost將弱分類器迭代成強分類器的過程,每個迭代過程中改變樣本權重和分類器權重,最終結果是每個分類器的權重和。
    原理

  • 初始化訓練樣本數據(每個樣本)的權值分布:如果有N個樣本,則每一個訓練的樣本點最開始時都被賦予相同的權重
  • 訓練弱分類器。具體訓練過程中,如果某個樣本已經被準確的分類,那么在構造下一個訓練集中,他的權重就被降低;相反,如果某個樣本點沒有被準確分類,那么他的權重就得到提高。同時,得到弱分類器對應的話語權。然后,更新權值后的樣本及被用于訓練下一個分類器,整個訓練過程如此迭代的進行下去。
  • 將各個訓練得到的弱分類器組合成強分類器。各個弱分類器的訓練過程結束后,分類誤差率小的弱分類器話語權較大,其在最終的分類函數中起著較大的決定作用,而分類誤差率大的弱分類器的話語權小。
  • 計算弱分類器的誤差函數,即分錯樣本對應的權值之和,adaboost損失函數為指數損失
    ? m = ∑ n = 1 N w n ( m ) I ( y m ( x n ) =? t n ) \epsilon_m = \sum_{n=1}{N}w_n^{(m)}I(y_m(x_n)\not=t_n) ?m?=n=1?Nwn(m)?I(ym?(xn?)?=tn?)
    計算弱分類器 G m ( x ) G_m(x) Gm?(x)的話語權 α m \alpha_m αm?
    α m = 1 2 l o g 1 ? ? m ? m \alpha_m = \frac{1}{2}log\frac{1-\epsilon_m}{\epsilon_m} αm?=21?log?m?1??m??
    更新訓練樣本集的權值分布
    D m + 1 = ( W m + 1 , 1 , W m + 1 , , 2 . . . . . . . W m + 1 , i . . . . . . . W m + 1 , N ) D_{m+1} = (W_{m+1,1},W_{m+1,,2}.......W_{m+1,i}.......W_{m+1,N}) Dm+1?=(Wm+1,1?,Wm+1,,2?.......Wm+1,i?.......Wm+1,N?)
    W m + 1 , i = W m i Z m e x p ( ? α m y i G m x i ) ) , i = 1 , 2....... N W_{m+1,i} = \frac{W_{mi}}{Z_m} exp(-\alpha_my_iG_mx_i)),i=1,2.......N Wm+1,i?=Zm?Wmi??exp(?αm?yi?Gm?xi?)),i=1,2.......N
    D m + 1 D_{m+1} Dm+1?是用于下次迭代時樣本的權值, W m + 1 , i W_{m+1,i} Wm+1,i?是下一次迭代時,第i個樣本的權值。其中, y i y_i yi?代表第i個樣本對應的類別(1或-1), G m ( x i ) G_m(x_i) Gm?(xi?)表示弱分類器對樣本 x i x_i xi?的分類(1或-1)。 Z m Z_m Zm?是歸一化因子,使得所有樣本對應的權值之和為
    Z M = ∑ i = 1 N w m i e x p ( ? α m y i G m ( x i ) ) Z_M = \sum_{i=1}^{N}w_{mi}exp(-\alpha_my_iG_m(x_i)) ZM?=i=1N?wmi?exp(?αm?yi?Gm?(xi?))
    迭代完成和,組合弱分類器
    G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ m = 1 M α m G m ( x ) ) G(x) = sign(f(x)) = sign(\sum_{m=1}^{M}\alpha_mG_m(x)) G(x)=sign(f(x))=sign(m=1M?αm?Gm?(x))

    優點

    • 精度很高的分類器
    • 很好地利用了弱分類器進行級聯
    • 可以將不同的分類算法作為弱分類器
    • 充分考慮每個分類器的權重
    • 提供的是框架,可以使用各種方法構建弱分類器
    • 簡單,不需要做特征篩選
    • 不用擔心過擬合

    實際應用

    • 用于二分類或多分類
    • 特征選擇
    • 分類任務的baseline

    缺點

    • 迭代次數不太好設定
    • 數據不平衡導致分類精度下降
    • 訓練比較耗時,每次重新選擇當前分類器最好切分點
    • 對異常樣本比較敏感,異常樣本在迭代過程中會獲得較高權值,影響最終學習器的性能表現

    訓練過程中,每輪訓練一直存在分類錯誤的問題,整個Adaboost卻能快速收斂
    每輪訓練結束后,AdaBoost 會對樣本的權重進行調整,調整的結果是越到后面被錯誤分類的樣本權重會越高。而后面的分類器為了達到較低的帶權分類誤差,會把樣本權重高的樣本分類正確。這樣造成的結果是,雖然每個弱分類器可能都有分錯的樣本,然而整個 AdaBoost 卻能保證對每個樣本進行正確分類,從而實現快速收斂。

    GBDT

    gbdt,Gradient Boost Decision Tree,梯度下降樹。是一種基于提升決策樹的模型以分類回歸決策樹作為基本分類器的模型。

    boosting tree
    提升樹就是把分類回歸決策樹CART直接進行線性組合的決策樹模型。
    f M ( x ) = = ∑ m = 1 M T ( x ; θ m ) f_M(x) = =\sum_{m=1}{M}T(x;\theta_m) fM?(x)==m=1?MT(x;θm?)
    T ( x ; θ m ) T(x;\theta_m) T(x;θm?)表示決策樹, θ m \theta_m θm?是決策樹的參數,M是樹的個數
    到第m步的模型是:
    f m ( x ) = f m ? 1 ( x ) + T ( x ; θ m ) f_m(x) = f_{m-1}(x) + T(x;\theta_m) fm?(x)=fm?1?(x)+T(x;θm?)
    f m ? 1 ( x ) f_{m-1}(x) fm?1?(x)當前模型,通過最小化損失函數的方法確定下一顆決策樹的參數。一般對于回歸問題采用的損失函數是平方誤差損失函數,對于分類問題則使用指數損失函數。
    f m ( x ) = f m ? 1 ( x ) ? T ( x ; θ m ) f_m(x) = f_{m-1}(x)-T(x;\theta_m) fm?(x)=fm?1?(x)?T(x;θm?)
    以回歸問題為例:
    L = [ y ? f m ( x ) ] 2 = [ r ? T ( x ; θ m ) ] 2 L = [y-f_m(x)]^2 = [r-T(x;\theta_m)]^2 L=[y?fm?(x)]2=[r?T(x;θm?)]2
    r = y ? f m ? 1 ( x ) r = y-f_{m-1}(x) r=y?fm?1?(x)是當前模型擬合的殘差

    gradient boosting
    提升樹算法利用加法模型與前向分布算法實現學習的優化過程,當損失函數是平方損失和指數損失的時候,每一步優化比較簡單,但是對一般損失函數而言,往往每一步算法優化并不是那么容易,所以就有了梯度提升算法,主要是利用損失函數的負梯度在當前模型的值:
    ? [ ? L ( y , f ( x i ) ) ? f ( x i ) ] f ( x ) = f m ? 1 ( x ) -[ \frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} ?[?f(xi?)?L(y,f(xi?))?]f(x)=fm?1?(x)?
    算法流程:

    gbdt的核心在于,每一顆樹學的是之前所有樹結論和的殘差,這個殘差就是一個加預測之后能得到真實值的累加量(所以gbdt中的樹都是回歸樹)。gbdt的弱分類器默認選擇CART TREE,也可以選擇其他低方差高偏差的分類器。
    比如A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲,即殘差為6歲。那么在第二棵樹里我們把A的年齡設為6歲去學習,如果第二棵樹真的能把A分到6歲的葉子節點,那累加兩棵樹的結論就是A的真實年齡;如果第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹里A的年齡就變成1歲,繼續學

    在第一棵樹分枝和圖1一樣,由于A,B年齡較為相近,C,D年齡較為相近,他們被分為兩撥,每撥用平均年齡作為預測值。此時計算殘差(殘差的意思就是: A的預測值 + A的殘差 = A的實際值),所以A的殘差就是16-15=1(注意,A的預測值是指前面所有樹累加的和,這里前面只有一棵樹所以直接是15,如果還有樹則需要都累加起來作為A的預測值)。進而得到A,B,C,D的殘差分別為-1,1,-1,1。然后我們拿殘差替代A,B,C,D的原值,到第二棵樹去學習,如果我們的預測值和它們的殘差相等,則只需把第二棵樹的結論累加到第一棵樹上就能得到真實年齡了。這里的數據顯然是我可以做的,第二棵樹只有兩個值1和-1,直接分成兩個節點。此時所有人的殘差都是0,即每個人都得到了真實的預測值。

    適用范圍

    • 所有回歸問題(線性/非線性)
    • 二分類問題

    優點

    • 預測精度高
    • 適合低維數據
    • 能處理非線性數據

    缺點

    • 并行麻煩
    • 數據維度高時會加大算法的計算復雜度

    xgboost

    xgboost,exterme gradient boosting,極限梯度提升。是基于決策樹的集成機器學習算法,以梯度提升為框架。xgboost由gbdt發展而來,同樣是利用加法模型與前向分布算法實現學習的優化過程,但與gbdt不同的地方在于:

    • 基分類器:XGBoost的基分類器不僅支持CART決策樹,還支持線性分類器,此時XGBoost相當于帶L1和L2正則化項的Logistic回歸(分類問題)或者線性回歸(回歸問題)。
    • 目標函數:xgboost的損失函數添加了正則化項,使用正則用以控制模型的復雜度,正則項里包含了樹的葉子節點個數、每個葉子節點權重(葉節點的score值)的平方和。
    • 優化方法:xgboost對損失函數做了二階泰勒展開。并且支持自定義損失函數,只要損失函數一階、二階可導
    • xgboost對缺失值進行了處理。讓缺失值分別被切分到左節點以及右節點,通過計算得分值比較兩種切分方法哪一個更優,則會對每個特征的缺失值都會學習到一個最優的默認切分方向。
    • 防止過擬合:xgboost除了增加了正則項來防止過擬合,還支持列采樣的方式來防止過擬合
    • 并行化,可以在最短時間內用更少的計算資源得到更好的結果。注意不是tree維度的并行,而是特征維度的并行。XGBoost預先將每個特征按特征值排好序,存儲為塊結構,分裂結點時可以采用多線程并行查找每個特征的最佳分割點,極大提升訓練速度。

    XGBoost的可以使用Regression Tree(CART)作為基學習器,也可以使用線性分類器作為基學習器。
    圖中為兩顆回歸樹(左右兩個),其中樹下方的輸出值即為葉節點的權重(得分),當輸出一個樣本進行預測時,根據每個內部節點的決策條件進行劃分節點,最終被劃分到的葉節點的權重即為該樣本的預測輸出值

    訓練過程
    目標函數:

    公式(2)右邊第一部分是度量預測值與真實值之間的損失函數,第二部分表示對模型復雜度的懲罰項(正則項),在懲罰項中 γ \gamma γ λ \lambda λ 表示懲罰系數, T T T表示給定一顆樹的葉節點數, ∣ ∣ ω ∣ ∣ 2 ||\omega||^2 ω2 表示每顆樹葉節點上的輸出分數的平方(相當于L2正則)。從目標函數的定義可以看出XGBoost對模型復雜度考慮了每顆樹的葉節點個數,以及每顆樹葉節點輸出得分值得平方和。

    XGBoost為什么使用泰勒二階展開

    • 精準性:相對于GBDT的一階泰勒展開,XGBoost采用二階泰勒展開,可以更為精準的逼近真實的損失函數
    • 可擴展性:損失函數支持自定義,只需要新的損失函數二階可導。

    XGBoost為什么快

    • 分塊并行:訓練前每個特征按特征值進行排序并存儲為Block結構,后面查找特征分割點時重復使用,并且支持并行查找每個特征的分割點
    • 候選分位點:每個特征采用常數個分位點作為候選分割點
    • CPU cache 命中優化: 使用緩存預取的方法,對每個線程分配一個連續的buffer,讀取每個block中樣本的梯度信息并存入連續的Buffer中。
    • Block 處理優化:Block預先放入內存;Block按列進行解壓縮;將Block劃分到不同硬盤來提高吞吐

    XGBoost防止過擬合的方法

    • 目標函數添加正則項:葉子節點個數+葉子節點權重的L2正則化
    • 列抽樣:訓練的時候只用一部分特征(不考慮剩余的block塊即可)
    • 子采樣:每輪計算可以不使用全部樣本,使算法更加保守
    • shrinkage: 可以叫學習率或步長,為了給后面的訓練留出更多的學習空間

    XGBoost中葉子結點的權重如何計算出來

    XGBoost如何處理不平衡數據

    • 使用AUC時,可以通過設置scale_pos_weight來平衡正樣本和負樣本的權重。例如,當正負樣本比例為1:10時,scale_pos_weight可以取10;
    • 如果你在意概率(預測得分的合理性),你不能重新平衡數據集(會破壞數據的真實分布),應該設置max_delta_step為一個有限數字來幫助收斂(基模型為LR時有效)。
    • 通過上采樣、下采樣、SMOTE算法或者自定義代價函數的方式解決正負樣本不平衡的問題。

    XGBoost中如何對樹進行剪枝

    • 在目標函數中增加了正則項:使用葉子結點的數目和葉子結點權重的L2模的平方,控制樹的復雜度。
    • 在結點分裂時,定義了一個閾值,如果分裂后目標函數的增益小于該閾值,則不分裂。
    • 當引入一次分裂后,重新計算新生成的左、右兩個葉子結點的樣本權重和。如果任一個葉子結點的樣本權重低于某一個閾值(最小樣本權重和),也會放棄此次分裂。
    • XGBoost 先從頂到底建立樹直到最大深度,再從底到頂反向檢查是否有不滿足分裂條件的結點,進行剪枝。(后剪枝)

    XGBoost如何評價特征的重要性

    • weight :該特征在所有樹中被用作分割樣本的特征的總次數。
    • gain :該特征在其出現過的所有樹中產生的平均增益。
    • cover :該特征在其出現過的所有樹中的平均覆蓋范圍。

    LightGBM比XGBoost的優點

    • 分割點查找算法:XGB使用特征預排序算法,LGB使用基于直方圖的切分點算法,減少內存占用,提高計算效率
    • 支持離散變量:無法直接輸入類別型變量,因此需要事先對類別型變量進行編碼(例如獨熱編碼),而LightGBM可以直接處理類別型變量。
    • 緩存命中率:XGB使用Block結構的一個缺點是取梯度的時候,是通過索引來獲取的,而這些梯度的獲取順序是按照特征的大小順序的,這將導致非連續的內存訪問,可能使得CPU cache緩存命中率低,從而影響算法效率。而LGB是基于直方圖分裂特征的,梯度信息都存儲在一個個bin中,所以訪問梯度是連續的,緩存命中率高。
    • LightGBM 與 XGboost 的并行策略不同

    Lightgbm

    LightGBM(Light Gradient Boosting Machine)是一個實現GBDT算法的框架,支持高效率的并行訓練,并且具有更快的訓練速度、更低的內存消耗、更好的準確率、支持分布式可以快速處理海量數據等優點。

    基于Histogram的決策樹算法
    轉自https://zhuanlan.zhihu.com/p/99069186
    直方圖算法
    Histogram algorithm應該翻譯為直方圖算法,直方圖算法的基本思想是:先把連續的浮點特征值離散化成 [公式] 個整數,同時構造一個寬度為 [公式] 的直方圖。在遍歷數據的時候,根據離散化后的值作為索引在直方圖中累積統計量,當遍歷一次數據后,直方圖累積了需要的統計量,然后根據直方圖的離散值,遍歷尋找最優的分割點。

    直方圖算法簡單理解為:首先確定對于每一個特征需要多少個箱子(bin)并為每一個箱子分配一個整數;然后將浮點數的范圍均分成若干區間,區間個數與箱子個數相等,將屬于該箱子的樣本數據更新為箱子的值;最后用直方圖(bins)表示。看起來很高大上,其實就是直方圖統計,將大規模的數據放在了直方圖中。
    特征離散化具有很多優點,如存儲方便、運算更快、魯棒性強、模型更加穩定等。對于直方圖算法來說最直接的有以下兩個優點:

    • 內存占用更小:直方圖算法不僅不需要額外存儲預排序的結果,而且可以只保存特征離散化后的值,而這個值一般用8位整型存儲就足夠了,內存消耗可以降低為原來的1/8。也就是說XGBoost需要用32位的浮點數去存儲特征值,并用[公式]位的整形去存儲索引,而 LightGBM只需要用 32 位去存儲直方圖,內存相當于減少為1/8
    • 計算代價更小:預排序算法XGBoost每遍歷一個特征值就需要計算一次分裂的增益,而直方圖算法LightGBM只需要計算k次(k可以認為是常數),直接將時間復雜度從O(datafeature)降低到O(kfeature),而我們知道data>>k。
      當然,Histogram算法并不是完美的。由于特征被離散化后,找到的并不是很精確的分割點,所以會對結果產生影響。但在不同的數據集上的結果表明,離散化的分割點對最終的精度影響并不是很大,甚至有時候會更好一點。原因是決策樹本來就是弱模型,分割點是不是精確并不是太重要;較粗的分割點也有正則化的效果,可以有效地防止過擬合;即使單棵樹的訓練誤差比精確分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下沒有太大的影響。

    直方圖做差加速
    LightGBM另一個優化是Histogram(直方圖)做差加速。一個葉子的直方圖可以由它的父親節點的直方圖與它兄弟的直方圖做差得到,在速度上可以提升一倍。通常構造直方圖時,需要遍歷該葉子上的所有數據,但直方圖做差僅需遍歷直方圖的k個桶。在實際構建樹的過程中,LightGBM還可以先計算直方圖小的葉子節點,然后利用直方圖做差來獲得直方圖大的葉子節點,這樣就可以用非常微小的代價得到它兄弟葉子的直方圖。

    注意:XGBoost 在進行預排序時只考慮非零值進行加速,而 LightGBM 也采用類似策略:只用非零特征構建直方圖。

    帶深度限制的 Leaf-wise 算法
    在Histogram算法之上,LightGBM進行進一步的優化。首先它拋棄了大多數GBDT工具使用的按層生長 (level-wise) 的決策樹生長策略,而使用了帶有深度限制的按葉子生長 (leaf-wise) 算法。
    XGBoost 采用 Level-wise 的增長策略,該策略遍歷一次數據可以同時分裂同一層的葉子,容易進行多線程優化,也好控制模型復雜度,不容易過擬合。但實際上Level-wise是一種低效的算法,因為它不加區分的對待同一層的葉子,實際上很多葉子的分裂增益較低,沒必要進行搜索和分裂,因此帶來了很多沒必要的計算開銷。

    LightGBM采用Leaf-wise的增長策略,該策略每次從當前所有葉子中,找到分裂增益最大的一個葉子,然后分裂,如此循環。因此同Level-wise相比,Leaf-wise的優點是:在分裂次數相同的情況下,Leaf-wise可以降低更多的誤差,得到更好的精度;Leaf-wise的缺點是:可能會長出比較深的決策樹,產生過擬合。因此LightGBM會在Leaf-wise之上增加了一個最大深度的限制,在保證高效率的同時防止過擬合。

    單邊梯度采樣算法
    Gradient-based One-Side Sampling 應該被翻譯為單邊梯度采樣(GOSS)。GOSS算法從減少樣本的角度出發,排除大部分小梯度的樣本,僅用剩下的樣本計算信息增益,它是一種在減少數據量和保證精度上平衡的算法。
    AdaBoost中,樣本權重是數據重要性的指標。然而在GBDT中沒有原始樣本權重,不能應用權重采樣。幸運的是,我們觀察到GBDT中每個數據都有不同的梯度值,對采樣十分有用。即梯度小的樣本,訓練誤差也比較小,說明數據已經被模型學習得很好了,直接想法就是丟掉這部分梯度小的數據。然而這樣做會改變數據的分布,將會影響訓練模型的精確度,為了避免此問題,提出了GOSS算法。
    GOSS是一個樣本的采樣算法,目的是丟棄一些對計算信息增益沒有幫助的樣本留下有幫助的。根據計算信息增益的定義,梯度大的樣本對信息增益有更大的影響。因此,GOSS在進行數據采樣的時候只保留了梯度較大的數據,但是如果直接將所有梯度較小的數據都丟棄掉勢必會影響數據的總體分布。所以,GOSS首先將要進行分裂的特征的所有取值按照絕對值大小降序排序(XGBoost一樣也進行了排序,但是LightGBM不用保存排序后的結果),選取絕對值最大的a100%個數據。然后在剩下的較小梯度數據中隨機選擇b100%個數據。接著將這b*100%個數據乘以一個常數(1-b)/a,這樣算法就會更關注訓練不足的樣本,而不會過多改變原數據集的分布。最后使用這(a+b)*100%個數據來計算信息增益。

    互斥特征捆綁算法
    高維度的數據往往是稀疏的,這種稀疏性啟發我們設計一種無損的方法來減少特征的維度。通常被捆綁的特征都是互斥的(即特征不會同時為非零值,像one-hot),這樣兩個特征捆綁起來才不會丟失信息。如果兩個特征并不是完全互斥(部分情況下兩個特征都是非零值),可以用一個指標對特征不互斥程度進行衡量,稱之為沖突比率,當這個值較小時,我們可以選擇把不完全互斥的兩個特征捆綁,而不影響最后的精度。互斥特征捆綁算法(Exclusive Feature Bundling, EFB)指出如果將一些特征進行融合綁定,則可以降低特征數量。這樣在構建直方圖時的時間復雜度從O(datafeature) 變為O(databundle) ,這里 bundle 指特征融合綁定后特征包的個數,且 bundle遠小于feature 。
    針對這種想法,我們會遇到兩個問題:

    • 怎么判定哪些特征應該綁在一起(build bundled)?
    • 怎么把特征綁為一個(merge feature)?
      (1)解決哪些特征應該綁在一起
      將相互獨立的特征進行綁定是一個 NP-Hard 問題,LightGBM的EFB算法將這個問題轉化為圖著色的問題來求解,將所有的特征視為圖的各個頂點,將不是相互獨立的特征用一條邊連接起來,邊的權重就是兩個相連接的特征的總沖突值,這樣需要綁定的特征就是在圖著色問題中要涂上同一種顏色的那些點(特征)。此外,我們注意到通常有很多特征,盡管不是100%相互排斥,但也很少同時取非零值。 如果我們的算法可以允許一小部分的沖突,我們可以得到更少的特征包,進一步提高計算效率。經過簡單的計算,隨機污染小部分特征值將影響精度最多 O ( [ 1 ? γ ] n ) O([1-\gamma]n) O([1?γ]n) γ \gamma γ是每個綁定中的最大沖突比率,當其相對較小時,能夠完成精度和效率之間的平衡。具體步驟可以總結如下:
      構造一個加權無向圖,頂點是特征,邊有權重,其權重與兩個特征間沖突相關;
      根據節點的度進行降序排序,度越大,與其它特征的沖突越大;
      遍歷每個特征,將它分配給現有特征包,或者新建一個特征包,使得總體沖突最小。
      算法允許兩兩特征并不完全互斥來增加特征捆綁的數量,通過設置最大沖突比率 [公式] 來平衡算法的精度和效率。
      算法3的時間復雜度是 O ( f e a t u r e 2 ) O(feature^2) O(feature2),訓練之前只處理一次,其時間復雜度在特征不是特別多的情況下是可以接受的,但難以應對百萬維度的特征。為了繼續提高效率,LightGBM提出了一種更加高效的無圖的排序策略:將特征按照非零值個數排序,這和使用圖節點的度排序相似,因為更多的非零值通常會導致沖突,新算法在算法3基礎上改變了排序策略。
      (2)解決怎么把特征綁為一捆
      特征合并算法,其關鍵在于原始特征能從合并的特征中分離出來。綁定幾個特征在同一個bundle里需要保證綁定前的原始特征的值可以在bundle中識別,考慮到histogram-based算法將連續的值保存為離散的bins,我們可以使得不同特征的值分到bundle中的不同bin(箱子)中,這可以通過在特征值中加一個偏置常量來解決。比如,我們在bundle中綁定了兩個特征A和B,A特征的原始取值為區間[0,10),B特征的原始取值為區間[0,20),我們可以在B特征的取值上加一個偏置常量10,將其取值范圍變為[10,30),綁定后的特征取值范圍為 [0, 30),這樣就可以放心的融合特征A和B了

    優點
    (1)速度更快

    • LightGBM 采用了直方圖算法將遍歷樣本轉變為遍歷直方圖,極大的降低了時間復雜度;
    • LightGBM 在訓練過程中采用單邊梯度算法過濾掉梯度小的樣本,減少了大量的計算;
    • LightGBM 采用了基于 Leaf-wise 算法的增長策略構建樹,減少了很多不必要的計算量;
    • LightGBM 采用優化后的特征并行、數據并行方法加速計算,當數據量非常大的時候還可以采用投票并行的策略;
    • LightGBM 對緩存也進行了優化,增加了緩存命中率;
      (2)內存更小
    • XGBoost使用預排序后需要記錄特征值及其對應樣本的統計值的索引,而 LightGBM 使用了直方圖算法將特征值轉變為 bin 值,且不需要記錄特征到樣本的索引,將空間復雜度從 O(2*data) 降低為 O(bin),極大的減少了內存消耗;
    • LightGBM 采用了直方圖算法將存儲特征值轉變為存儲 bin 值,降低了內存消耗;
    • LightGBM 在訓練過程中采用互斥特征捆綁算法減少了特征數量,降低了內存消耗。

    缺點

    • 可能會長出比較深的決策樹,產生過擬合。因此LightGBM在Leaf-wise之上增加了一個最大深度限制,在保證高效率的同時防止過擬合;
    • Boosting族是迭代算法,每一次迭代都根據上一次迭代的預測結果對樣本進行權重調整,所以隨著迭代不斷進行,誤差會越來越小,模型的偏差(bias)會不斷降低。由于LightGBM是基于偏差的算法,所以會對噪點較為敏感;
    • 在尋找最優解時,依據的是最優切分變量,沒有將最優解是全部特征的綜合這一理念考慮進去;

    關于作者

    總結

    以上是生活随笔為你收集整理的集成算法总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。