競賽大殺器:樹模型與集成學習

原創(chuàng):晏茜
資料來源:Mozak

競賽無論對于在校生亦或是在職的同學,都是一種非常好的學習方式。為什么數(shù)據(jù)人才要參加競賽呢?首先,Kaggle,天池,百度的飛槳等競賽平臺為數(shù)據(jù)人才提供了優(yōu)質的競賽環(huán)境;其次,競賽是符合國家政策導向的,2021年《十四個五年規(guī)劃和 2035 年遠景目標綱要》中明確提出,強化國家戰(zhàn)略科技力量,加快數(shù)字化發(fā)展的發(fā)展目標;除此之外,面對社會對數(shù)據(jù)人才的廣泛需求,數(shù)據(jù)人才更應緊跟技術發(fā)展與產業(yè)升級的腳步,了解競賽對于個人成長與發(fā)展的價值,積極參與競賽。

本文主要圍繞樹模型與集成學習的相關內容展開講解,旨在為想要參加競賽或希望提高競賽分數(shù)的同學提供一定的技術指導。

1. 集成學習介紹

1.1 集成學習是什么?

集成學習(Ensemble Learning)是集合多個學習算法以提高模型的效果,是機器學習中重要的一類方法。很多高階機器學習模型(隨機森林、XGBoost)和深度學習都包含了集成學習思想。

那么集成學習到底是什么呢?集成學習其實是一類機器學習的算法,你可以把它理解為一種訓練思路,而并不是某一個單獨的算法。集成學習的一個關鍵點就在于它集合了多個學習算法。如果我們有了多個模型,每個模型有它各自的多樣性,通過集成學習,我們能夠得到一個更好的精度。

1.2 集成學習有哪些分支?

集成學習在我們的日常生活是十分常見的,比如投票選班長或者通過多次搖骰子來進行投票,其實都體現(xiàn)了集成學習的思想。常見的集成學習類型有 Bagging、Boosting、Stacking 三種。這里會逐一為大家介紹這三種集成學習的類型。

Bagging

我們在學習機器學習基礎的時候,在教材中,比如周志華的西瓜書,都會講到 Bagging 這種集成學習的類型。Bagging 基于“民主”的集成思路,并行訓練多個模型。這里的“民主”是什么意思呢?是每個機學習器都是相互平等的。而正是由于我們的機器學習的平等獨立的特性,才使得 Bagging 能夠進行并行的訓練,不需要做串行的訓練。Bagging 的用法是在訓練過程中訓練多個模型,然后對預測結果進行集成。Bagging 的優(yōu)點是可以減少誤差中的方差項(variance),它能夠降低模型預測結果的誤差。它的缺點是增加了時間的開銷,且需要模型具備多樣性,由于是并行訓練,它需要有較大的計算資源,而如果我們的模型不具備多樣性的話,最終得到的結果也會不盡如人意。

關鍵點:多個模型如何保證多樣性?

方法1:每次采樣得到參與訓練的樣本(行采樣)

方法2:每次采樣得到參與訓練的字段(列采樣)

方法3:每次對模型的超參數(shù)進行修改

Boosting

Boosting 基于“精英”篩選的思路,串行訓練多個模型?!熬ⅰ敝杆皇且粋€“民主”的,而是一個篩選的過程,類似于進化的過程。Boosting 在其訓練過程中,它的模型是基于上一輪的模型進行繼續(xù)擬合的,模型與模型之間是串行的過程,它們之間是相互依賴的。Boosting 的優(yōu)點是可以減少偏差(bias),它主要是減少誤差中的偏差項。而由于在它在進行訓練的過程中,是不斷的學習上一輪模型的殘差的,所以 Boosting 其實是容易過擬合的。

關鍵點:如何基于上一輪模型進行繼續(xù)學習?

方法1:對錯誤樣本調整權重

方法2:擬合上一輪模型預測值的誤差

Stacking

Stacking 是基于“標簽”學習的思路,堆疊多個模型。Stacking 通過交叉驗證的方法對訓練集進行訓練和預測,并以此進行二次學習。它的優(yōu)點是能夠結合不同類型的模型來完成學習,它的缺點是它的時間開銷是非常大的,并且非常容易過擬合。

