梯度提升决策树(GBDT)与XGBoost、LightGBM
20211224
【機器學習算法總結】XGBoost_yyy430的博客-CSDN博客_xgboost
xgboost參數
默認:auto。XGBoost中使用的樹構造算法。可選項:auto,exact,approx,hist,gpu_exact,gpu_hist。分布式和外部存儲器版本僅支持tree_method = approx。auto:使用啟發式方法選擇最快的方法。(1)對于中小型數據集,將使用精確的貪婪(exact)。(2)對于非常大的數據集,將選擇近似算法(approx)。(3)因為舊行為總是在單個機器中使用精確貪婪,所以當選擇近似算法來通知該選擇時,用戶將得到消息。
exact:精確貪心算法。
approx:使用分位數草圖和梯度直方圖的近似貪婪算法。
hist:快速直方圖優化近似貪心算法。 它使用了一些性能改進,例如垃圾箱緩存。
gpu_exact:精確算法的GPU實現。
gpu_hist:hist算法的GPU實現。
文章不全? ?缺少公式和圖
一、提升樹
-
提升樹
boostring tree是以決策樹為基本學習器的提升方法。它被認為是統計學習中性能最好的方法之一。 -
對分類問題,提升樹中的決策樹是二叉決策樹;對回歸問題,提升樹中的決策樹是二叉回歸樹。
-
提升樹模型可以表示為決策樹為基本學習器的加法模型:??。
其中 :
- 表示第 個決策樹。
- 為第 個決策樹的參數。
- 為決策樹的數量。
-
提升樹算法采用前向分步算法。
-
首先確定初始提升樹??。
-
第??步模型為:?。其中??為待求的第??個決策樹。
-
通過經驗風險極小化確定第??個決策樹的參數?:?。
這里沒有引入正則化,而在
xgboost?中會引入正則化。
-
-
不同問題的提升樹學習算法主要區別在于使用的損失函數不同(設預測值為?,真實值為?):
- 回歸問題:通常使用平方誤差損失函數: 。
- 分類問題:通常使用指數損失函數: 。
1.1 算法
-
給定訓練數據集?,其中??為輸入空間,??為輸出空間。
如果將輸入空間??劃分為??個互不相交的區域?,并且在每個區域上確定輸出的常量?, 則決策樹可以表示為:?
其中:
- 參數 表示決策樹的劃分區域和各區域上的輸出。
- 是決策樹的復雜度,即葉結點個數。
-
回歸問題中,提升樹采用平方誤差損失函數。此時:
其中??為當前模型擬合數據的殘差。
所以對回歸問題的提升樹算法,第??個決策樹??只需要簡單擬合當前模型的殘差。
-
不僅是回歸提升樹算法,其它的
boosting?回歸算法也是擬合當前模型的殘差。 -
回歸提升樹算法:
-
輸入:訓練數據集?
-
輸出:提升樹?
-
算法步驟:
-
初始化?
-
對于?
- 計算殘差: 。構建訓練殘差 : 。
- 通過學習一個回歸樹來擬合殘差 ,得到 。
- 更新
-
得到回歸問題提升樹:?。
-
-
1.2 GBT
-
提升樹中,當損失函數是平方損失函數和指數損失函數時,每一步優化都很簡單。因為平方損失函數和指數損失函數的求導非常簡單。
當損失函數是一般函數時,往往每一步優化不是很容易。針對這個問題,
Freidman提出了梯度提升算法。 -
梯度提升樹
GBT?是利用最速下降法的近似方法。其關鍵是利用損失函數的負梯度在當前模型的值作為殘差的近似值,從而擬合一個回歸樹。根據:
則有:
要使得損失函數降低,一個可選的方案是:?。
- 對于平方損失函數,它就是通常意義上的殘差。? ? ? ?看原文更好? ?有些圖沒粘貼過來
- 對于一般損失函數,它就是殘差的近似 。
-
梯度提升樹用于分類模型時,是梯度提升決策樹
GBDT;用于回歸模型時,是梯度提升回歸樹GBRT。 -
梯度提升回歸樹算法
GBRT:-
輸入:
- 訓練數據集
- 損失函數
-
輸出:回歸樹?
-
算法步驟:
-
初始化:??。
它是一顆只有根結點的樹,根結點的輸出值為:使得損失函數最小的值。
-
對于?
-
對于, 計算:
-
對??擬合一棵回歸樹,得到第??棵樹的葉結點區域?
-
對??計算每個區域??上的輸出值:
-
更新?
-
-
最終得到回歸樹:??。
-
-
-
梯度提升決策樹算法
GBDT與GBRT類似,主要區別是GBDT的損失函數與GBRT的損失函數不同。
1.3 正則化
-
在工程應用中,通常利用下列公式來更新模型:?。
其中??稱作學習率。
學習率是正則化的一部分,它可以降低模型更新的速度(需要更多的迭代)。
- 經驗表明:一個小的學習率 () 可以顯著提高模型的泛化能力(相比較于 ) 。
- 如果學習率較大會導致預測性能出現較大波動。
-
Freidman?從bagging?策略受到啟發,采用隨機梯度提升來修改了原始的梯度提升樹算法。-
每一輪迭代中,新的決策樹擬合的是原始訓練集的一個子集(而并不是原始訓練集)的殘差。
這個子集是通過對原始訓練集的無放回隨機采樣而來。
-
子集的占比??是一個超參數,并且在每輪迭代中保持不變。
- 如果 ,則與原始的梯度提升樹算法相同。
- 較小的 會引入隨機性,有助于改善過擬合,因此可以視作一定程度上的正則化。
- 工程經驗表明, 會帶來一個較好的結果。
-
這種方法除了改善過擬合之外,另一個好處是:未被采樣的另一部分子集可以用來計算包外估計誤差。
因此可以避免額外給出一個獨立的驗證集。
-
-
梯度提升樹會限制每棵樹的葉子結點包含的樣本數量至少包含??個樣本,其中??為超參數。在訓練過程中,一旦劃分結點會導致子結點的樣本數少于??,則終止劃分。
這也是一種正則化策略,它會改善葉結點的預測方差。
1.4 RF vs GBT
-
從模型框架的角度來看:
- 梯度提升樹
GBT為boosting模型。 - 隨機森林
RF為bagging模型。
- 梯度提升樹
-
從偏差分解的角度來看:
- 梯度提升樹
GBT采用弱分類器(高偏差,低方差)。梯度提升樹綜合了這些弱分類器,在每一步的過程中降低了偏差,但是保持低方差。 - 隨機森林
RF采用完全成長的子決策樹(低偏差,高方差)。隨機森林要求這些子樹之間盡可能無關,從而綜合之后能降低方差,但是保持低偏差。
- 梯度提升樹
-
如果在梯度提升樹和隨機森林之間二選一,幾乎總是建議選擇梯度提升樹。
-
隨機森林的優點:天然的支持并行計算,因為每個子樹都是獨立的計算。
-
梯度提升樹的優點:
-
梯度提升樹采用更少的子樹來獲得更好的精度。
因為在每輪迭代中,梯度提升樹會完全接受現有樹(投票權為1)。而隨機森林中每棵樹都是同等重要的(無論它們表現的好壞),它們的投票權都是?,因此不是完全接受的。
-
梯度提升樹也可以修改從而實現并行化。
-
梯度提升樹有一個明確的數學模型。因此任何能寫出梯度的任務,都可以應用梯度提升樹(比如?
ranking?任務)。而隨機森林并沒有一個明確的數學模型。
-
-
二、xgboost
-
xgboost?也是使用與提升樹相同的前向分步算法。其區別在于:xgboost?通過結構風險極小化來確定下一個決策樹的參數?:其中:
- 為第 個決策樹的正則化項。這是
xgboost和GBT的一個重要區別。 - 為目標函數。
- 為第 個決策樹的正則化項。這是
-
定義:
即:
- 為 在 的一階導數。
- 為 在 的二階導數。
對目標函數??執行二階泰勒展開:
提升樹模型只采用一階泰勒展開。這也是
xgboost?和GBT的另一個重要區別。 -
對一個決策樹??,假設不考慮復雜的推導過程,僅考慮決策樹的效果:
- 給定輸入 ,該決策樹將該輸入經過不斷的劃分,最終劃分到某個葉結點上去。
- 給定一個葉結點,該葉結點有一個輸出值。
因此將決策樹拆分成結構部分?,和葉結點權重部分??,其中??為葉結點的數量。
- 結構部分 的輸出是葉結點編號 。它的作用是將輸入 映射到編號為 的葉結點。
- 葉結點權重部分就是每個葉結點的值。它的作用是輸出編號為 的葉結點的值 。
因此決策樹改寫為:??。
2.1 結構分
-
定義一個決策樹的復雜度為:?。
其中:?為葉結點的個數;?為每個葉結點的輸出值;?為系數,控制這兩個部分的比重。
- 葉結點越多,則決策樹越復雜。
- 每個葉結點輸出值的絕對值越大,則決策樹越復雜。
該復雜度是一個經驗公式。事實上還有很多其他的定義復雜度的方式,只是這個公式效果還不錯。
-
將樹的拆分、樹的復雜度代入??的二階泰勒展開,有:
對于每個樣本?,它必然被劃分到樹??的某個葉結點。定義劃分到葉結點??的樣本的集合為:?。則有:
-
定義 :?。
- 刻畫了隸屬于葉結點 的那些樣本的一階偏導數之和。
- 刻畫了隸屬于葉結點 的那些樣本的二階偏導數之和。
偏導數是損失函數??關于當前模型的輸出??的偏導數。
則上式化簡為:?。
假設??與 與??無關,對??求導等于0,則得到:?。
忽略常數項,于是定義目標函數為:
-
在推導過程中假設??與 與??無關,這其實假設已知樹的結構。
事實上??是與??相關的,甚至與樹的結構相關,因此定義??為結構分。
結構分刻畫了:當已知樹的結構時目標函數的最小值。
2.2 分解結點
- 現在的問題是:如何得到最佳的樹的結構,從而使得目標函數全局最小。
2.2.1 貪心算法
-
第一種方法是對現有的葉結點加入一個分裂,然后考慮分裂之后目標函數降低多少。
- 如果目標函數下降,則說明可以分裂。
- 如果目標函數不下降,則說明該葉結點不宜分裂。
-
對于一個葉結點,假如給定其分裂點,定義劃分到左子結點的樣本的集合為:?;定義劃分到右子結點的樣本的集合為:?。則有:
-
定義葉結點的分裂增益為:
其中:
- 表示:該葉結點的左子樹的結構分。
- 表示:該葉結點的右子樹的結構分。
- 表示:如果不分裂,則該葉結點本身的結構分。
- 表示:因為分裂導致葉結點數量增大1,從而導致增益的下降。
每次分裂只一個葉結點,因此其它葉結點不會發生變化。因此:
- 若 ,則該葉結點應該分裂。
- 若 ,則該葉結點不宜分裂。
-
現在的問題是:不知道分裂點。對于每個葉結點,存在很多個分裂點,且可能很多分裂點都能帶來增益。
解決的辦法是:對于葉結點中的所有可能的分裂點進行一次掃描。然后計算每個分裂點的增益,選取增益最大的分裂點作為本葉結點的最優分裂點。
-
最優分裂點貪心算法:
-
輸入:
- 數據集 ,其中樣本 。
- 屬于當前葉結點的樣本集的下標集合 。
-
輸出:當前葉結點最佳分裂點。
-
算法:
-
初始化:?。
-
遍歷各維度:
-
初始化:?
-
遍歷各拆分點:沿著第??維 :
-
如果第??維特征為連續值,則將當前葉結點中的樣本從小到大排序。然后用??順序遍歷排序后的樣本下標:
-
如果第??維特征為離散值??,設當前葉結點中第??維取值??樣本的下標集合為??,則遍歷??:
-
-
-
選取最大的??對應的維度和拆分點作為最優拆分點。
-
-
-
分裂點貪心算法嘗試所有特征和所有分裂位置,從而求得最優分裂點。
當樣本太大且特征為連續值時,這種暴力做法的計算量太大。
2.2.2 近似算法
-
近似算法尋找最優分裂點時不會枚舉所有的特征值,而是對特征值進行聚合統計,然后形成若干個桶。
然后僅僅將桶邊界上的特征的值作為分裂點的候選,從而獲取計算性能的提升。
-
假設數據集??,樣本??。
對第??個特征進行分桶:
-
如果第??個特征為連續特征,則執行百分位分桶,得到分桶的區間為:?,其中??。
分桶的數量、分桶的區間都是超參數,需要仔細挑選。
-
如果第??個特征為離散特征,則執行按離散值分桶,得到的分桶為:?,其中??為第??個特征的所有可能的離散值。
分桶的數量??就是所有樣本在第??個特征上的取值的數量。
-
-
最優分裂點近似算法:
-
輸入:
- 數據集 ,其中樣本 。
- 屬于當前葉結點的樣本集的下標集合 。
-
輸出:當前葉結點最佳分裂點。
-
算法:
-
對每個特征進行分桶。 假設對第??個特征上的值進行分桶為:?。
如果第??個特征為連續特征,則要求滿足??。
-
初始化:?。
-
遍歷各維度:
-
初始化:?
-
遍歷各拆分點,即遍歷??:
-
如果是連續特征,則設葉結點的樣本中,第??個特征取值在區間??的樣本的下標集合為?,則:
-
如果是離散特征,則設葉結點的樣本中,第??個特征取值等于??的樣本的下標集合為?,則:
-
-
選取最大的??對應的維度和拆分點作為最優拆分點。
-
-
-
-
分桶有兩種模式:
-
全局模式:在算法開始時,對每個維度分桶一次,后續的分裂都依賴于該分桶并不再更新。
- 優點是:只需要計算一次,不需要重復計算。
- 缺點是:在經過多次分裂之后,葉結點的樣本有可能在很多全局桶中是空的。
-
局部模式:除了在算法開始時進行分桶,每次拆分之后再重新分桶。
- 優點是:每次分桶都能保證各桶中的樣本數量都是均勻的。
- 缺點是:計算量較大。
全局模式會構造更多的候選拆分點。而局部模式會更適合構建更深的樹。
-
-
分桶時的桶區間間隔大小是個重要的參數。
區間間隔越小,則桶越多,則劃分的越精細,候選的拆分點就越多。
2.3 加權分桶
-
假設候選樣本的第??維特征,及候選樣本的損失函數的二階偏導數為:
定義排序函數:
它刻畫的是:第??維小于??的樣本的??之和,占總的??之和的比例。
-
xgboost?的作者提出了一種帶權重的桶劃分算法。定義候選樣本的下標集合為??,拆分點??定義為:其中??表示樣本??的第??個特征。即:
-
最小的拆分點是所有樣本第??維的最小值。
-
最大的拆分點是所有樣本第??維的最大值。
-
中間的拆分點:選取拆分點,使得相鄰拆分點的排序函數值小于??(分桶的桶寬)。
- 其意義為:第 維大于等于 ,小于 的樣本的 之和,占總的 之和的比例小于 。
- 這種拆分點使得每個桶內的以 為權重的樣本數量比較均勻,而不是樣本個數比較均勻。
-
-
上述拆分的一個理由是:根據損失函數的二階泰勒展開有:
對于第??個決策樹,它等價于樣本??的真實標記為?、權重為?、損失函數為平方損失函數。因此分桶時每個桶的權重為??。
2.4 缺失值
-
真實場景中,有很多可能導致產生稀疏。如:數據缺失、某個特征上出現很多 0 項、人工進行?
one-hot?編碼導致的大量的 0。-
理論上,數據缺失和數值0的含義是不同的,數值 0 是有效的。
-
實際上,數值0的處理方式類似缺失值的處理方式,都視為稀疏特征。
在
xgboost?中,數值0的處理方式和缺失值的處理方式是統一的。這只是一個計算上的優化,用于加速對稀疏特征的處理速度。 -
對于稀疏特征,只需要對有效值進行處理,無效值則采用默認的分裂方向。
注意:每個結點的默認分裂方向可能不同。
-
-
在
xgboost?算法的實現中,允許對數值0進行不同的處理。可以將數值0視作缺失值,也可以將其視作有效值。如果數值0是有真實意義的,則建議將其視作有效值。
-
缺失值處理算法:
-
輸入:
- 數據集 ,其中樣本 。
- 屬于當前葉結點的樣本的下標集合 。
- 屬于當前葉結點,且第 維特征有效的樣本的下標集合 。
-
輸出:當前葉結點最佳分裂點。
-
算法:
-
初始化:?。
-
遍歷各維度:
-
先從左邊開始遍歷:
-
初始化:?
-
遍歷各拆分點:沿著第??維,將當前有效的葉結點的樣本從小到大排序。
這相當于所有無效特征值的樣本放在最右側,因此可以保證無效的特征值都在右子樹。
然后用??順序遍歷排序后的樣本下標:
-
-
再從右邊開始遍歷:
-
初始化:?
-
遍歷各拆分點:沿著??維,將當前葉結點的樣本從大到小排序。
這相當于所有無效特征值的樣本放在最左側,因此可以保證無效的特征值都在左子樹。
然后用??逆序遍歷排序后的樣本下標:
-
-
-
選取最大的??對應的維度和拆分點作為最優拆分點。
-
-
-
缺失值處理算法中,通過兩輪遍歷可以確保稀疏值位于左子樹和右子樹的情形。
2.5 其他優化
2.5.1 正則化
-
xgboost?在學習過程中使用了如下的正則化策略來緩解過擬合:- 通過學習率 來更新模型: 。
- 類似于隨機森林,采取隨機屬性選擇。
2.5.2 計算速度提升
-
xgboost?在以下方面提出改進來提升計算速度:- 預排序
pre-sorted。 cache-aware預取。Out-of-Core大數據集。
- 預排序
2.5.2.1 預排序
-
xgboost?提出column block?數據結構來降低排序時間。- 每一個
block代表一個屬性,樣本在該block中按照它在該屬性的值排好序。 - 這些
block只需要在程序開始的時候計算一次,后續排序只需要線性掃描這些block即可。 - 由于屬性之間是獨立的,因此在每個維度尋找劃分點可以并行計算。
- 每一個
-
block?可以僅存放樣本的索引,而不是樣本本身,這樣節省了大量的存儲空間。如:
block_1?代表所有樣本在feature_1?上的從小到大排序:sample_no1,sample_no2,....?。其中樣本編號出現的位置代表了該樣本的排序。
2.5.2.2 預取
-
由于在
column block?中,樣本的順序會被打亂,這會使得從導數數組中獲取??時的緩存命中率較低。因此
xgboost?提出了cache-aware?預取算法,用于提升緩存命中率。 -
xgboost?會以minibatch?的方式累加數據,然后在后臺開啟一個線程來加載需要用到的導數??。這里有個折中:
minibatch?太大,則會引起cache miss?;太小,則并行程度較低。
2.5.2.3 Out-of-Core
-
xgboost?利用硬盤來處理超過內存容量的大數據集。其中使用了下列技術:- 使用
block壓縮技術來緩解內存和硬盤的數據交換IO: 數據按列壓縮,并且在硬盤到內存的傳輸過程中被自動解壓縮。 - 數據隨機分片到多個硬盤,每個硬盤對應一個預取線程,從而加大"內存-硬盤"交換數據的吞吐量。
- 使用
三、LightGBM
-
GBT?的缺點:在構建子決策樹時為了獲取分裂點,需要在所有特征上掃描所有的樣本,從而獲得最大的信息增益。- 當樣本的數量很大,或者樣本的特征很多時,效率非常低。
- 同時
GBT也無法使用類似mini batch方式進行訓練。
-
xgboost?缺點:-
每輪迭代都需要遍歷整個數據集多次。
- 如果把整個訓練集裝載進內存,則限制了訓練數據的大小。
- 如果不把整個訓練集裝載進內存,則反復讀寫訓練數據會消耗非常大的
IO時間。
-
空間消耗大。預排序(
pre-sorted)需要保存數據的feature?值,還需要保存feature?排序的結果(如排序后的索引,為了后續的快速計算分割點)。因此需要消耗訓練數據兩倍的內存。 -
時間消耗大。為了獲取分裂點,需要在所有特征上掃描所有的樣本,從而獲得最大的信息增益,時間消耗大。
-
對
cache?優化不友好,造成cache miss?。- 預排序后,
feature對于梯度的訪問是一種隨機訪問,并且不同feature訪問的順序不同,無法對cache進行優化。 - 在每一層的樹生長時,需要隨機訪問一個行索引到葉子索引的數組,并且不同
feature訪問的順序也不同。
- 預排序后,
-
-
LightGBM?的優點:- 更快的訓練效率:在達到同樣的準確率的情況下,可以達到比
GBT約20倍的訓練速度。 - 低內存使用。
- 更高的準確率。
- 支持并行化學習。
- 可處理大規模數據。
- 更快的訓練效率:在達到同樣的準確率的情況下,可以達到比
3.1 原理
-
LightGBM?的思想:若減少訓練樣本的數量,或者減少樣本的訓練特征數量,則可以大幅度提高訓練速度。 -
LightGBM?提出了兩個策略:Gradient-based One-Side Sampling(GOSS): 基于梯度的采樣。該方法用于減少訓練樣本的數量。Exclusive Feature Bundling(EFB): 基于互斥特征的特征捆綁。該方法用于減少樣本的特征。
3.1.1 GOSS
3.1.1.1 算法
-
減少樣本的數量的難點在于:不知道哪些樣本應該被保留,哪些樣本被丟棄。
- 傳統方法:采用隨機丟棄的策略。
GOSS方法:保留梯度較大的樣本,梯度較小的樣本則隨機丟棄。
-
在
AdaBoost?中每個樣本都有一個權重,該權重指示了樣本在接下來的訓練過程中的重要性。在
GBDT?中并沒有這樣的權重。如果能知道每個樣本的重要性(即:權重),那么可以保留比較重要的樣本,丟棄不那么重要的樣本。由于
GBDT?中,負的梯度作為當前的殘差,接下來的訓練就是擬合這個殘差。因此GOSS?采用樣本的梯度作為樣本的權重:- 如果權重較小,則說明樣本的梯度較小,說明該樣本已經得到了很好的訓練。因此對于權重較小的樣本,則可以隨機丟棄。
- 如果權重較大,則說明樣本的梯度較大,說明該樣本未能充分訓練。因此對于權重較大的樣本,則需要保留。
-
GOSS?丟棄了部分樣本,因此它改變了訓練樣本的分布。這會影響到模型的預測準確性。為了解決這個問題,
GOSS?對小梯度的樣本進行了修正:對每個保留下來的、小梯度的樣本,其梯度乘以系數??(即放大一個倍數)。其中(假設樣本總數為??):
-
?是一個
0.0~1.0?之間的數,表示大梯度采樣比。其意義為:保留梯度的絕對值在?
top??的樣本作為重要的樣本。 -
?是一個
0.0~1.0?之間的數,表示小梯度采樣比。其意義為:從不重要的樣本中隨機保留??的樣本。
-
?是一個
0.0~1.0?之間的數,表示不重要的樣本的比例。 -
?刻畫了:從不重要的樣本中,隨機保留的樣本的比例的倒數。
-
-
GOSS?算法:-
輸入:
- 訓練集 ,其樣本數量為
- 大梯度采樣比
- 小梯度采樣比
- 當前的模型
-
輸出:下一個子樹?
-
算法:
-
計算:
- 修正因子
- 重要的樣本數為
- 隨機丟棄的樣本數為
- 每個樣本的損失函數的梯度
-
根據梯度的絕對值大小,將樣本按照從大到小排列。
- 取其中取 的樣本作為重要性樣本。
- 在 之外的樣本中,隨機選取 的樣本作為保留樣本,剩下的樣本被丟棄。
-
構建新的訓練集:
重要性樣本+隨機保留的樣本,其中:- 個重要性樣本,每個樣本的權重都為 1。
- 個隨機保留的樣本,每個樣本的權重都為 。
-
根據新的訓練集及其權重,訓練決策樹模型??來擬合殘差(即:負梯度?)。返回訓練好的??。
-
-
-
由于需要在所有的樣本上計算梯度,因此?
丟棄樣本的比例 ~ 加速比?并不是線性的關系。
3.1.1.2 理論
-
在
GBDT?生成新的子決策樹??時,對于當前結點??,考慮是否對它進行分裂。假設結點??包含的樣本集合為?, 樣本維數為??。對于第??維,假設其拆分點為?。
-
對于分類問題,其拆分增益為信息增益。它刻畫的是劃分之后混亂程度的降低,也就是純凈程度的提升:
其中:
- 表示樣本屬于結點 的概率, 為結點 上的樣本標記的條件熵。
- 表示左子結點的樣本集合; 表示右子結點的樣本集合。
- 表示樣本屬于結點 的左子結點概率, 為左子結點的樣本標記的條件熵。
- 表示樣本屬于結點 的右子結點概率, 為右子結點的樣本標記的條件熵。
對于結點??的任意拆分點,由于??都相同,所以:
-
對于回歸問題,其拆分增益為方差增益(
variance gain:VG)。它刻畫的是劃分之后方差的下降;也就是純凈程度的提升:其中:
- 表示屬于結點 的樣本的標記的方差。
- 表示左子結點的樣本集合; 表示右子結點的樣本集合。
- 表示屬于結點 的左子結點的樣本的標記的方差。
- 表示屬于結點 的右子結點的樣本的標記的方差。
對于結點??的任意拆分點,由于??都相同,所以:
-
-
對于樣本??,設其標記為??(它是殘差,也是負梯度)。
對于結點??中的樣本,設其樣本數量為?,樣本的標記均值為??,其方差為:
設總樣本數量為?, 則??,則有:
-
現在考慮回歸問題。
對于拆分維度??和拆分點?, 令左子結點的樣本下標為?,樣本數量為??右子結點的樣本下標為?, 樣本數量為??。則方差增益:
考慮到?,因此有:?。因此則方差增益:
考慮到總樣本大小?是個恒定值,因此可以去掉??。考慮到??并不隨著結點??的不同劃分而變化因此定義:對于拆分維度??和拆分點?,方差增益為:
-
考慮在?
GOSS?中,在劃分結點??的過程中,可能會隨機丟棄一部分樣本,從而??的樣本總數下降。因此重新定義方差增益: -
在
GOSS?中:- 首先根據樣本的梯度的絕對值大小降序排列。
- 然后選取其中的
top a的樣本作為重要樣本,設其集合為 。則剩下的樣本集合 保留了1-a比例的樣本。 - 在剩下的樣本集合 中,隨機選取總樣本的 比例的樣本保留,設其集合為 。
- 最后將樣本 劃分到子結點中。
重新定義方差增益為:
其中:
-
?表示所有保留的樣本的數量。??分別表示左子結點、右子結點保留的樣本的數量。
-
?分別表示左子結點、右子結點的被保留的重要樣本的集合。
?分別表示左子結點、右子結點的被保留的不重要樣本的集合。
-
?用于補償由于對??的采樣帶來的梯度之和的偏離。
由于??的大小可能遠遠小于?,因此估計??需要的計算量可能遠遠小于估計?。
-
定義近似誤差為:, 定義標準的梯度均值:
則可以證明:至少以概率??滿足:
其中:
- ,刻畫的是剩余樣本集合 中最大梯度的加權值。
- , 刻畫的是未采取
GOSS時,劃分的左子結點的梯度均值、右子結點的梯度均值中,較大的那個。
結論:
-
當劃分比較均衡(即:?) 時,近似誤差由不等式的第二項決定。
此時,隨著樣本數量的增長,使用
GOSS?和原始的算法的誤差逼近于 0 。 -
當??時,
GOSS?退化為隨機采樣。
-
GOSS?的采樣增加了基學習器的多樣性,有助于提升集成模型的泛化能力。
3.1.2 EFB
-
減少樣本特征的傳統方法是:使用特征篩選。
該方式通常是通過?
PCA?來實現的,其中使用了一個關鍵的假設:不同的特征可能包含了重復的信息。這個假設很有可能在實踐中無法滿足。 -
LightBGM?的思路是:很多特征都是互斥的,即:這些特征不會同時取得非零的值。如果能將這些互斥的特征捆綁打包成一個特征,那么可以將特征數量大幅度降低。現在有兩個問題:
- 如何找到互斥的特征。
- 如何將互斥的特征捆綁成一個特征。
3.1.2.1 互斥特征發現
-
定義
打包特征集為這樣的特征的集合:集合中的特征兩兩互斥。給定數據集??,其中樣本??。
如果對每個??,都不會出現??,則特征??和特征??互斥。
-
可以證明:將每個特征劃分到每個
打包特征集中使得打包特征集?的數量最小,這個問題是NP?難的。為了解決這個問題,
LightGBM?采用了一個貪心算法來求解一個近似的最優解。 -
將每個特征視為圖中的一個頂點。
遍歷每個樣本?, 如果特征??之間不互斥(即??),則:
- 如果頂點 之間不存在邊,則在頂點 之間連接一條邊,權重為 1 。
- 如果頂點 之間存在邊,則頂點 之間的邊的權重加 1 。
最終,如果一組頂點之間都不存在邊,則它們是相互互斥的,則可以放入到同一個
打包特征集?中。 -
事實上有些特征之間并不是完全互斥的,而是存在非常少量的沖突。即:存在少量的樣本,在這些樣本上,這些特征之間同時取得非零的值。
如果允許這種少量的沖突,則可以將更多的特征放入
打包特征集中,這樣就可以減少更多的特征。 -
理論上可以證明:如果隨機污染小部分的樣本的特征的值,則對于訓練
accuracy?的影響是:最多影響??。其中??為污染樣本的比例,??為樣本數量 。 -
互斥特征發現算法:
-
輸入:
- 數據集 ,其中樣本 。
- 沖突閾值 。
-
輸出:
打包特征集?的集合? -
算法:
-
構建圖?:
-
每個特征作為一個頂點。
-
遍歷每個樣本??:
-
遍歷所有的特征對??,如果特征??之間不互斥 (即?)則:
- 如果頂點 之間不存在邊,則在頂點 之間連接一條邊,權重為 1 。
- 如果頂點 之間存在邊,則頂點 之間的邊的權重加 1 。
-
-
-
對每個頂點,根據?
degree?(與頂點相連的邊的數量)來降序排列。 -
初始化:
-
根據頂點的排序遍歷頂點:
設當前頂點為??。
-
遍歷?
打包特征集??,計算頂點??與?打包特征集??的沖突值??。如果?, 則說明頂點??與?打包特征集??不沖突。此時將頂點??添加到?打包特征集??中,退出循環并考慮下一個頂點。頂點??與?
bundle?特征集??的沖突值有兩種計算方法:- 計算最大沖突值:即最大的邊的權重:
- 計算所有的沖突值:即所有的邊的權重:
-
如果頂點??未加入到任何一個?
打包特征集?中 ,則:創建一個新的?打包特征集?加入到??中,并將頂點??添加到這個新的?打包特征集?中。
-
-
返回?
-
-
-
互斥特征發現算法的算法復雜度為:?,其中??為樣本總數,?為樣本維數。
- 復雜度主要集中在構建圖 。
- 該算法只需要在訓練之前執行一次。
- 當特征數量較小時,該算法的復雜度還可以接受。當特征數量非常龐大時,該算法的復雜度太高。
- 優化的互斥特征發現算法不再構建圖 ,而是僅僅計算每個特征的非零值。
-
優化的互斥特征發現算法:
-
輸入:
- 數據集 ,其中樣本 。
- 沖突閾值 。
-
輸出:
打包特征集?的集合? -
算法:
-
初始化:所有特征的非零值數量組成的數組?
-
計算每個特征的非零值 (復雜度?) :遍歷所有的特征??、遍歷所有所有的樣本??,獲取特征??的非零值??。
-
根據??對頂點降序排列。
-
初始化:
-
根據頂點的排序遍歷頂點:
設當前頂點為??。
-
遍歷?
打包特征集?,計算頂點??與?打包特征集??的沖突值??。如果?, 則說明頂點??與?打包特征集??不沖突。此時將頂點??添加到?打包特征集??中,退出循環并考慮下一個頂點。頂點??與?
bundle?特征集??的沖突值有兩種計算方法:- 計算最大沖突值:即最大的非零值:
- 計算所有的沖突值:即所有的非零值:
這里簡單的將兩個特征的非零值之和認為是它們的沖突值。它是實際的沖突值的上界。
-
如果頂點??未加入到任何一個?
打包特征集?中 ,則:創建一個新的?打包特征集?加入到??中,并將頂點??添加到這個新的?打包特征集?中。
-
-
返回?
-
-
3.1.2.2 互斥特征打包
-
互斥特征打包的思想:可以從打包的特征中分離出原始的特征。
假設特征?
a?的取值范圍為?[0,10), 特征?b?的取值范圍為?[0,20)?。如果a,b?是互斥特征,那么打包的時候:對于特征?b的值,給它一個偏移量,比如 20。最終打包特征的取值范圍為:
[0,40)。- 如果打包特征的取值在
[0,10), 說明該值來自于特征a。 - 如果打包特征的取值在
[20,40),說明該值來自于特征b。
- 如果打包特征的取值在
-
基于
histogram?的算法需要考慮分桶,但是原理也是類似:將?[0,x]?之間的桶分給特征?a, 將?[x+offset,y]?之間的桶分給特征?b。 其中?offset > 0?。 -
互斥特征打包算法:
-
輸入:
- 數據集 ,其中樣本 。
- 待打包的特征集合 。
-
輸出:打包之后的分桶
-
算法:
-
令??記錄總的分桶數量,??記錄不同的特征的邊界。初始化:?。
-
計算特征邊界:遍歷所有的特征?:
- 獲取特征 的分桶數量 ,增加到 :
- 獲取特征 的分桶邊界:
-
創建新特征,它有??個桶。
-
計算分桶點:遍歷每個樣本??:
-
計算每個特征??:
- 如果 ,則:如果 在特征 的第 個分桶中, 那么在打包后的特征中,它位于桶 中。
- 如果 ,則不考慮。
-
-
-
-
互斥特征打包算法的算法復雜度為?,其中??為樣本總數,?為樣本維數。
-
也可以首先掃描所有的樣本,然后建立一張掃描表,該表中存放所有樣本所有特征的非零值。
這樣互斥特征打包算法在每個特征上僅僅需要掃描非零的樣本即可。這樣每個特征的掃描時間從??降低為?, 其中??為該特征上非零的樣本數。
該方法的缺陷是:消耗更多的內存,因為需要在整個訓練期間保留這樣的一張表。
3.2 優化
-
LightGBM?優化思路:- 單個機器在不犧牲速度的情況下,盡可能多地用上更多的數據。
- 多機并行時通信的代價盡可能地低,并且在計算上可以做到線性加速。
-
LightGBM?的優化:- 基于
histogram的決策樹算法。 - 帶深度限制的
leaf-wise的葉子生長策略。 - 直方圖做差加速。
- 直接支持類別(
categorical) 特征。 - 并行優化。
- 基于
3.2.1 histogram 算法
-
基本思想:先把連續的浮點特征值離散化成??個整數,同時構造一個寬度為??的直方圖。
在遍歷數據時:
- 根據離散化后的值作為索引在直方圖中累積統計量。
- 當遍歷一次數據后,直方圖累積了需要的統計量。
- 然后根據直方圖的離散值,遍歷尋找最優的分割點。
-
優點:節省空間。假設有??個樣本,每個樣本有??個特征,每個特征的值都是 32 位浮點數。
- 對于每一列特征,都需要一個額外的排好序的索引(32位的存儲空間)。則
pre-sorted算法需要消耗 字節內存。 - 如果基于
histogram算法,僅需要存儲feature bin value(離散化后的數值),不需要原始的feature value,也不用排序。而bin value用unit8_t即可,因此histogram算法消耗 字節內存,是預排序算法的 。
- 對于每一列特征,都需要一個額外的排好序的索引(32位的存儲空間)。則
-
缺點:不能找到很精確的分割點,訓練誤差沒有
pre-sorted?好。但從實驗結果來看,?histogram?算法在測試集的誤差和?pre-sorted?算法差異并不是很大,甚至有時候效果更好。實際上可能決策樹對于分割點的精確程度并不太敏感,而且較“粗”的分割點也自帶正則化的效果。
-
采用
histogram?算法之后,尋找拆分點的算法復雜度為:- 構建
histogram: 。 - 尋找拆分點: ,其中 為分桶的數量。
- 構建
-
與其他算法相比:
scikit-learn GBDT、gbm in R使用的是基于pre-sorted的算法。pGBRT使用的是基于histogram的算法。xgboost既提供了基于pre-sorted的算法,又提供了基于histogram的算法。lightgbm使用的是基于histogram的算法。
3.2.2 leaf-wise 生長策略
-
大部分梯度提升樹算法采用
level-wise?的葉子生長策略:
而lightgbm?采用leaf-wise?的葉子生長策略:
-
level-wise?:- 優點:過一遍數據可以同時分裂同一層的葉子,容易進行多線程優化,也好控制模型復雜度,不容易過擬合。
- 缺點:實際上
level-wise是一種低效算法 。它不加區分的對待同一層的葉子,帶來了很多沒必要的開銷:實際上很多葉子的分裂增益較低,沒必要進行搜索和分裂。
-
leaf-wise:是一種更為高效的策略。每次從當前所有葉子中,找到分裂增益最大的一個葉子來分裂。-
優點:同
level-wise?相比,在分裂次數相同的情況下,leaf-wise?可以降低更多的誤差,得到更好的精度。 -
缺點:可能會長出比較深的決策樹,產生過擬合。
因此?
lightgbm?在?leaf-wise?之上增加了一個最大深度限制,在保證高效率的同時防止過擬合。
-
3.2.3 直方圖做差加速
-
通常構造直方圖,需要遍歷該葉子上的所有數據。但是事實上一個葉子的直方圖可以由它的父親結點的直方圖與它兄弟的直方圖做差得到。
LightGBM?在構造一個葉子的直方圖后,可以用非常微小的代價得到它兄弟葉子的直方圖,在速度上可以提升一倍。
3.2.4 直接支持 categorical 特征
-
通常對
categorical?特征進行one-hot?編碼,但是這個做法在決策樹學習中并不好:對于取值集合較多的categorical feature,學習到的樹模型會非常不平衡;樹的深度需要很深才能達到較高的準確率。LightGBM?直接支持categorical?特征。(因為基于直方圖 所有天然的 每個值就是一個分桶)
3.2.5 并行優化
3.2.5.1 特征并行
-
傳統的特征并行算法主要體現在決策樹中的最優拆分過程中的并行化處理:
- 沿特征維度垂直劃分數據集,使得不同機器具有不同的特征集合。(多機子)
- 在本地數據集中尋找最佳劃分點:
(劃分特征,劃分閾值)。 - 將所有機器上的最佳劃分點整合,得到全局的最佳劃分點。
- 利用全局最佳劃分點對數據集進行劃分,完成本次最優拆分過程。
-
LightGBM?在特征并行上進行了優化,流程如下:-
每個機器都有全部樣本的全部特征集合。
-
每個機器在本地數據集中尋找最佳劃分點:
(劃分特征,劃分閾值)?。但是不同的機器在不同的特征集上運行。
-
將所有機器上的最佳劃分點整合,得到全局的最佳劃分點。
-
利用全局最佳劃分點對數據集進行劃分,完成本次最優拆分過程。
-
-
LightGBM?不再沿特征維度垂直劃分數據集,而是每個機器都有全部樣本的全部特征集合。這樣就節省了數據劃分的通信開銷。- 傳統的特征并行算法需要在每次最優拆分中,對數據劃分并分配到每臺機器上。
LightGBM特征并行算法只需要在程序開始時,將全量樣本拷貝到每個機器上。
二者交換的數據相差不大,但是后者花費的時間更少。
-
LightGBM?的特征并行算法在數據量很大時,仍然存在計算上的局限。因此建議在數據量很大時采用數據并行。
3.2.5.2 數據并行
-
傳統的數據并行算法主要體現在決策樹的學習過程中的并行化處理:
- 水平劃分數據集,使得不同機器具有不同的樣本集合。
- 以本地數據集構建本地直方圖
- 將本地直方圖整合為全局直方圖
- 在全局直方圖中尋找最佳劃分點。
-
LightGBM?在數據并行上進行了優化,流程如下:LightGBM使用Reduce scatter的方式對不同機器上的不同特征進行整合。每個機器從本地整合直方圖中尋找最佳劃分點,并同步到全局最佳劃分點中。LightGBM通過直方圖做差分加速。
20210113
案例
GBDT算法原理以及實例理解_Freemanzxp-CSDN博客_gbdt算法
gbdt詳解_kyle1314608的博客-CSDN博客_gbdt
重點
gbdt 的算法的流程?
gbdt 如何選擇特征 ?
gbdt 如何構建特征 ?
gbdt 如何用于分類?
gbdt 通過什么方式減少誤差 ?
gbdt的效果相比于傳統的LR,SVM效果為什么好一些 ?
gbdt 如何加速訓練?
gbdt的參數有哪些,如何調參 ?
gbdt 實戰當中遇到的一些問題 ?
gbdt的優缺點 ? 機器學習算法GBDT - Alexander - 博客園
今天是周末,之前給自己定了一個小目標:每周都要寫一篇博客,不管是關于什么內容的都行,關鍵在于總結和思考,今天我選的主題是梯度提升樹的一些方法,主要從這些方法的原理以及實現過程入手講解這個問題。
本文按照這些方法出現的先后順序敘述。
GBDT
梯度提升樹實在提升樹的基礎上發展而來的一種使用范圍更廣的方法,當處理回歸問題時,提升樹可以看作是梯度提升樹的特例(分類問題時是不是特例?)。 因為提升樹在構建樹每一步的過程中都是去擬合上一步獲得模型在訓練集上的殘差。后面我們將會介紹,這個殘存正好是損失函數的梯度,對應于GBDT每一步要擬合的對象。
主要思想
在目標函數所在的函數空間中做梯度下降,即把待求的函數模型當作參數,每一步要擬合目標函數關于上一步獲得的模型的梯度,從而使得參數朝著最小化目標函數的方向更新。
一些特性
- 每次迭代獲得的決策樹模型都要乘以一個縮減系數,從而降低每棵樹的作用,提升可學習空間。
- 每次迭代擬合的是一階梯度。
XGBoost
XGBoost 是GBDT的一個變種,最大的區別是xgboost通過對目標函數做二階泰勒展開,從而求出下一步要擬合的樹的葉子節點權重(需要先確定樹的結構),從而根據損失函數求出每一次分裂節點的損失減小的大小,從而根據分裂損失選擇合適的屬性進行分裂。
這個利用二階展開的到的損失函數公式與分裂節點的過程是息息相關的。先遍歷所有節點的所有屬性進行分裂,假設選擇了這個a屬性的一個取值作為分裂節點,根據泰勒展開求得的公式可計算該樹結構各個葉子節點的權重,從而計算損失減小的程度,從而綜合各個屬性選擇使得損失減小最大的那個特征作為當前節點的分裂屬性。依次類推,直到滿足終止條件。
一些特性
- 除了類似于GBDT的縮減系數外,xgboost對每棵樹的葉子節點個數和權重都做了懲罰,避免過擬合
- 類似于隨機森林,XGBoost在構建樹的過程中,對每棵樹隨機選擇一些屬性作為分裂屬性。
-
分裂算法有兩種,一種是精確的分裂,一種是近似分裂算法,精確分裂算法就是把每個屬性的每個取值都當作一次閾值進行遍歷,采用的決策樹是CART。近似分裂算法是對每個屬性的所有取值進行分桶,按照各個桶之間的值作為劃分閾值,xgboost提出了一個特殊的分桶策略,一般的分桶策略是每個樣本的權重都是相同 的,但是xgboost使每個樣本的權重為損失函數在該樣本點的二階導(泰勒展開不應該是損失函數關于模型的展開嗎?為什么會有在該樣本點的二階導這種說法? 因為模型是對所有樣本點都通用的,把該樣本輸入到二階導公式中就可以得到了)。
-
xgboost添加了對稀疏數據的支持,在計算分裂收益的時候只利用沒有missing值的那些樣本,但是在推理的時候,也就是在確定了樹的結構,需要將樣本映射到葉子節點的時候,需要對含有缺失值的樣本進行劃分,xgboost分別假設該樣本屬于左子樹和右子樹,比較兩者分裂增益,選擇增益較大的那一邊作為該樣本的分裂方向。
-
xgboost在實現上支持并行化,這里的并行化并不是類似于rf那樣樹與樹之間的并行化,xgboost同boosting方法一樣,在樹的粒度上是串行的,但是在構建樹的過程中,也就是在分裂節點的時候支持并行化,比如同時計算多個屬性的多個取值作為分裂特征及其值,然后選擇收益最大的特征及其取值對節點分裂。
-
xgboost 在實現時,需要將所有數據導入內存,做一次pre-sort(exact algorithm),這樣在選擇分裂節點時比較迅速。
缺點
- level-wise 建樹方式對當前層的所有葉子節點一視同仁,有些葉子節點分裂收益非常小,對結果沒影響,但還是要分裂,加重了計算代價。
- 預排序方法空間消耗比較大,不僅要保存特征值,也要保存特征的排序索引,同時時間消耗也大,在遍歷每個分裂點時都要計算分裂增益(不過這個缺點可以被近似算法所克服)
lightGBM
Features · microsoft/LightGBM Wiki · GitHub
關于lightGBM的論文目前并沒有放出來,只是從網上一些信息得出以下的一些與xgboost不同的地方:
-
3、max_depth[默認6]
表示樹的最大深度。也是用來避免過擬合的。當它的值越大時,模型會學到更具體更局部的樣本,可能會導致過擬合。需要使用CV函數來進行調優。 典型值:3-10
4、max_leaf_nodes
表示樹上最大的節點或葉子的數量。可以替代max_depth的作用。因為如果生成的是二叉樹,一個深度為n的樹最多生成n2個葉子。??
-
xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,區別是xgboost對每一層所有節點做無差別分裂,可能有些節點的增益非常小,對結果影響不大,但是xgboost也進行了分裂,帶來了務必要的開銷。 leaft-wise的做法是在當前所有葉子節點中選擇分裂收益最大的節點進行分裂,如此遞歸進行,很明顯leaf-wise這種做法容易過擬合,因為容易陷入比較高的深度中,因此需要對最大深度做限制,從而避免過擬合。
-
lightgbm使用了基于histogram的決策樹算法,這一點不同與xgboost中的 exact 算法,histogram算法在內存和計算代價上都有不小優勢。
-. 內存上優勢:很明顯,直方圖算法的內存消耗為(#data* #features * 1Bytes)(因為對特征分桶后只需保存特征離散化之后的值),而xgboost的exact算法內存消耗為:(2 * #data * #features* 4Bytes),因為xgboost既要保存原始feature的值,也要保存這個值的順序索引,這些值需要32位的浮點數來保存。
-. 計算上的優勢,預排序算法在選擇好分裂特征計算分裂收益時需要遍歷所有樣本的特征值,時間為(#data),而直方圖算法只需要遍歷桶就行了,時間為(#bin) -
直方圖做差加速
-. 一個子節點的直方圖可以通過父節點的直方圖減去兄弟節點的直方圖得到,從而加速計算。 -
lightgbm支持直接輸入categorical 的feature
-. 在對離散特征分裂時,每個取值都當作一個桶,分裂時的增益算的是”是否屬于某個category“的gain。類似于one-hot編碼。 -
但實際上xgboost的近似直方圖算法也類似于lightgbm這里的直方圖算法,為什么xgboost的近似算法比lightgbm還是慢很多呢?
-. xgboost在每一層都動態構建直方圖, 因為xgboost的直方圖算法不是針對某個特定的feature,而是所有feature共享一個直方圖(每個樣本的權重是二階導),所以每一層都要重新構建直方圖,而lightgbm中對每個特征都有一個直方圖,所以構建一次直方圖就夠了。
-. lightgbm做了cache優化? -
lightgbm哪些方面做了并行?
-. feature parallel
一般的feature parallel就是對數據做垂直分割(partiion data vertically,就是對屬性分割),然后將分割后的數據分散到各個workder上,各個workers計算其擁有的數據的best splits point, 之后再匯總得到全局最優分割點。但是lightgbm說這種方法通訊開銷比較大,lightgbm的做法是每個worker都擁有所有數據,再分割?(沒懂,既然每個worker都有所有數據了,再匯總有什么意義?這個并行體現在哪里??)
-. data parallel
傳統的data parallel是將對數據集進行劃分,也叫 平行分割(partion data horizontally), 分散到各個workers上之后,workers對得到的數據做直方圖,匯總各個workers的直方圖得到全局的直方圖。 lightgbm也claim這個操作的通訊開銷較大,lightgbm的做法是使用”Reduce Scatter“機制,不匯總所有直方圖,只匯總不同worker的不同feature的直方圖(原理?),在這個匯總的直方圖上做split,最后同步。?? -
??GBDT算法原理以及實例理解_Freemanzxp-CSDN博客_gbdt算法? gbdt原理和案例
-
xgboost重要參數1_kyle1314608的博客-CSDN博客?xgboost 參數1
-
??xgboost重要參數2為主但不全要參照1_kyle1314608的博客-CSDN博客? ?xgboost 參數2
-
3、max_depth[默認6]
表示樹的最大深度。也是用來避免過擬合的。當它的值越大時,模型會學到更具體更局部的樣本,可能會導致過擬合。需要使用CV函數來進行調優。 典型值:3-10
4、max_leaf_nodes
表示樹上最大的節點或葉子的數量。可以替代max_depth的作用。因為如果生成的是二叉樹,一個深度為n的樹最多生成n2個葉子。
-
二者可以任選其一
-
總結
以上是生活随笔為你收集整理的梯度提升决策树(GBDT)与XGBoost、LightGBM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Conv1D和Conv2D的区别
- 下一篇: 机器学习——标准化/归一化的目的、作用和