XGBoost的缺点
- 每次迭代训练时需要读取整个数据集,耗时耗内存;
- 使用Basic Exact Greedy Algorithm计算最佳分裂节点时需要预先将特征的取值进行排序,排序之后为了保存排序的结果,费时又费内存;
- 计算分裂节点时需要遍历每一个候选节点,然后计算分裂之后的信息增益,费时;
- 生成决策树是level-wise级别的,也就是预先设置好树的深度之后,每一颗树都需要生长到设置的那个深度,这样有些树在某一次分裂之后效果甚至没有提升但仍然会继续划分树枝,然后再次划分…之后就是无用功了,耗时。
lightGBM的改进
1.直方图差加速:直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。内存消耗降低,计算上的代价也大幅降低。
2.leaf-wise:每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合。
3.特征并行和数据并行:特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。
4.直接支持类别特征:可以直接输入类别特征,不需要额外的0/1 展开,LightGBM 是第一个直接支持类别特征的 GBDT 工具。
参数名 | 含义 | 用法 |
---|---|---|
task | default=train | train,predict等 |
max_depth | 数的最大深度,leaf-wise从增益最大的点开始分裂,容易产生过拟合 | 过拟合时可以降低max_depth减少模型的复杂度 |
num_leaves | 每个决策树的最大叶子数量 | default=31,相当于数的深度为5 |
learning_rate | 学习率 | default=0.1 |
boosting_type | default=gbdt | 选择boosting类型,gbdt,rf等 |
feature_fraction | 选择特征比例 | 用来加速训练,防止过拟合 |
bagging_fraction | 在不进行重采样的情况下随机选择部分数据 | 用来加速训练,防止过拟合 |
early_stopping | 如果验证集的精度在连续的early_stopping中没有提升,将停止训练 | default=0 |
lambda_l1 | L1正则 | default=0 |
lambda_l2 | L2正则 | default=0 |
num_boost_round | 迭代次数 | default=100 |
bagging_seed | bagging用的随机种子 | default=3 |
num_threads | 线程数 | default=OpenMP_default |