lightgbm 保存模型 过大_机器学习之12—Lightgbm
Lightgbm模型和GBDT以及XGboost一樣,都是基于決策樹的boosting集成模型;
Lightgbm是一個快速高效、低內(nèi)存占用、高準確度、支持并行和大規(guī)模數(shù)據(jù)處理的數(shù)據(jù)科學(xué)工具。
關(guān)于GBDT和XGboost的介紹可以參考:
大餅:機器學(xué)習(xí)——提升算法(Adaboost、xgboost、GBDT)?zhuanlan.zhihu.comLightgbm主要特點
Histogram Algorithm(直方圖)
將連續(xù)浮點特征值離散化為k個整數(shù),并構(gòu)造bins=k的直方圖,只管來說,就是將連續(xù)值得特征劃分為k個離散值(區(qū)間),并將每個符合該離散值范圍的連續(xù)值加入到相應(yīng)的bin的直方圖中,數(shù)據(jù)的離散化有著存儲方便、運算更快、魯棒性強以及模型穩(wěn)定的特點(正則化);
- 內(nèi)存占用小,不需要預(yù)排序(XGboost),只保存離散化后的值,內(nèi)存可以降低至1/8;
- 計算代價小,預(yù)排序算法XGboost每遍歷一個特征值就需要計算分裂增益,Lightgbm是計算k次的離散值即可,復(fù)雜度從O(#data#feature)降低至O(#k#feature),一般data>>k;
- bins替代原始數(shù)據(jù),增加了正則化;
- 特征值離散化,意味著許多細節(jié)被拋棄,影響數(shù)據(jù)間的差異性以及模型的精度;
直方圖做差加速
葉子直方圖可以由其父節(jié)點直方圖和兄弟節(jié)點直方圖做差得到,速度可以提升一倍,實際構(gòu)建樹的過程中,可以先計算直方圖小的葉子節(jié)點,然后利用直方圖做差獲得直方圖大的兄弟節(jié)點,降低計算代價。
帶深度限制的Leaf-wise算法
無論是決策樹、GBDT、Adaboost還是XGBoost,其樹的生長方式都是level-wise策略,即每一個節(jié)點都分裂成兩個子節(jié)點,Xgboost因為采用了多線程優(yōu)化,遍歷一次數(shù)據(jù)可以分裂同一層的節(jié)點,但是實際上很多葉子的分裂增益很低,可以不用繼續(xù)分裂下去,增加計算開銷。
leaf-wise生長策略,每次從當前所有葉子中尋找分裂增益最大的葉子進行分裂,leaf-wise可以降低誤差提高精度,并且避免很多不必要的計算開銷,但是缺點就是容易長出比較深的決策樹,產(chǎn)生過擬合,因此會配合最大深度限制,保持高效率的同時,減緩過擬合。
單邊梯度采樣(Goss)
Goss算法從減少樣本的角度出發(fā)排除大部分小梯度的樣本,僅用剩下的樣本計算信息增益,是一種在減少數(shù)據(jù)量和保證精度上平衡的算法。
AdaBoost中,樣本權(quán)重是數(shù)據(jù)重要性的指標。然而在GBDT中沒有原始樣本權(quán)重,不能應(yīng)用權(quán)重采樣。幸運的是,我們觀察到GBDT中每個數(shù)據(jù)都有不同的梯度值,對采樣十分有用。即梯度小的樣本,訓(xùn)練誤差也比較小,說明數(shù)據(jù)已經(jīng)被模型學(xué)習(xí)得很好了,直接想法就是丟掉這部分梯度小的數(shù)據(jù)。然而這樣做會改變數(shù)據(jù)的分布,將會影響訓(xùn)練模型的精確度,為了避免此問題,提出了GOSS算法。
- Goss首先將分裂的特征所有取值按照梯度絕對值大小降序排序(不用保存排序結(jié)果);
- 選取絕對值最大的 個數(shù)據(jù);
- 剩余的 的較小梯度數(shù)據(jù)中隨機選擇 個數(shù)據(jù),并乘以一個常數(shù) ,這樣模型會更關(guān)注訓(xùn)練不足的樣本,而不改變原數(shù)據(jù)集的分布;
- 最后用 個數(shù)據(jù)來計算信息增益。
互斥特征捆綁算法(EFB)
高維度的數(shù)據(jù)往往存在很大的稀疏性,數(shù)據(jù)通常都是幾千萬維的稀疏數(shù)據(jù),對于不同維度的數(shù)據(jù)合并一起,可以使得稀疏矩陣變成一個稠密矩陣。
- 將特征按照非零值的個數(shù)進行排序;
- 計算不同特征的沖突比率;(兩個特征完全互斥時,比率為0)
- 遍歷每個特征并嘗試合并特征,使沖突比率最小化;
支持類別特征
目前大部分的機器學(xué)習(xí)工具都無法有效的直接支持類別特征,一般需要將其轉(zhuǎn)化為one-hot格式,Lightgbm優(yōu)化了對于類別特征的支持,可以直接輸入類別特征,不需要額外的0-1展開。
樹模型遇到one-hot編碼的類別特征時可能會遇到一些問題,比如切分方式只有是/否,很容易造成樣本切分不均衡,切分增益小;另外這種不平衡的切分方式會使得一個葉節(jié)點只有極少數(shù)樣本的情況出現(xiàn),這對于決策樹基于統(tǒng)計信息的學(xué)習(xí)會產(chǎn)生很大的影響。
左圖為不平衡切分,右圖為最優(yōu)切分Lightgbm處理分類特征主要是,在1個k維的類別特征中尋找最優(yōu)切分。在枚舉分割點之前,先把直方圖按每個類別的均值進行排序,然后安裝均值的結(jié)果依次枚舉最優(yōu)分割點。
- 統(tǒng)計該類別特征每種離散值出現(xiàn)次數(shù),排序,為每一個特征值建立bin容器,對于出現(xiàn)次數(shù)很少的bin容器可以拋棄掉;
- 如果bin容器數(shù)里<4,可以使用One V Other的方法,逐個掃描每個bin,找出最佳分裂點,如果bins較多的話,先進行過濾,只讓子集合較大的bin容器參加劃分閾值計算,對每個符合條件的bin容器進行公式計算:當前bin容器所有樣本一階梯度之和/該bin容器下所有樣本二階梯度之和+正則項(cat_smooth)
支持高效并行
不同的機器在不同的特征集合上分別尋找最優(yōu)的分割點,并在機器中同步最優(yōu)分割點,這種方式對數(shù)據(jù)進行垂直劃分,每臺機器所含數(shù)據(jù)不同,使用不同的機器找到不同特征最優(yōu)分割點,劃分結(jié)果需要通過通信告知每臺機器,增加額外復(fù)雜度。
Lightgbm是在每臺機器上保存全部的訓(xùn)練數(shù)據(jù),在得到最佳劃分方案后可在本地執(zhí)行劃分而減少不必要的通信。
2. 數(shù)據(jù)并行
Lightgbm數(shù)據(jù)并行中使用分散規(guī)約把直方圖合并的任務(wù)分攤到不同的機器,降低通信計算代價,利用直方圖做差,減少一半通信量。
3. 投票并行
使用投票并行的方式,只合并部分特征的直方圖從而達到降低通信量的目的,得到非常好的加速效果。
- 本地找出Top k特征,并基于投票篩選出可能是最優(yōu)分割點的特征;
- 合并時只合并每個機器選出來的特征;
cache命中率優(yōu)化
XGBoost在預(yù)排序之后,特征對梯度的訪問是一種隨機訪問,不同的特征訪問順序不一樣,無法優(yōu)化cache,在每一層長樹的時候,需要隨機訪問一個行索引到葉子索引的數(shù)組,并且不同特征訪問的順序也不一樣,也會造成較大的cache miss。
Lightgbm:
- 所有特征采用相同的方式獲得梯度(XGboost不同特征通過不同索引獲得梯度),只需要對梯度進行排序可實現(xiàn)連續(xù)訪問,提高緩存命中率。
- 不需要存儲行索引到葉子索引的數(shù)組,降低內(nèi)存消耗,不存在Cache Miss問題。
和XGBoost的比較
XGBoost的缺點
- 預(yù)排序空間消耗大,需保存數(shù)據(jù)特征值和排序結(jié)果(索引),需要訓(xùn)練集兩倍的內(nèi)存;
- cache miss問題;
- 遍歷每個分割點都需要進行分裂增益計算,消耗代價大。
Lightgbm的優(yōu)化
- 基于histogram的決策樹算法;
- 單邊梯度采樣(Goss),減少大量小梯度數(shù)據(jù),節(jié)省了很多時間和空間消耗;
- 互斥捆綁特征(EFB),降維,減少特征維度;
- 帶深度限制的leaf-wise生長策略;
- 支持類別特征;
- 支持高效并行;
- cache命中率優(yōu)化。
參考博客:
LightGBM算法詳解(教你一文掌握LightGBM所有知識點)_GFDGFHSDS的博客-CSDN博客_lightgbm詳解?blog.csdn.netLightGBM(lgb)詳解_weixin_44023658的博客-CSDN博客_lgb介紹?blog.csdn.netLightGBM原理分析?www.jianshu.com參考論文:
LightGBM: A Highly Efficient Gradient Boosting Decision Tree?papers.nips.cc總結(jié)
以上是生活随笔為你收集整理的lightgbm 保存模型 过大_机器学习之12—Lightgbm的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言 函数的参数传递示例_C ++中带
- 下一篇: array.unshift_Ruby中带