比快更快——微軟LightGBM


LightGBM介紹

xgboost是一種優秀的boosting框架,但是在使用過程中,其訓練耗時過長,內存占用比較大。微軟在2016年推出了另外一種boosting框架——lightgbm,在不降低准確度的的前提下,速度提升了10倍左右,占用內存下降了3倍左右。詳細的實驗結果參見:LightGBM experiment.其令人印象深刻的特點有:

  • 將連續的特征值轉化為離散的直方圖,利用直方圖進行節點的分裂,犧牲了一定的准確度換取了訓練速度和內存空間的優化。
  • 相對於xgboost的level—wise的生長策略,lightgbm使用了leaf-wise樹生長策略。由於level-wise在分裂時,部分增益小的樹也得到了增長,雖然容易控制誤差,但是分裂有時是不合理的,而lightgbm使用level-wise,只在增益大的樹上分裂生長,甚至對Feature f如果分裂無收益,那么后續也將不會對f計算。體現在參數上,xgboost使用max_depth,而lightgbm使用num_leaves控制過擬合。
  • 直接支持了類別輸入模型,無需對類別型的特征進行one-hot編碼,lightgbm在參數categorial_feature中來指定數據中的類別特征列即可。

LightGBM調參

幾個重要的參數調節:

  1. num_leaves
    這是控制過擬合的參數。由於lightgbm使用的算法是leaf-wise,而xgboost使用是level-wise(depth-wise)。一個簡單的換算方法是:num_leaves=2max_depth.但是由於lightgbm生成的決策樹並非滿樹,所以利用此換算方法得到的num_leaves大大超過了實際合適的葉數量。如果在xgboost中設置max_depth為6的話,lightgbm設置為70~80是最合適的點,如果設置為127,lightgbm就已經過擬合了。
  2. min_data_in_leaf
    設置在葉子中的最小值。如果結點的值<=min_data_in_leaf,那么該結點就不再分裂了。該值依賴於num_leaves和數據集。如果設置過大,將會導致欠擬合。對於一個較大的數據集,設置為100~1000即可。
  3. max_depth
    這個參數和xgboost作用相同。在lightgbm中,用於設置樹的最大深度,和num_leaves用於控制過擬合。
加快訓練速度

括號內為取值范圍

  • 使用bagging:bagging_fraction:選擇bagging的特征比例(0~1);bagging_freq:bagging的頻率(1/2/3/...)
  • feature_fraction:特征采樣比例(0~1)
  • 使用較小的max_bin
  • 多線程訓練
提升准確率
  • 使用較大的max_bin
  • 使用較小的learning_rate和較大的num_iterations
  • 使用較大的num_leaves(可能導致過擬合)
  • 增大數據量
防止過擬合
  • 使用較小的max_bin
  • 使用較小的num_leaves
  • 使用較大的min_data_in_leafmin_sum_hessian_in_leaf
  • 使用bagging,設置bagging_fraction,bagging_freq
  • 使用數據采樣,設置feature_fraction
  • 設置正則化參數,lambda_l1,lambda_l2,增大min_gain_to_split,可防止微小的增益分裂
  • 設置max_depth


免責聲明!

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



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