目录
- LightGBM简介
- GOSS算法介绍
- EFB算法介绍
3.1 捆绑簇生成算法
3.2 互斥特征合并算法 - LightGBM参数说明
- 补充:直方图算法介绍
- 参考文献及链接
1. LightGBM简介
LightGBM是一个基于决策树学习算法的快速的、支持分布式的、高性能的梯度提升框架。其主要具有以下优点:
- 速度快
- 基于直方图算法,直方图做差,加速2倍
- 直接支持类别特征
- bagging
- feature sub-sampling
- 带深度限制的leaf-wise的树的生长方式
- 占用内存小
- 支持分布式
- 更好的准确率
- 支持GPU并行学习
- 能够处理大规模数据
- 支持多种并行学习方式:数据并行、特征并行和投票并行
- 支持DART(drop out),避免过拟合
2. GOSS算法介绍
1)算法思想
梯度大的样本贡献更大的信息增益,因此在采样时,为了保证信息增益的精度,保留大梯度的样本,而对小梯度样本进行随机采样
2)输入
- 训练集I
- 大梯度样本采样率 a;小梯度样本采样率 b;权重更新比率
$fact=\frac{1-a}{b}$ - 损失函数 loss
- 弱学习器 L
- 学习迭代轮数 d
- 大梯度样本数topN=a*len(I); 小梯度样本数randN=b*len(I)
- 样本的权重向量 w
3)输出
- 训练好的集成模型 models
4)算法过程及注释说明
3. EFB算法介绍
3.1 捆绑簇生成算法
1) 算法思想(类比聚类思想)
冲突小的特征在同一捆绑簇中(同一条数据中很少出现两个特征值均为非零值即为冲突小)
冲突大的特征在不同的捆绑簇中
2) 输入
- 特征集合 F
- 最大冲突数阈值 K
- 图对象 G(节点表示特征,边表示冲突程度)
- 按degree排序的节点集合
$searchOrder \leftarrow G.sortByDegree()$ - 特征冲突数集合
$bundlesConflict\leftarrow${}
3) 输出
- 捆绑簇集合 bundles(每个元素为一个捆绑簇)
4) 算法过程及注释
3.2 互斥特征合并算法(基于直方图算法)
1) 算法思想
基于直方图算法,将不同特征的特征值离散化后,通过为特征添加一个偏置offset来区别开不同特征的特征值,从而将这些不同特征合并为一个合并特征。
2) 输入
- 训练集数据数 numData
- 一个捆绑簇的特征集合 F
- 一个捆绑簇中bins的取值范围 binRanges
- 一个合并特征的总bins数 totalBin
3) 输出
- 合并特征的特征图,具体包括 newBin和binRanges
4) 算法过程及注释
4. LightGBM重要参数说明
4.1 LightGBM的参数简介
LightGBM的参数主要包括以下几类:
- Core Parameters
- Learning Control Parameters
- IO Parameters
- Objective Parameters
- Metric Parameters
- Network Parameters
- GPU Parameters
4.2 Core Parameters参数
| Index | Core Parameters | 默认值 | 含义 | 用法 |
|---|---|---|---|---|
| 1 | task | default = train | 数据的用途 | 可以用作train/predict/refit |
| 2 | objective | default = regression | 学习的任务类型 | 回归:regression/regression_l2/regression_l1;二分类:binary;多分类:multiclass and so on |
| 3 | boosting | default = gbdt | 选择要用的集成学习算法 | gbdt/gbrt/ rf/ random_forest,/dart/ goss |
| 4 | data | default = “” | 指定训练集的文件路径 | |
| 5 | valid | default = “” | 指定验证集的文件路径,支持多个验证集 | |
| 6 | num_iterations | default = 100 | 训练的迭代次数 | >=0;通常大于100 |
| 7 | learning_rate | default = 0.1 | 收缩因子,类似于学习率,为每一棵树都添加一个收缩因子,从而减少每棵树的影响 | 通常为0.1,0.01,0.003,0.001 |
| 8 | num_leaves | default = 31 | 每棵树的最大叶子数 | 防止过拟合 |
| 9 | tree_learner | default = serial | 控制训练时的并行方式 | serial:不并行;feature:特征并行;data:数据并行;voting:投票并行 |
| 10 | device_type | default = cpu | 指定训练的硬件设备 | cpu/gpu |
| 11 | seed | default = None | 设置随机种子 | int型 |
4.3 Learning Control Parameters
| Index | Learning Control Parameters | 默认值 | 含义 | 用法 | 注意事项 |
|---|---|---|---|---|---|
| 1 | max_depth | default = -1 | 控制单棵树的最大深度 | int型,用来避免过拟合;小于0表示对树的深度没有限制 | |
| 2 | min_data_in_leaf | default = 20 | 控制每个叶子节点的最小样本数 | int型,>=0,用来避免过拟合 | |
| 3 | min_sum_hessian_in_leaf | default = 1e-3 | 控制每个叶子节点的最小二阶梯度和 | int型,>=0,用来避免过拟合 | |
| 4 | bagging_fraction | default = 1.0 | 控制抽样的样本数 | double型,[0,1],用来避免过拟合,同时能够加快训练 | 若想进行bagging操作,bagging_freq应该取非零值 |
| 5 | bagging_freq | default = 0 | 控制进行bagging的频率 | int型,取值为0表示不进行bagging,取值为k表示每k轮迭代进行一次bagging | 若想进行bagging操作,bagging_fraction取值应该小于等于1 |
| 6 | bagging_seed | default = 3 | 控制bagging的随机种子 | int型 | |
| 7 | feature_fraction | default = 1.0 | 控制每一轮迭代训练随机选择的特征数 | double型,[0,1],用来避免过拟合,同时能够加快训练 | |
| 8 | feature_fraction_seed | default = 2 | 控制随机选择特征的随机种子 | int型 | |
| 9 | early_stopping_round | default = 0 | 控制早停的最近轮数,如果验证集上的某一评价指标在最近的early_stopping_round轮内没有提升,则停止训练 | int型,<=0表示没有早停控制 | |
| 10 | max_delta_step | default = 0.0 | 控制输出的最大叶子数,其最大叶子数为learning_rate * max_delta_step | double型,<= 0表示没有限制 | |
| 11 | lambda_l1 | default = 0.0 | L-1范数的正则化系数 | double型,用来控制拟合程度,同时有降维的效果 | |
| 12 | lambda_l2 | default = 0.0 | L-2范数的正则化系数 | double型,用来控制拟合程度 | |
| 13 | min_gain_to_split | default = 0.0 | 控制节叶点是否分割的最小增益 | double型 | |
| 14 | drop_rate | default = 0.1 | 控制dropout时,前面的树模型被用到的概率 | double型,[0.0,1.0],用来降低拟合程度 | 只在boosting = dart需要设置 |
| 15 | max_drop | default = 50 | 控制在一轮boosting 迭代中,被忽略的树模型的最大值 | int型,<=0 表示没有限制 | 只在boosting = dart需要设置 |
| 16 | skip_drop | default = 0.5 | 控制在一轮boosting 迭代中,不进行dropout的概率 | double型,[0.0,1.0], | 只在boosting = dart需要设置 |
| 17 | xgboost_dart_mode | default = false | 控制是否使用xgboost中dart的模式 | bool型 | 只在boosting = dart需要设置 |
| 18 | drop_seed | default = 4 | 控制dropout的随机种子 | int型 | 只在boosting = dart需要设置 |
| 19 | top_rate | default = 0.2 | 控制大梯度样本的保留比例 | double型, | 只在boosting = goss时需要设置 |
| 20 | other_rate | default = 0.1 | 控制小梯度样本的保留比例 | double型 | 只在boosting = goss时需要设置 |
| 21 | min_data_per_group | default = 100 | 设置每一个类别组的最小样本数 | int型,>0 | 用在类别特征 |
| 22 | max_cat_threshold | default = 32 | 设置类别特征的最大阈值点 | int型,>0 | 用在类别特征 |
| 23 | cat_l2 | default = 10.0 | 在类别分割时设置L-2正则化 | double 型 | 用在类别特征 |
| 24 | cat_smooth | default = 10.0 | 减小类别特征中的噪声的影响,特别是数据量小的时候 | double型 | 用在类别特征 |
| 25 | top_k | default = 20 | 设置该值越大,投票并行时准确率会越高,不过训练时间越长 | int型 | 用在投票并行中 |
4.4 IO Parameters
| Index | IO Parameters | 默认值 | 含义 | 用法 | 注意事项 |
|---|---|---|---|---|---|
| 1 | max_bin | default = 255 | 设置特征值被离散化了的最大bins数 | int型,>1,较小的值可能会降低训练精度,但却可以加快训练 | |
| 2 | min_data_in_bin | default = 3 | 设置每个bin的最小数据数 | int型,>0,设置该参数用来避免一个bin一条数据的情况,避免过拟合 | |
| 3 | enable_bundle | default = true | 设置是否采用互斥特征捆绑算法(EFB) | bool,设置为false在训练稀疏数据集时可能会降低训练速度 | |
| 4 | max_conflict_rate | default = 0.0 | 设置合并特征的最大冲突率 | double型,[0.0,1.0],取值为0会得到更好的训练精度,取值越大,训练速度越快 | |
| 5 | is_enable_sparse | default = true | 设置是否使用稀疏优化 | bool型 | |
| 6 | use_missing | default = true | 设置是否对缺失值进行特殊处理 | bool型 | |
| 7 | label_column | default = " | 指定标记列 | int or string型 | |
| 8 | categorical_feature | default = " | 指定类别特征 | multi-int or string型 |
4.5 Objective Parameters
| Index | Objective Parameters | 默认值 | 含义 | 用法 | 注意事项 |
|---|---|---|---|---|---|
| 1 | num_class | default = 1 | 设置多分类任务的类别数 | int型,>0, | 仅在多分类任务中需要设置 |
| 2 | is_unbalance | default = false | 设置训练集数据是否平衡 | bool型 | 应用在二分类中,该参数不能和scale_pos_weight参数同时设置,只设置一个 |
| 3 | scale_pos_weight | default = 1.0 | 设置正类别的权重 | double | 应用在二分类中,该参数不能和is_unbalance参数同时设置,只设置一个 |
4.6 Metric Parameters
- metric:default="",设置验证集的评价指标,LightGBM支持采用多个指标,用逗号分隔。可能的取值包括:
- “”:表示性能评估指标会根据不同的任务来进行调整
- “None”:表示没有性能评估指标
- l1:表示采用绝对值损失
- l2:表示采用平方损失
- l2_root:表示采用平方根损失
- huber:表示采用huber损失
- auc:表示采用auc评价指标
- binary_logloss:表示采用二分类的对数损失
- binary_error:表示采用错误率指标
- multi_logloss:表示采用多分类任务的对数损失
- multi_error:表示采用多分类任务的错误率指标
其他指标还包括: quantile、mape、fair、gamma、gamma_deviance、tweedie、ndcg、map、xentropy、xentlambda、kldiv
- metric_freq: default = 1,设置指标输出的频率
5. 补充:直方图算法构建决策树
1)输入
- 训练集
$X$, - 当前树模型
$T_{C-1}(X)$ - 样本
$x_i$的损失函数$L(y_i,T_{C-2}(x_i))$对前一轮模型的$T_{C-2}(x_i)$的一阶梯度G - 样本
$x_i$的损失函数$L(y_i,T_{C-2}(x_i))$对前一轮模型的$T_{C-2}(x_i)$的二阶梯度H
2)输出
- 信息增益最大的分裂节点
$p_m$、分裂特征$f_m$和分裂特征的bin的值(即分裂值)$v_m$
- 算法过程及注释说明
4)基于直方图算法构建决策树的优缺点
- 优点
占用内存小,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值一般用8位整型存储就可以,内存消耗可以降低为原来的1/8
计算速度快,
预排序算法每遍历一个特征值就需要计算一轮分裂的增益,而直方图算法只需要计算#bins次,时间复杂度从O(#data*_#features)优化到O(#bins*#features)
- 缺点
预处理能够忽略零值特征,减少训练代价;而直方图不能对稀疏特征进行优化,只是计算累加值(累加梯度和样本数)。但是,LightGBM对稀疏特征进行了优化:只用非零特征构建直方图
6. 参考文献
- LightGBM调参
- Guolin Ke, Qi Meng, Thomas Finley, Taifeng Wang, Wei Chen, Weidong Ma, Qiwei Ye, Tie-Yan Liu. “LightGBM: A Highly Efficient Gradient Boosting Decision Tree.” Advances in Neural Information Processing Systems 30 (NIPS 2017), pp. 3149-3157.
- 直方图优化算法
- 玩转LightGBM视频