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調參
幾個重要的參數調節:
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就已經過擬合了。min_data_in_leaf
設置在葉子中的最小值。如果結點的值<=min_data_in_leaf
,那么該結點就不再分裂了。該值依賴於num_leaves
和數據集。如果設置過大,將會導致欠擬合。對於一個較大的數據集,設置為100~1000即可。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_leaf
和min_sum_hessian_in_leaf
- 使用bagging,設置
bagging_fraction
,bagging_freq
- 使用數據采樣,設置
feature_fraction
- 設置正則化參數,
lambda_l1
,lambda_l2
,增大min_gain_to_split
,可防止微小的增益分裂 - 設置
max_depth