lgb中bin的理解与调整
LightGBM相关了解
- 基于预排序的算法
针对每个特征,所有数据根据 在该特征下的特征值 进行排序; 计算所有可能的分割点带来的分割增益,确定分割点;分为左右子树。
- 直方图算法
针对每个特征(连续型数值),使用直方图将数据 在该特征下的特征值 离散为 k个bin,并转化为bin的label; 计算k个bin分别作为分割点带来的分割增益,确定分割点;分为左右子树,只要确定了左子树所有特征对应直方图,用父节点直方图相减,即可得到右节点直方图。
-
带有深度限制的按叶子生长 (leaf-wise) 算法
Level-wise的决策树生长策略属于不假思索思维,认为每层的每个节点都要分割。
Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
按层生长 (level-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 },关注下dart :Dropouts 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_fraction 和 bagging_freq 参数来使用 bagging 方法 |
通过设置 feature_fraction 参数来使用特征的子抽样 |
使用较小的 max_bin
|
使用 save_binary 在未来的学习过程对数据加载进行加速 |
使用并行学习, 可参考 并行学习指南 |
针对更好的准确率
说明 |
---|
使用较大的 max_bin (学习速度可能变慢) |
使用较小的 learning_rate 和较大的 num_iterations
|
使用较大的 num_leaves (可能导致过拟合) |
使用更大的训练数据 |
尝试 dart
|
处理过拟合
说明 |
---|
使用较小的 max_bin
|
使用较小的 num_leaves
|
使用 min_data_in_leaf 和 min_sum_hessian_in_leaf
|
通过设置 bagging_fraction 和 bagging_freq 来使用 bagging |
通过设置feature_fraction 来使用特征子抽样 |
使用更大的训练数据 |
使用 lambda_l1 , lambda_l2 和 min_gain_to_split 来使用正则 |
尝试 max_depth 来避免生成过深的树 |