關鍵點:模型如何利用交叉驗證訓練?

什么是交叉驗證呢?交叉驗證(Cross Validation)是在競賽的過程中經常會用到的一種操作。在競賽的過程中,具體的數(shù)據(jù)集有 train set 和 test set,在 train set 上構建一個模型,在 test set 上做一個預測,然后去提交打分。原始的數(shù)據(jù)集可能只有這兩部分。但是在進行訓練的過程中,我們可能還會劃分一部分出來,我們會把 train set 再拆分成一個 training set 和一個 validation set,也就是說我們會劃分出一個驗證集出來,因為有了驗證集我們就可以做一個 Stacking。無論是競賽的過程中,還是在機器學習的學習過程中,一個關鍵點是驗證集應該如何劃分。驗證集主要有兩種劃分方法。第一種是 hold out 流出法,或者稱為按照比例進行劃分的流出法,比如說 75% 的比例進行訓練,25% 的比例進行驗證。第二種是 KFold,KFold 是指我們在進行具體的數(shù)據(jù)劃分的時候,可以把數(shù)據(jù)集劃分成 k 份。比如我們將數(shù)據(jù)集劃分成 5 份,我們首先將第 1 份看作驗證集,其他 4 份看作訓練集,記作 fold 1,然后將第 2 份看作驗證集,其他 4 份看作訓練集,記作 fold 2,以此類推,我們可以循環(huán) 5 次,最終得到 5 個模型。

那么我們來看一看如圖所示的 Stacking 的思路,它與我們的交叉驗證有什么樣的共同點和區(qū)別呢?

5 折交叉驗證

在此模型進行訓練的過程中,仍是將我們的數(shù)據(jù)集劃分成 5 份,藍色部分是訓練集,橙色部分是驗證集。訓練了一個模型之后,我們可以對它的驗證集進行預測。當訓練完全部的五個模型之后,我們可以將模型預測的結果進行拼接。也就是說,一個模型的具體的預測結果是可以拆分成兩部分的,一部分是對驗證集的預測結果,另一部分是對測試集的預測結果,我們可以將驗證集的預測結果拼接到一起,這個拼接到一起的預測結果與我們的原始訓練集的維度是一樣大的,這個特征叫做 out-of-fold 特征,它是可以當做一個新的特征的。在具體的操作過程中,我們可以得到模型對訓練集的預測結果,以及對測試集的預測結果,這樣就相當于是新增加了一類的特征,這一類的特征我們是可以用來做新的建模的。一個模型通過 5 折交叉驗證可以增加一個特征,如果是 n 個模型,就可以增加 n 個特征。那么我們在進行二次學習的時候,就可以用我們的新的模型去將我們的 n 個特征和我們的真實標簽再去進行一個二次學習。這就是一個基礎的 Stacking 的思路。

總結

Bagging 是從數(shù)據(jù)的角度得到多樣性。

Boosting 是一個串行的過程,也就是串行的迭代。

Stacking 就是做一個二次學習,我們將 K-NN,Decision Tree 以及 SVM 的預測結果進行一個二次學習,再用一個模型對它的預測結果進行具體的學習。

2. 樹模型與集成學習

樹模型是非常好的基學習器(弱學習器)。

如何結合多顆樹完成模型構建呢?

Random Forest: Bagging + Decision Tree

GBDT: Gradient Boost + Decision Tree

將樹模型和集成學習進行結合的想法是可行的。比如,如果我們將 Bagging 和 Decision Tree 思路進行結合,在進行訓練的時候,我們訓練多棵樹,每棵樹使用具體的不同的數(shù)據(jù),那么這樣就是隨機森林的思路。如果我們將 Gradient Boost 和 Decision Tree 思路進行結合,那么就是 GBDT 的思路。

隨機森林是基于 Bagging 的思路,對數(shù)據(jù)集進行有放回的采樣,構建不同的數(shù)據(jù)集,然后從數(shù)據(jù)集里面訓練得到不同的模型,最終完成投票,或者是加權求和。

