[转载]LightGBM:Focus on Parameters | lgb提升树参数调整技巧

2020年1月9日 0 作者 折纸

原文地址

lgb中bin的理解与调整


LightGBM相关了解

LightGBM好文分享

  • 基于预排序的算法

针对每个特征,所有数据根据 在该特征下的特征值 进行排序; 计算所有可能的分割点带来的分割增益,确定分割点;分为左右子树。


  • 直方图算法

针对每个特征(连续型数值),使用直方图将数据 在该特征下的特征值 离散为 k个bin,并转化为bin的label; 计算k个bin分别作为分割点带来的分割增益,确定分割点;分为左右子树,只要确定了左子树所有特征对应直方图,用父节点直方图相减,即可得到右节点直方图。


  • 带有深度限制的按叶子生长 (leaf-wise) 算法

Level-wise的决策树生长策略属于不假思索思维,认为每层的每个节点都要分割。
Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。


按层生长 (level-wise)

按层生长 (level-wise)


按叶子生长 (leaf-wise)

按叶子生长 (leaf-wise)


核心参数

参数 默认值 类型 说明
config “” string 配置文件路径
task train enum options={ train, predict, convert_model }
application regression enum options={ regression, regression_l1,......,binary, multiclass,......}
boosting gbdt enum options={ gbdt, rf, dart, goss},关注下dartDropouts meet Multiple Additive Regression Trees
data “” string 训练数据
valid “” multi-string 验证/测试 数据,支持多验证数据集, 以” , “分割
num_iterations 100 int boosting 的迭代次数
learning_rate 0.1 double 学习率
num_leaves 31 int 一棵树上的叶子数
tree_learner serial enum options={ serial, feature, data, voting } 特征/数据/投票并行
num_threads OpenMP_default int LightGBM 的线程数
device cpu options={ cpu, gpu }

学习控制参数

参数 默认值 类型 说明
max_depth -1 int 树的深度
min_data_in_leaf 20 int 一个叶子上数据的最小数量. 可以用来处理过拟合
min_sum_hessian_in_leaf 1e-3 double 一个叶子上的最小 hessian 和
feature_fraction 1.0 double 随机选择部分特征
feature_fraction_seed 2 int 随机数种子
bagging_fraction 1.0 double 在不进行重采样的情况下随机选择部分数据
bagging_freq 0 int bagging 的频率, 0 意味着禁用 bagging. k 意味着每 k 次迭代执行bagging
bagging_seed 3 int bagging 随机数种子
early_stopping_round 0 int 如果一个验证集的度量在 early_stopping_round 循环中没有提升, 将停止训练
lambda_l1 0 double L1 正则
lambda_l2 0 double L2 正则
min_split_gain 0 double 执行切分的最小增益

IO参数

参数 默认值 类型 说明
max_bin 255 int 连续值离散化时bin的最大个数
min_data_in_bin 3 int 单个bin含有的最小数, 使用此方法避免 one-data-one-bin(可能会过度学习)
output_model LightGBM_model.txt string 输出的模型文件名
input_model “” string 输入的模型文件名
output_result LightGBM_predict_result.txt string prediction 任务的预测结果文件名
model_format text multi-enum 可选项={ text, proto }, 保存和加载模型的格式
verbosity 1 int <0 = 致命的, =0 = 错误 (警告), >0 = 信息
header false bool 如果输入数据有标识头, 则在此处设置 true
save_binary false bool 如果设置为 true LightGBM 则将数据集(包括验证数据)保存到二进制文件中。 可以加快数据加载速度。
label “” string /int 指定标签列; 用于索引的数字, e.g. label=0 意味着 column_0 是标签列
weight “” string /int 列的指定; 用于索引的数字, e.g. weight=0 表示 column_0 是权重点
ignore_column “” string 在训练中指定一些忽略的列
categorical_feature “” string 指定分类特征; 用数字做索引, e.g. categorical_feature=0,1,2 意味着 column_0, column_1 和 column_2 是分类特征
bin_construct_sample_cnt 200000 int 用来构建直方图的数据的数量

目标参数(关于设计loss的)

参数 默认值 类型 说明
sigmoid 1.0 double sigmoid 函数的参数. 将用于 binary 分类 和 lambdarank
gaussian_eta 1.0 double 控制高斯函数的宽度的参数. 将用于 regression_l1 和 huber losses
is_unbalance false bool 用于 binary 分类 ,如果培训数据不平衡 设置为 true
num_class 1 int 只用于 multiclass 分类

度量参数

参数 默认值 类型 说明
metric {l2 for regression}, {binary_logloss for binary classification}, … 适配各不同任务不同评价指标

GPU参数

参数 默认值 类型 说明
gpu_device_id -1 int
gpu_use_dp false bool 设置为 true 在GPU上使用双精度GPU (默认使用单精度)

参数优化

针对 Leaf-wise (最佳优先) 树的参数优化

参数 说明
num_leaves 理论上, 借鉴 depth-wise 树, 我们可以设置 num_leaves = 2^(max_depth),但是最好让其小于 2^(max_depth)。比如num_leaves 可以设置为 127 时, 127有可能会导致过拟合, 而将其设置为 70 或 80 时可能会得到比 depth-wise 树更高的准确率
min_data_in_leaf 这是处理 leaf-wise 树的过拟合问题中一个非常重要的参数. 它的值取决于训练数据的样本个树和 num_leaves. 将其设置的较大可以避免生成一个过深的树, 但有可能导致欠拟合. 实际应用中, 对于大数据集, 设置其为几百或几千就足够了.
max_depth 也可以利用 max_depth 来显式地限制树的深度.

针对更快的训练速度

说明
通过设置 bagging_fractionbagging_freq 参数来使用 bagging 方法
通过设置 feature_fraction 参数来使用特征的子抽样
使用较小的 max_bin
使用 save_binary 在未来的学习过程对数据加载进行加速
使用并行学习, 可参考 并行学习指南

针对更好的准确率

说明
使用较大的 max_bin (学习速度可能变慢)
使用较小的 learning_rate 和较大的 num_iterations
使用较大的 num_leaves (可能导致过拟合)
使用更大的训练数据
尝试 dart

处理过拟合

说明
使用较小的 max_bin
使用较小的 num_leaves
使用 min_data_in_leafmin_sum_hessian_in_leaf
通过设置 bagging_fractionbagging_freq 来使用 bagging
通过设置feature_fraction 来使用特征子抽样
使用更大的训练数据
使用 lambda_l1, lambda_l2min_gain_to_split 来使用正则
尝试 max_depth 来避免生成过深的树