比快更快——微软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调参
几个重要的参数调节:
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