比快更快——微软LightGBM
2024-08-31 23:41:33
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
最新文章
- margin属性
- css3中webkit-box的用法
- little tips of painter.drawRect in Qt
- 【Effective Java】7、优先考虑泛型方法
- Codeforce Round #213 Div2
- Maven搭建SpringMVC+Hibernate项目详解
- Poj/OpenJudge 1094 Sorting It All Out
- python之7-2类的继承与多态
- JavaScript Arguments 实现可变参数的函数,以及函数的递归调用
- According to TLD or attribute directive in tag file, attribute value does not accept any expressions
- js超简单日历
- inno setup 1
- Eclipse 配置scala开发环境(windows)
- Python-Web框架之 - 利用SQLALchemy创建与数据库MySQL的连接, 详解用Flask时会遇到的一些大坑 !
- 从零开始搭建django前后端分离项目 系列六(实战之聚类分析)
- typescript静态属性,静态方法,抽象类,多态
- 【Scheme】Huffman树
- C#预处理器指令【转】
- PHP之旅5 php的函数
- javaweb 安全传输签名机制