lightgbm原理以及Python代碼


原論文:

http://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf

lightgbm原理:

gbdt困點:

gbdt是受歡迎的機器學習算法,當特征維度很高或數據量很大時,有效性和可拓展性沒法滿足。lightgbm提出GOSS(Gradient-based One-Side Sampling)和EFB(Exclusive Feature Bundling)進行改進。lightgbm與傳統的gbdt在達到相同的精確度時,快20倍。

Gradient-based One-Side Sampling (Goss):在GBDT中,數據集沒有權重,注意到讓不同梯度的數據集在計算信息增益時產生不同的作用。根據信息增益的定義,對於有更大梯度(即訓練不足的數據集)將產生更多信息增益。於是,當降低數據集的數據量時,通過保持大梯度的數據集,隨機丟掉小梯度的數據集,保持信息增益的准確性。

 

 

GOSS保持所有具有大梯度的數據集,在小梯度數據集上隨機采樣。為了抵消對數據分布的影響,GOSS小梯度的樣本數據在計算信息增益時引入系數(1-a)/b。具體來說,

  1. GOSS首先按照數據集的梯度絕對值進行排序,選取最大的a*100%數據集保留;
  2. 然后從剩余數據集中隨機選取b*100%;
  3. 最后,GOSS對於小梯度乘以常數(1-a)/b放大了樣本數據。這樣做,我們能不改變原始數據的分布,集中注意力在訓練不足的數據上。

 收斂分析表明,GOSS算法不會太多降低訓練復雜度,並且超越隨機選樣本。

 Exclusive Feature Bundling(EFB). 高維數據通常非常稀疏。特征空間的稀疏性為我們提供了一個設計一種幾乎無損的方法來減少特征數量的可能性。具體地說,在一個稀疏的特征空間,許多特征是互斥的,即,它們從不同時取非零值。我們可以安全地將互斥特征捆綁到一個單一的特征中(稱之為互斥特征束)。通過精心設計的特征掃描算法,我們可以構建與個體特征類似的基於特征束的特征直方圖。這樣,直方圖構建的復雜性從,其中。這樣我們可以在不影響准確性情況下大大加快對GBDT的訓練。

 

 

我們的問題對應於圖着色問題,反之亦然,因此可以使用貪婪算法來解決。

   EFB算法可以將許多互斥性特征捆綁到更少的密集特征上,這可以有效避免了零特征值的不必要計算。事實上,我們也可以通過忽略零特征值,使用表格記錄特征非零值的直方圖算法。通過掃描表中的數據,直方圖構建成本將從變為。然而,該方法在樹生長過程中需要額外的內存和計算成本來維護這些特征表。我們可以以LightGBM為基本函數按此進行優化。注:這種優化不與EFB沖突,因為我們在捆束稀疏時,依然可以使用它。

   EFB合並了許多稀疏特征(包括編碼特性和隱式互斥性特征),成為少得多的特征。在捆綁過程中包含了基本稀疏特征優化。然而,EFB在樹學習過程中為每個特征維護非零數據表,沒有額外的成本。更重要的是,因為許多先前孤立的特征被捆綁在一起,它可以增加空間局部性和顯著改進緩存命中率。因此,整體效率的提高是引人注目的。以上分析表明,EFB是一種非常有效的在直方圖中利用稀疏屬性的算法,可以為GBDT訓練過程帶來顯著的加速。

python代碼:

import lightgbm

clf=lightgbm

train_matrix = clf.Dataset(tr_x, label=tr_y)

            test_matrix = clf.Dataset(te_x, label=te_y)

            #z = clf.Dataset(test_x, label=te_y)

            #z=test_x

            params = {

#                 'boosting_type': 'gbdt',

#                 'learning_rate': 0.01,

#                 'objective': 'binary',

#                 'metric': 'auc',

#                 'min_child_weight': 1.5,

#                 'num_leaves': 2 ** 5,

#                 'lambda_l2': 10,

#                 'subsample': 0.9,

#                 'colsample_bytree': 0.7,

#                 'colsample_bylevel': 0.7,

#                 'learning_rate': 0.01,

#                 'seed': 2017,

#                 'nthread': 12,

#                 'silent': True,

                        'task': 'train',

                        'learning_rate': 0.005,

#                         'max_depth': 8,

#                         'num_leaves':2**6-1,

                        'boosting_type': 'gbdt',

                        'objective': 'binary',

#                         'is_unbalance':True,

                        'feature_fraction': 0.8,

                        'metric':'auc',

                        'bagging_fraction': 0.86,

#                         'lambda_l1': 0.0001,

                        'lambda_l2': 49,

                        'bagging_freq':3,

#                         'min_data_in_leaf':5,

                        'verbose': 1,

                        'random_state': 2267,

            }

            num_round = 10000

            early_stopping_rounds = 300

            if test_matrix:

                model = clf.train(params, train_matrix,num_round,valid_sets=test_matrix,

                                  early_stopping_rounds=early_stopping_rounds,verbose_eval=300

                                  )

                pre= model.predict(te_x,num_iteration=model.best_iteration).reshape((te_x.shape[0],1))

                train[test_index]=pre

                test_pre[i, :]= model.predict(test_x, num_iteration=model.best_iteration).reshape((test_x.shape[0],1))

                cv_scores.append(roc_auc_score(te_y, pre))                   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM