尊重原創
來源: https://blog.csdn.net/a790209714/article/details/78086867
XGBoost的四大改進:
①改進殘差函數
不用Gini作為殘差,用二階泰勒展開+樹的復雜度(正則項)
帶來如下好處:
1.可以控制樹的復雜度
2.帶有關於梯度的更多信息,獲得了二階導數
3.可以用線性分類器
②采用預排序
因為每一次迭代中,都要生成一個決策樹,而這個決策樹是殘差的決策樹,所以傳統的不能並行
但是陳天奇注意到,每次建立決策樹,在分裂節點的時候,比如選中A特征,就要對A進行排序,再計算殘差,這個花很多時間
於是陳天奇想到,每一次殘差計算好之后,全部維度預先排序,並且此排序是可以並行的,並行排序好后,對每一個維度,計算一次最佳分裂點,求出對應的殘差增益
於是只要不斷選擇最好的殘差作為分裂點就可以。
也就是說,雖然森林的建立是串行的沒有變,但是每一顆樹枝的建立就變成是並行的了,帶來的好處:
1.分裂點的計算可並行了,不需要等到一個特征的算完再下一個了
2.每層可以並行:
當分裂點的計算可以並行,對每一層,比如分裂了左兒子和右兒子,那么這兩個兒子上分裂哪個特征及其增益也計算好了
同時:
③Shrinkage(縮減)
相當於學習速率(XGBoost中的eta)。XGBoost在進行完一次迭代時,會將葉子節點的權值乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。(GBDT也有學習速率)
④列抽樣
XGBoost借鑒了隨機森林的做法,支持列抽樣,不僅防止過 擬合,還能減少計算。
LightGBM,3點優化:
①采用基於Histogram的決策樹算法
把每個特征做轉化成int,並用這個int作為直方圖的index,如果某一個特征值的值為ki,就在直方圖橫軸=ki的地方,增加1的高度
最后根據直方圖進行分裂
帶來的好處:
1.不用計算分裂增益
2.只消耗很少的內存,解決xgboost為了排序需要把特征都加進內存需要巨大的空間
②帶深度限制的Leaf-wise的葉子生長策略。
直接找到分裂增益最大的葉子,按層優先不斷分裂
1.提高精度降低誤差
2.減少Level-wise非常非常的無用葉子的分裂
3.因為特征的訪問順序相同,就可以提高cache優化,意味着CPU可以為下一次會采用的特征預先做預讀取
③用histogram 做差加速
一個容易觀察到的現象:一個葉子的直方圖可以由它的父親節點的直方圖與它兄弟的直方圖做差得到
也就是說下一次分裂的時候不需要計算分裂增益,直接計算一個大兒子,另一個小兒子的直方圖就是父親減去大兒子的差
1.進一步優化