xgboost 正则项_深入理解Boosting算法(4)-XGBoost
本文大綱如下:
- GBDT模型訓練復雜度分析
- 正則化的損失函數(總)
- 第次迭代的損失函數(分)
- 從損失函數到樹的評分函數
- 特征最優切分點算法
- 稀疏特征處理方式
GBDT模型訓練復雜度分析
對于神經網絡模型,可以通過利用mini-batch的形式將數據小批量地輸入進行模型訓練,而對于傳統的機器學習模型,如GBDT模型在一次訓練過程中需要使用整個訓練數據集,而且在構建樹的過程中還需要對整個數據集進行多輪的遍歷,因此從近幾年才發表的XGBoost, LightGBM的引用論文中就可以發現,從1998年開始,就有很多論文在開始研究如何在大規模數據下高效訓練模型的方法。 在GBDT訓練過程中,最耗時的部分在于回歸樹的構建過程中最優分裂特征,分裂閾值的查找過程。目前主要有以下幾大類方式:
- 特征預排序: 對特征的取值進行預先排序,枚舉出可能的分裂點,如使用貪心算法進行枚舉(并不高效,但是可以找到最優分裂點),或者利用特征的分位點進行近似的近似算法等(XGBoost中使用的方式,本文將進行介紹);
- 基于特征直方圖:對于連續型的特征將其進行離散化,得到特征的離散取值(bin),用于構建關于特征信息的(一階導數,二階導數)直方圖;使用直方圖的優勢在于可以不需要對特征進行排序,畢竟排序算法很耗時的, 在LightGBM算法中將進行詳細介紹該方法。
?關于計算復雜度的簡單計算,如果利用
表示樣本個數, 表示特征個數,特征被切分的bin的個數為, 那么在對于特征預排序算法其復雜度為 , 查找最佳分裂點的復雜度為, 而對于基于特征直方圖的方式,在構建直方圖時的復雜度為,查找最佳分裂點的復雜度為, 很顯然 遠遠小于 。有了上述的復雜度的基本認識,就知道從哪些方向進行優化,如如何在訓練過程中減少訓練樣本,以及減少特征個數等,在LightGBM里面將詳細介紹(hmm, 咋一直跑題)。為了保證更好的理解以及以后方便查閱,本文搞了很多公式,但是機器學習里面的公式都是加加減減,多看幾遍就真香了,本文包含的內容:
- XGBoost在損失函數上的設計,從整個模型的損失計算到第次迭代過程的推導計算;
- XGBoost最優特征分裂方式,增益計算
- XGBoost針對稀疏特征的學習方式
本文不包含系統設計,雖然大規模機器學習系統是一個很有魅力的方向,對其中涉及到的分布式算法,通信等復雜問題需要補上N篇論文才能說的清楚,有興趣的同學可以參考這個鏈接進行學習(https://github.com/mercari/ml-system-design-pattern)。
正則化的損失函數(總)
XGBoost是Boosting算法家族中的一員,因此其形式上也是有
個基模型組成的一個加法模型,對于給定的個樣本個特征的的數據集, 其預測過程如下公式所示:其中的假設空間中的所有CART回歸樹模型
可以表示為。從公式表述中可以知道,單顆樹有兩部分信息組成:- 樹的結構(樹的深度,葉子節點個數)以及特征分裂閾值,
- 葉子節點的權重(特別說明GBDT,XGBoost等使用的回歸樹,因為葉子節點存在權重信息)
單顆樹的結構由符號
表示,它按照樹的結構,將輸入離散化映射到個葉子節點之中某一個上,因此的輸出是葉子節點的索引編號值,個葉子節點的權重數組用表示。有了上述定義符號表示,就要介紹XGBoost中使用的正則化的損失函數了,相比GBDT模型,引入了正則項用于防止過擬合,其形式如下所示(其實很早就有了類似的思想):
從損失函數上不難理解,在給定
個樹模型之后,只需要利用可微分的損失函數計算樣本的預測值與真實的差異之和, 再利用顆樹計算樹的正則項部分,正則項主要有兩部分構成:- 葉子節點權重的范數,目的是使得權重值更平滑,連續;
- 葉子節點的個數,在XGBoost中樹的生長方式是Level-wise的方式,每一層都需要同時進行分裂,有可能導致不必要的特征參與分裂,如下圖對比所示(后續的文章中會加入LigthGBM的原理,會有更詳細的對比)
圖1:兩種決策樹生長方式
第
次迭代的損失函數(分)假設在完成第
次迭代后,即前顆樹的結構以及參數都是已知的了,根據前向分步加法,下一次迭代時即次,模型對于樣本的預測值為:此時,將損失函數
可以展開從以下形式,完成了在第
顆樹學習時的損失函數推導; 細節信息如下:從損失函數到樹的評分函數
眾所周知,XGBoost利用二階泰勒展開來近似表示第
次迭代的損失函數,回憶一下泰勒公式的二階展開公式, 把函數在點處進行泰勒二階展開,可以得到如下形式:將上述公式與XGBoost的在第
次迭代的損失函數進行對比,一一對應起來,如下表所示(可以忽略損失函數中的項,畢竟它一直是個常數,真實的標簽值)因此,可以定義損失函數
在 出的一階導數為, 二階導數為, (如果你有疑問為啥是對求導數,參考泰勒公式,其對應的是),因此,我們可以將損失函數進一步展開,上述公式中,常數
,以及也為常數,同時都是已知數,公式中只有為未知數,表示在樣本劃分過程中,落在相同葉子節點的樣本, 而目標是最小化, 根據一元函數的求極值得過程,只要讓其導數為0即可,即可求出,最優值為:
將
帶回損失函數(6)中,得到如下損失函數的顯示表達式(將常數部分去除),有了該公式,我們可以用于評價生成的樹的得分,得分越小,說明樹的結構越好。到目前為止,我們知道了葉子節點的最優取值(解析解),以及最小的損失函數取值,然而,仔細回顧一下,我們還沒有確定樹的結構,公式也沒有告訴我們該怎么得到最優的樹的結構,下面部分將解答該問題。
特征最優切分點算法
樹長成啥樣還不知道,我們只是有了評價樹結構好不好的公式。最近簡單的辦法,就是暴力枚舉所有可能的結構,但這肯定是不能被接受的。那就要貪心法上場了,每次嘗試分裂一個節點,計算分裂前后的增益,選擇增益最大的那次分裂即可,依次循環下去。注意,貪心法不是XGBoost才有,從最經典的ID3,C4.5,CART樹開始就有了,只不過,其使用的評估指標不一樣而已;
- ID3, 信息增益
- C4.5, 信息增益比
- CART, Gini系數,平方損失
- XGboost, 由一階導數,二階導數構成的打分函數
如果對這部分知識點有點疑問,可以參考此前的文章中關于回歸樹的生長分裂過程。在XGboost中具體實現中,有兩種特征切分點算法, 貪心法和近似算法。
貪心算法
對一個特征最佳特征分裂閾值的選擇,是用分裂之前的評估指標值,減去分裂后的值,找到增益最大的,即完成本次分裂搜索,對于XGboost而言,一次分裂之后,會將該節點上的樣本劃分到兩個不相交的樣本空間, 用
, 分別表示分布在右子樹的樣本,左子樹的樣本, 表示該節點上總的樣本個數,因此,我們可以用符號分別表示左,右節點兩側的一階導數之和,二階導數之和每次特征分裂的增益計算: 分裂前:
分裂后:
所以,分裂之后的增益為:
貪心算法的流程如下圖所示:
貪心算法對每個特征都做線性搜索,根據樣本特征的排序值,逐步將更多的樣本加入到左子樹,根據增益函數得到的最大的點,即為最優的分割點。 步驟:
近似算法
由于貪心算法需要對每個特征進行排序,因此成為計算速度的瓶頸。近似算法就是根據特征的分布提前計算得到
個分位點,, 有了這些分位點,就可以將樣本映射到對應的區間內,然后再次聚合區間內的信息,得到所有區間的最佳分裂點。很直觀, 這種方式免去了貪心算法需要多次對每個特征進行排序的操作。從算法流程圖中,可以看到,第一步是提前計算,或者每次分裂的時候計算各個特征的分位點,而在第二個for循環中,是分別為每個特征,統計得到落在各個區間的樣本的一階導數和二階導數匯總起來,得到對應區間的
。對比一下貪心算法中的第二個for循環,是在樣本級別統計分在當前節點的左,右子樹的一階導數和二階導之和;有了這樣的比較,相信你很快就感受到了這樣的操作對于提升速度無疑是起到了幫助。 下圖,是從網上找到一張示意圖, 用于直觀的描述近似算法是如何找到最佳分裂點的過程;簡單總結貪心算法與近似算法
論文中也對兩種的算法的精度做了比較,這里先不贅述
補充:常用損失函數的一階導數,二階導數推導
以下對平方損失函數,對數損失函數進行求導:
- 平方損失函數
- 損失函數為對數損失
對數損失函數的一階導數,以及二階導數的的推導,由于對數損失函數是有兩部分組成,因此在二分類時(
),可以分情況進行求導:當時,當時,
而對于二階導數,只需要在對
求導即可,從上述結果可以看出,不論 或者,求導的結果是一樣的,再次回憶一下對sigmoid函數的求導,即可得到我們的結果:稀疏特征處理方式
所謂的稀疏特征就是特征
中存在大量的缺失值,或者取值為0的樣本占大多數(可能來源于數據本身,或者對類別型特征進行onehot編碼之后出現大量取值為0的特征),數據中如果存在這樣的模式,對于訓練來講可能存在著大量的信息,因此利用算法捕捉這樣的模式對于提升模型的區分能力有著重要的幫助。 在XGBoost中,在每個節點分裂時,額外增加了一個針對缺失特征的分裂方向的判斷,即對于存在取值缺失的樣本,應該被分裂到左子樹,還是右子樹的判斷,如下圖所示得到的最終結果:至于各個特征應該往哪個方向偏,也是利用數據進行訓練得到的,選擇增益最大的方向, 訓練過程如下圖所示(以特征
為例),在訓練的過程中,可以將稀疏特征處理方式和非稀疏特征整合在一起。
本系列其他文章:
質數:深入理解Boosting算法(1)-基礎知識回顧?zhuanlan.zhihu.com質數:深入理解Boosting算法(2)-AdaBoost?zhuanlan.zhihu.com質數:深入理解Boosting算法(3)-GBDT?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的xgboost 正则项_深入理解Boosting算法(4)-XGBoost的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两次结果的绝对差值_多图示例:如何呈现论
- 下一篇: linux 指令tftp传输文件_Lin