比XGBOOST更快--LightGBM介紹

xgboost的出現(xiàn),讓數(shù)據(jù)民工們告別了傳統(tǒng)的機器學習算法們:RF、GBM、SVM、LASSO........?,F(xiàn)在,微軟推出了一個新的boosting框架,想要挑戰(zhàn)xgboost的江湖地位。筆者嘗試了一下,下面請看來自第一線的報告。

包含以下幾個部分:

一. 基本介紹

二. ?XGBOOST原理及缺點

三. LightGBM的優(yōu)化

四. 建模過程(python)

五. 調(diào)參

一. 基本介紹

LightGBM 是一個梯度 boosting 框架,使用基于學習算法的決策樹。它可以說是分布式的,高效的,它有以下優(yōu)勢:

- 更快的訓練效率

- 低內(nèi)存使用

- 更好的準確率

- 支持并行學習

- 可處理大規(guī)模數(shù)據(jù)

與常用的機器學習算法進行比較:

· 速度飛起


二. ?XGBOOST原理及缺點

1. 原理

1 ) 有監(jiān)督學習

有監(jiān)督學習的目標函數(shù)是下面這個東東:


其中,第一項稱為誤差函數(shù),常見的誤差函數(shù)有平方誤差,logistic誤差等等,第二項稱為正則項,常見的有L1正則和L2正則,神經(jīng)網(wǎng)絡里面的dropout等等

2)Boosted Tree

i)基學習器:分類樹和回歸樹(CART)

ii ) Tree Ensemble

一個CART往往過于簡單無法有效地預測,因此一個更加強力的模型叫做tree ensemble。

簡而言之,Boosted Tree 就是一種 Tree Ensemble的方法,和RF一樣,只是構(gòu)造(學習)模型參數(shù)的方法不同。

iii)模型學習:additive training

每一次保留原來的模型不變,加入一個新的函數(shù)f到我們的模型中。

f 的選擇標準---最小化目標函數(shù)!

通過二階泰勒展開,以及(中間省略N步),我們得到了最終的目標函數(shù):

G、H:與數(shù)據(jù)點在誤差函數(shù)上的一階、二階導數(shù)有關,T:葉子的個數(shù)

iv ) 枚舉所有不同樹結(jié)構(gòu)的貪心算法

不斷地枚舉不同樹的結(jié)構(gòu),根據(jù)目標函數(shù)來尋找出一個最優(yōu)結(jié)構(gòu)的樹,加入到我們的模型中,再重復這樣的操作。不過枚舉所有樹結(jié)構(gòu)這個操作不太可行,所以常用的方法是貪心法,每一次嘗試去對已有的葉子加入一個分割。對于一個具體的分割方案,我們可以獲得的增益可以由如下公式計算。


對于每次擴展,我們還是要枚舉所有可能的分割方案,如何高效地枚舉所有的分割呢?我假設我們要枚舉所有 x

我們可以發(fā)現(xiàn)對于所有的a,我們只要做一遍從左到右的掃描就可以枚舉出所有分割的梯度和GL和GR。然后用上面的公式計算每個分割方案的分數(shù)就可以了。

詳細的內(nèi)容可以看陳天奇大神的文章【3】

2. 缺點

--?在每一次迭代的時候,都需要遍歷整個訓練數(shù)據(jù)多次。如果把整個訓練數(shù)據(jù)裝進內(nèi)存則會限制訓練數(shù)據(jù)的大??;如果不裝進內(nèi)存,反復地讀寫訓練數(shù)據(jù)又會消耗非常大的時間。

-- 預排序方法(pre-sorted):

首先,空間消耗大。這樣的算法需要保存數(shù)據(jù)的特征值,還保存了特征排序的結(jié)果(例如排序后的索引,為了后續(xù)快速的計算分割點),這里需要消耗訓練數(shù)據(jù)兩倍的內(nèi)存。

其次,時間上也有較大的開銷,在遍歷每一個分割點的時候,都需要進行分裂增益的計算,消耗的代價大。

最后,對cache優(yōu)化不友好。在預排序后,特征對梯度的訪問是一種隨機訪問,并且不同的特征訪問的順序不一樣,無法對cache進行優(yōu)化。同時,在每一層長樹的時候,需要隨機訪問一個行索引到葉子索引的數(shù)組,并且不同特征訪問的順序也不一樣,也會造成較大的cache miss。

