LightGBM详细
目錄
LightGBM
XGB的優(yōu)缺點(diǎn):
LightGBM原理
1.1 GBDT和 LightGBM對(duì)比
1.2 LightGBM 的動(dòng)機(jī)
1.3 Xgboost 原理
1.4 LightGBM 優(yōu)化
LightGBM算法原理:
直方圖算法(Histgram)
帶深度限制的Leaf-wise算法
單邊梯度采樣算法
互斥特征捆綁算法
LightGBM的優(yōu)缺點(diǎn):
速度:
內(nèi)存:
LightGBM
GBDT是一個(gè)長久不衰的模型,他的思想是什么?
它的思想就是將多個(gè)弱分類器迭代訓(xùn)練得到最優(yōu)的模型,訓(xùn)練效果好,不易過擬合等等的有點(diǎn),那么XGB就是典型的一個(gè)GBDT的實(shí)現(xiàn)。
首先回顧一下XGB,它的核心思想就是說,是屬于GBDT的一個(gè)延申,因此它的模型也是加法模型,由多個(gè)弱分類器相加的結(jié)果,那么在構(gòu)成弱分類器的時(shí)候,首先需要對(duì)特征值進(jìn)行預(yù)排序,然后便利所有的切分點(diǎn),然后計(jì)算每個(gè)切分點(diǎn)的一個(gè)增益,最后找到最優(yōu)的分裂點(diǎn)進(jìn)行數(shù)據(jù)分裂成左右子樹。
XGB的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
能夠最精確的找到切分點(diǎn),因?yàn)榘阉械臉颖究匆槐?#xff0c;都計(jì)算了一遍,肯定能找到最優(yōu)的點(diǎn)。
缺點(diǎn):
時(shí)間消耗比較大
LightGBM原理
1.1 GBDT和 LightGBM對(duì)比
? GBDT (Gradient Boosting Decision Tree) 是機(jī)器學(xué)習(xí)中一個(gè)長盛不衰的模型,其主要思想是利用弱分類器(決策樹)迭代訓(xùn)練以得到最優(yōu)模型,該模型具有訓(xùn)練效果好、不易過擬合等優(yōu)點(diǎn)。GBDT 在工業(yè)界應(yīng)用廣泛,通常被用于點(diǎn)擊率預(yù)測(cè),搜索排序等任務(wù)。GBDT 也是各種數(shù)據(jù)挖掘競賽的致命武器,據(jù)統(tǒng)計(jì) Kaggle 上的比賽有一半以上的冠軍方案都是基于 GBDT。
? LightGBM (Light Gradient Boosting Machine)是一個(gè)實(shí)現(xiàn) GBDT 算法的框架,支持高效率的并行訓(xùn)練,并且具有以下優(yōu)點(diǎn):
更快的訓(xùn)練速度
更低的內(nèi)存消耗
更好的準(zhǔn)確率
分布式支持,可以快速處理海量數(shù)據(jù)
? 如下圖,在 Higgs 數(shù)據(jù)集上 LightGBM 比 XGBoost 快將近 10 倍,內(nèi)存占用率大約為 XGBoost 的1/6,并且準(zhǔn)確率也有提升。
1.2 LightGBM 的動(dòng)機(jī)
? 常用的機(jī)器學(xué)習(xí)算法,例如神經(jīng)網(wǎng)絡(luò)等算法,都可以以 mini-batch 的方式訓(xùn)練,訓(xùn)練數(shù)據(jù)的大小不會(huì)受到內(nèi)存限制。
? 而 GBDT 在每一次迭代的時(shí)候,都需要遍歷整個(gè)訓(xùn)練數(shù)據(jù)多次。如果把整個(gè)訓(xùn)練數(shù)據(jù)裝進(jìn)內(nèi)存則會(huì)限制訓(xùn)練數(shù)據(jù)的大小;如果不裝進(jìn)內(nèi)存,反復(fù)地讀寫訓(xùn)練數(shù)據(jù)又會(huì)消耗非常大的時(shí)間。尤其面對(duì)工業(yè)級(jí)海量的數(shù)據(jù),普通的 GBDT 算法是不能滿足其需求的。
LightGBM 提出的主要原因就是為了解決 GBDT 在海量數(shù)據(jù)遇到的問題,讓 GBDT 可以更好更快地用于工業(yè)實(shí)踐。
1.3 Xgboost 原理
? 目前已有的 GBDT 工具基本都是基于預(yù)排序的方法(pre-sorted)的決策樹算法(如 xgboost)。這種構(gòu)建決策樹的算法基本思想是:
首先,對(duì)所有特征都按照特征的數(shù)值進(jìn)行預(yù)排序。
其次,在遍歷分割點(diǎn)的時(shí)候用O(#data)的代價(jià)找到一個(gè)特征上的最好分割點(diǎn)。
最后,找到一個(gè)特征的分割點(diǎn)后,將數(shù)據(jù)分裂成左右子節(jié)點(diǎn)。
這樣的預(yù)排序算法的優(yōu)點(diǎn)是:能精確地找到分割點(diǎn)。
缺點(diǎn)也很明顯:
首先,空間消耗大。這樣的算法需要保存數(shù)據(jù)的特征值,還保存了特征排序的結(jié)果(例如排序后的索引,為了后續(xù)快速的計(jì)算分割點(diǎn)),這里需要消耗訓(xùn)練數(shù)據(jù)兩倍的內(nèi)存。
其次,時(shí)間上也有較大的開銷,在遍歷每一個(gè)分割點(diǎn)的時(shí)候,都需要進(jìn)行分裂增益的計(jì)算,消耗的代價(jià)大。
最后,對(duì) cache 優(yōu)化不友好。在預(yù)排序后,特征對(duì)梯度的訪問是一種隨機(jī)訪問,并且不同的特征訪問的順序不一樣,無法對(duì) cache 進(jìn)行優(yōu)化。同時(shí),在每一層長樹的時(shí)候,需要隨機(jī)訪問一個(gè)行索引到葉子索引的數(shù)組,并且不同特征訪問的順序也不一樣,也會(huì)造成較大的 cache miss。
1.4 LightGBM 優(yōu)化
LightGBM 優(yōu)化部分包含以下:
基于 Histogram 的決策樹算法
帶深度限制的 Leaf-wise 的葉子生長策略
直方圖做差加速
直接支持類別特征(Categorical Feature)
Cache 命中率優(yōu)化
基于直方圖的稀疏特征優(yōu)化
多線程優(yōu)化。
? 下面主要介紹 Histogram 算法、帶深度限制的 Leaf-wise 的葉子生長策略和直方圖做差加速。
?
其實(shí)LightGBM也是一個(gè)實(shí)現(xiàn)GBDT算法的框架,
那么LightGBM的特點(diǎn)?
它支持高效的并行訓(xùn)練,有著更快的訓(xùn)練速度,更低的內(nèi)存消耗,更好的準(zhǔn)確率,支持分布式,可以快速的處理海量的數(shù)據(jù)。
LightGBM算法原理:
直方圖算法(Histgram)
思想:把連續(xù)的特征值離散化成K個(gè)整數(shù),比如說0~1我們叫做1,1~2我們叫做3,。。。。。。等等,這樣然后在對(duì)特征值里邊的數(shù)據(jù)進(jìn)行一個(gè)統(tǒng)計(jì),這樣是不是就得到了一個(gè)直方圖,然后我們用直方圖所對(duì)應(yīng)的值來進(jìn)行增益的分裂,將大規(guī)模的數(shù)據(jù)更新為箱子的值。
那么這樣做的目的是什么?
對(duì)于直方圖來說最直接優(yōu)點(diǎn)是什么?
內(nèi)存占用小,因?yàn)椴恍枰4嬖瓉淼奶卣髁?#xff0c;只需要保存直方圖統(tǒng)計(jì)后的值,這個(gè)值一般情況下用8位的整型去儲(chǔ)存就夠了,但是在XGB中需要使用32位的浮點(diǎn)型儲(chǔ)存。
計(jì)算代價(jià)小,在XGB中計(jì)算分裂增益的時(shí)候需要遍歷每一個(gè)特征值然后計(jì)算一個(gè)增益,而在直方圖的算法中只需要計(jì)算K次,時(shí)間復(fù)雜度直接由原來的feature變成了現(xiàn)在的k而我們知道data>>k
當(dāng)然我們說這種方法值最好的嘛?他有什么樣的缺點(diǎn)呢?
Histogram算法并不完美,由于特征被離散化后,找到的并不是一個(gè)準(zhǔn)確的切分點(diǎn),所以對(duì)結(jié)果會(huì)產(chǎn)生影響,但是我們發(fā)現(xiàn)到形成的最終的這個(gè)強(qiáng)學(xué)習(xí)器并不會(huì)差,有時(shí)候甚至更好,原因是什么?
原因就是說里邊的每個(gè)模型本來就是弱學(xué)習(xí)器,分割點(diǎn)不精確并不是特別的重要,比較粗糙的分割點(diǎn)真好還能起到正則化的作用,可以有效的防止過擬合,雖然每棵樹上的訓(xùn)練誤差稍大,但是在總體的框架下并沒有什么太大的影響。
怎么做的差?
假如說我有x個(gè)數(shù)據(jù),然后我是可是可以構(gòu)建出來一個(gè)k個(gè)桶的直方圖,然后,我的左子節(jié)點(diǎn)上的數(shù)據(jù)由x1個(gè)數(shù)據(jù),同樣是不是也可以得到一個(gè)k個(gè)桶的直方圖,那么我右子節(jié)點(diǎn)上是不是就有(x-x1)個(gè)樣本數(shù)據(jù),是不是就可以通過x的直方圖減去x1的直方圖。
帶深度限制的Leaf-wise算法
XGB使用的是level-wise按層生長的策略,這種策略容易進(jìn)行并行化處理,也好控制模型的復(fù)雜度,同時(shí)也可以防止過擬合,但是這種方式其實(shí)是很低效的,因?yàn)檫@種按層去分的話,每次構(gòu)建其中的一層,但是實(shí)際上呢,速度是比較慢的,因?yàn)橛械娜~子節(jié)點(diǎn)的增益下降是比較慢的,也就是說在這一步?jīng)]有必要將這個(gè)節(jié)點(diǎn)繼續(xù)的進(jìn)行劃分,但是卻以同樣的權(quán)重去關(guān)注同一層的每個(gè)葉子節(jié)點(diǎn)顯然是不合適的。去劃分它顯然是不合適的。
而LightGBM采用的是Leaf-wise的增長策略,就是說,每次都從所有的葉子節(jié)點(diǎn)中找出,增益最大的葉子節(jié)點(diǎn)去進(jìn)行劃分,這樣的話是不是每次都可以下降最多的誤差,得到更好的精度,但是缺點(diǎn)呢就是,可能會(huì)長出一顆比較深的樹,然后導(dǎo)致了過擬合,但是LightGBM在Leaf-wise的基礎(chǔ)上加上了一個(gè)最大深度的限制,在保證高效的同時(shí)還防止了過擬合。
單邊梯度采樣算法
GOSS算法,這個(gè)算法的思想就是,從減少樣本的角度出發(fā),排除大部分的小梯度的樣本,僅僅用剩下的樣本計(jì)算目標(biāo)函數(shù)增益,它是一種在減少數(shù)據(jù)和保證精度上平衡的算法。
在GBDT中發(fā)現(xiàn)每個(gè)樣本都有相應(yīng)的梯度值,梯度小的樣本,訓(xùn)練誤差也小,說明該樣本已經(jīng)很好的被模型給學(xué)習(xí)到了,直接想法就是丟掉這一部分?jǐn)?shù)據(jù),但是直接丟掉的話,就會(huì)影響到數(shù)據(jù)的分布,從而導(dǎo)致影響模型的精度,因此為了解決這個(gè)問題,提出了GOSS算法。GOSS是一個(gè)采樣的算法,目的是為了丟棄一些對(duì)計(jì)算信息增益沒有用的樣本,留下對(duì)計(jì)算有用的歐陽本,也說到了,梯度大的對(duì)計(jì)算增益是有幫助的,梯度小的樣本是沒有幫助的,但是在其中又不能直接的丟棄,那他是怎么做的?
首先它對(duì)于樣本的梯度進(jìn)行一個(gè)排序,比如說我設(shè)定一個(gè)閾值0.5那么梯度大于0.5的樣本我全部留下,梯度小于0.5的我按照一定的比例去隨機(jī)的采樣,比如說我從里邊抽取了1/3的樣本。然后使用這樣的數(shù)據(jù)進(jìn)行訓(xùn)練。
互斥特征捆綁算法
數(shù)據(jù)通常都是高緯稀疏的數(shù)據(jù),并且通常數(shù)據(jù)呢都是稀疏的,什么意思?比如說one-hot類型的數(shù)據(jù),每一列都是0只有一個(gè)值是1,如果數(shù)據(jù)的維度太高的話會(huì)出現(xiàn)什么情況,模型復(fù)雜,計(jì)算繁瑣,時(shí)間復(fù)雜度高,如果將數(shù)據(jù)的維度進(jìn)行壓縮一下,那么速度是不是也會(huì)由很大的提升,那么怎么去通過一種無損的壓縮來很好的減少特征的數(shù)量呢?我們發(fā)現(xiàn),數(shù)據(jù)一般都是互斥的,什么是互斥的,就像one-hot中很多特征全是0,只有一個(gè)是1,那么也就是說只要我任意的兩個(gè)特征不同時(shí)為非0值,那么這兩個(gè)特征都是互斥的,我們就可以把特們綁到一起去組合成一個(gè)新的特征,但是實(shí)際中不存在完全互斥的數(shù)據(jù)吧,那么怎么辦,仍然是采用近似互斥的方法,也就是說,我們?cè)试S一些非互斥的存在,那么我們?nèi)ズ饬窟@個(gè)不互斥的情況就稱作為沖突比率,當(dāng)這個(gè)比率比較小是,就可以將兩個(gè)特征進(jìn)行捆綁,而不影響精度,那么怎么去衡量兩個(gè)特征之間能不能捆綁呢?
它有這個(gè)衡量公式,r是每個(gè)綁定中的最大沖突比率,當(dāng)r相對(duì)較小是,完成它們速度和精度之間的一個(gè)平衡。
LightGBM的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
從內(nèi)存和速度兩方面去考慮
速度:
LightGBM采用了直方圖算法將遍歷樣本轉(zhuǎn)變?yōu)楸闅v直方圖,極大的降低了時(shí)間的復(fù)雜度;
LightGBM在訓(xùn)練的過程當(dāng)中采用了單邊梯度算法過濾掉了梯度比較小的樣本,減小了計(jì)算量
LightGBM采用了Leaf-wise算法的增長策略構(gòu)建樹,減小了很多不必要的計(jì)算量
LightGBM采用了特征并行,數(shù)據(jù)并行的方法加速計(jì)算,當(dāng)數(shù)據(jù)量非常大的時(shí)候還可以采用投票并行的策略
LightGBM對(duì)緩存也進(jìn)行了優(yōu)化,增加了緩存命中率
內(nèi)存:
通過直方圖算法將原本的儲(chǔ)存特征值,轉(zhuǎn)變?yōu)榱藘?chǔ)存箱子的值,降低了內(nèi)存的消耗
在訓(xùn)練過程當(dāng)中,采用互斥特征捆綁算法,減少了特征數(shù)量,降低了內(nèi)存的消耗
Lightgbm = xgboost + 直方圖(減小了內(nèi)存儲(chǔ)存的消耗) + leaf wise(構(gòu)建樹提升速度) + 單邊梯度下降(從減少數(shù)據(jù)量) + 互斥特征捆綁(從減少特征)
總結(jié)
以上是生活随笔為你收集整理的LightGBM详细的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 与音乐共缠绵
- 下一篇: 中国消费信贷行业市场供需与战略研究报告