在競賽的過程中,我們一般情況下是不會去使用隨機森林,我們現(xiàn)在會直接使用比較高階的一些樹模型,比如 XGBoost,LightGBM 或 CatBoost。

LightGBM 的貢獻

LightGBM 的特點或貢獻主要有如下幾點。

單邊梯度抽樣算法;

直方圖算法;

互斥特征捆綁算法;

深度限制的 Leaf-wise 算法;

類別特征最優(yōu)分割;

特征并行和數(shù)據(jù)并行;

緩存優(yōu)化。

LightGBM 的貢獻:單邊梯度抽樣算法

對樣本進行采樣,選擇部分梯度小的樣本;

讓模型關注梯度高的樣本,減少計算量。

首先來看單邊梯度抽樣算法,我們在進行訓練的過程中,可能會計算具體的邏輯 function,然后可以得到具體的梯度信息。我們在進行選擇的過程中,會剔除梯度比較小的樣本,也就是說,我們會讓模型關注梯度比較高的一些樣本,這樣可以減少模型的計算量,加速訓練。

如圖是來自于原始論文中的 LightGBM 的偽代碼,它的具體的特征是由梯度比較強的一部分樣本和梯度比較弱的一部分樣本這兩部分組成的。

LightGBM 的貢獻:直方圖算法

將連續(xù)特征離散化,用直方圖統(tǒng)計信息;

對內存、速度都友好。

第二個是直方圖算法,它是 LightGBM 提出伊始的一種非常驚艷的算法。在使用樹模型的時候,我們的類別特征需不需要做 onehot 呢?其實在 LightGBM 被提出來之前,一般情況還是建議做 onehot 的,也就是說,在使用 XGBoost 的時候,是建議做 onehot 然后再做訓練的。但是現(xiàn)在 LightGBM 的原始論文中使用了直方圖的算法來將連續(xù)特征做離散化。在 2017 年第一版本的 LightGBM 提出的時候,它的直方圖的算法已經比 XGBoost 快很多了。

LightGBM 直方圖算法的連續(xù)特征離散化特征,是將具體的連續(xù)特征用直方圖去做一個相當于分箱的過程。分箱是把具體的連續(xù)分布劃分成不同的單元格,然后從單元格的角度去進行節(jié)點的劃分。如圖是它的具體的偽代碼。

它的偽代碼對于每個特征去構建一個直方圖,然后再去從直方圖里面找到最優(yōu)的分裂節(jié)點。

LightGBM 的貢獻:互斥特征捆綁算法

使用互斥捆綁算法將特征綁定,降低復雜度;

將特征綁定視為圖著色問題,計算特征之間的沖突值;

將特征增加增加偏移量,然后一起相加分桶。

LightGBM 也支持互斥捆綁的過程。我們在進行迭代的過程中,其實是可以將特征進行綁定,以此來降低模型的復雜度的。但是在綁定的過程中,其實是有一個搜索過程的,LightGBM 把搜索過程視為圖著色問題,然后去計算特征之間的沖突值。LightGBM 將兩個特征的直方圖進行相加,組成為一個新的直方圖,然后在新的直方圖中找到分裂節(jié)點,它的核心的仍然是基于直方圖的操作。

LightGBM 的貢獻:深度限制的 Leaf-wise 算法

每次分裂增益最大的葉子節(jié)點,直到達到停止條件;

限制樹模型深度,每次都需要計算增益最大的節(jié)點;

LightGBM 還有一個貢獻就在于它是基于 Leaf-wise 的節(jié)點分裂。我們在進行節(jié)點分裂的過程中,會設置樹模型的最大深度,這是我們在一些機器學習模型里面需要設置的超參數(shù)。LightGBM 在分裂的過程中,不是逐層進行具體的劃分的,它是在進行節(jié)點分裂的過程中,選擇分裂增益最大的葉子節(jié)點,然后再進行分裂,而且它限制了具體的樹模型的深度,這樣能夠避免模型的過擬合。

以上是關于樹模型與集成學習的介紹,歡迎批評指正。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容