三. LightGBM的優(yōu)化

基于Histogram的決策樹算法

帶深度限制的Leaf-wise的葉子生長策略

直方圖做差加速

直接支持類別特征(Categorical Feature)

Cache命中率優(yōu)化

基于直方圖的稀疏特征優(yōu)化

多線程優(yōu)化

下面主要介紹Histogram算法、帶深度限制的Leaf-wise的葉子生長策略。

>>>>

Histogram算法

直方圖算法的基本思想是先把連續(xù)的浮點特征值離散化成k個整數(shù),同時構(gòu)造一個寬度為k的直方圖。在遍歷數(shù)據(jù)的時候,根據(jù)離散化后的值作為索引在直方圖中累積統(tǒng)計量,當遍歷一次數(shù)據(jù)后,直方圖累積了需要的統(tǒng)計量,然后根據(jù)直方圖的離散值,遍歷尋找最優(yōu)的分割點。

圖:直方圖算法

>>>>

帶深度限制的Leaf-wise的葉子生長策略

Level-wise過一次數(shù)據(jù)可以同時分裂同一層的葉子,容易進行多線程優(yōu)化,也好控制模型復雜度,不容易過擬合。但實際上Level-wise是一種低效的算法,因為它不加區(qū)分的對待同一層的葉子,帶來了很多沒必要的開銷,因為實際上很多葉子的分裂增益較低,沒必要進行搜索和分裂。

Leaf-wise則是一種更為高效的策略,每次從當前所有葉子中,找到分裂增益最大的一個葉子,然后分裂,如此循環(huán)。因此同Level-wise相比,在分裂次數(shù)相同的情況下,Leaf-wise可以降低更多的誤差,得到更好的精度。Leaf-wise的缺點是可能會長出比較深的決策樹,產(chǎn)生過擬合。因此LightGBM在Leaf-wise之上增加了一個最大深度的限制,在保證高效率的同時防止過擬合。

四. 建模過程(python)

數(shù)據(jù)導入

# 接受:libsvm/tsv/csv 、Numpy 2D array、pandas object(dataframe)、LightGBM binary file

# 需要指定 feature names and categorical features

train_data = lgb.Dataset(dtrain[predictors],label=dtrain[target],feature_name=list(dtrain[predictors].columns), categorical_feature=dummies)

test_data = lgb.Dataset(dtest[predictors],label=dtest[target],feature_name=list(dtest[predictors].columns), categorical_feature=dummies)

設置參數(shù)

param = {'max_depth':6,'num_leaves':64,'learning_rate':0.03,'scale_pos_weight':1,'num_threads':40,'objective':'binary','bagging_fraction':0.7,'bagging_freq':1,'min_sum_hessian_in_leaf':100}

param['is_unbalance']='true'

param['metric'] = 'auc'

3. CV

bst=lgb.cv(param,train_data,num_boost_round=1000,nfold=3,early_stopping_rounds=30)

estimators = lgb.train(param,train_data,num_boost_round=len(bst['auc-mean']))

4. 預測

ypred = estimators.predict(dtest[predictors])

四. 實測效果

試了一下90W條記錄*130維的樣本,num_threads設置為40

時間:


2. 準確率:


五. 調(diào)參

1. 使用num_leaves

因為LightGBM使用的是leaf-wise的算法,因此在調(diào)節(jié)樹的復雜程度時,使用的是num_leaves而不是max_depth

大致?lián)Q算關系:num_leaves = 2^(max_depth)

2.對于非平衡數(shù)據(jù)集:可以param['is_unbalance']='true’

3. Bagging參數(shù):bagging_fraction+bagging_freq(必須同時設置)、feature_fraction

4.?min_data_in_leaf、min_sum_hessian_in_leaf

參考文獻

https://github.com/Microsoft/LightGBM/

關于LightGBM: http://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650719786&idx=3&sn=ab1c5a77237dc4b2ee5ae12c7a68ff87&chksm=871b0254b06c8b42d5a4fdf3327f7284c9ffbe72fe7911301d368b157024b32923d88401c2a8&scene=0&open_source=weibo_search

關于XGBOOST:http://www.52cs.org/?p=429


對數(shù)據(jù)感興趣的小伙伴,歡迎交流,微信公共號:一白侃數(shù)

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

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容