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

最新文章

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

热门文章

  1. iOS 利用FZEasyFile本地保存 和 常规保存
  2. T-SQL部分函数(转)
  3. 【t076】竞赛排名
  4. Vue中this的绑定
  5. AndroidStudio使用properties资源文件
  6. webpack的单vue组件(.vue)加载sass配置
  7. 使用UISegementControl实现简易Tomcat程序
  8. JavaScript动态广告弹出框
  9. qmake生成vcproj &amp; sln
  10. Linux经常使用的命令(21) - find参数具体解释