8_Xgboost&LightGBM&Catboost

269 阅读5分钟

Xgboost

  1. xgboost是gbdt改进,都是基于boosting思想,贪心策略(保证可收敛且计算快捷),每次拟合当前数据集最好的树然后累加
  2. boosting算法都是将目标函数用泰勒展开,因为boosting算法目标函数是一个累加公式。阶数越高和原函数越接近,但是计算越复杂。gbdt用1阶(y-y'),相当于平方差求导,即拟合梯度;也可以说是拟合残差。
  3. xgboost是用二阶泰勒,提高精度,同时为了避免过拟合增加了惩罚项控制树的叶子节点个数和分数。
  4. Boosting算法是减少偏差,但是会增加方差。Bagging是减少方差,但是会增加偏差。
  5. xgboost主要是在boosting思想上,优化如何找到好的特征划分构建决策树(捕获非线性,特征重要程度可解释)
  6. shrink机制:每棵树有一个学习率,相当于加权组合

基本原理

  • 从目标函数出发来看xgboost是如何构建的
  1. 目标函数与惩罚项解析

  2. xgboost算法迭代过程

因为xgboost算法的目标函数是一个累加公式,或者说boosting算法的目标函数都是一个累加公式。
直接对这样一个函数求最优值是无法计算的,因此一般用泰勒展开
  1. 泰勒展开:注意误差函数和目标函数区别

4.得到展开后的目标函数,如何去构建决策树(思想)

首先要知道前提是构建一个决策树,因此目标函数中的f(x)就是一个决策树。
那么如何具体化这个f(x), 是其用一个变量w表示,而且这个变量还要和输入有关。
进行对目标函数求最优得到的变量w,就是对输入一个x时这个树对应的输出。
这里w用叶子节点的分数来表示,所以在构建决策树时,只要划分特征时能够得到最终的叶子节点分数满足w,那么就说明划分特征是正确的,最优的操作。
以上,便是xgboost如何从目标函数出发来规定如何划分特征构建树是最优的

上述可以看到,w=G/(H+λ)时,目标函数取到最小值。
因此最好的一棵树就是叶子节点的输出等于w。那么如何做?
即如何保证该思想在构建树的过程中实现:即学习策略
  1. 学习策略(保证思想的实际构建树策略)
  • 精确算法:遍历每个特征的取值划分

  • 基于直方图的近似:对特征取值进行分桶

分桶好后,特征桶的切分点如何选:

  1. 其它优化点

总结:

  1. xgboost是在目标函数上引入正则项,然后泰勒展开推导出w的一元二次方差,最后根据求最优w求出划分节点的表达式,只和一阶导,二阶导有关。进而得出划分节点的策略。
  2. 在构建树过程加入优化操作

LightGBM

  1. lightgbm是在xgboost的基础上,做了3个方向的优化。因此xgboost的什么目标函数,泰勒展开,划分节点在lgb上也是一样的。(样本数量,特征数量,候选点数量),这三个操作都可以设置参数来调节。
  2. lgb分裂叶子节点时是按层生长,leaf-wise,每次从当前所有层的叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环,有可能会生长出比较深的决策树(比如一直是),产生过拟合。 xgboost是每次判断该层左右哪个节点生长。

原理

  • 减少样本数量:GOSS 基于一阶梯度来筛选样本,减少样本数量

  • 减少特征数量:EFB

通过特征绑定减少特征数量:
绑哪些:有权无向图得到互斥率绑定互斥率小的
如何绑:加偏移使绑定的特征取值包含旧特征

  • 减少划分点:HIST

  • leaf-wise

level-wise即同一层,左右节点都要划分,
leaf-wise在所有层找到最好的节点来划分

常见参数

基本参数:学习策略
1. nums_leaves  防止过拟合,过拟合减少
2. max_depth  防止过拟合,过拟合减少
3. n_estimators  防止过拟合,过拟合减少
4. learning_rate  欠拟合减小学习率,收敛慢提高学习率

随机性
1. bagging_fraction, 多少次进行一次bagging,
2. feature_fraction, 选取多少特征,0.8

dart:模仿dropout,防止过拟合,在boosting过程中随机减一些树,
  • 调参建议
  1. 随机探索
    • 尽可能多记录不同metric
    • 尝试极端方法
    • 变量重要性
  2. 顺序搜索
    • 首先调整学习率+深度,再调整bagging_frac和feature_frac
  3. 贝叶斯包:hyperopt,基于贝叶斯方法的优化方法,花费时间极长
    • 已经调好的参数在附近范围,未调的参数选择较大范围
  4. 尽量形成一个pipeline,每晚跑第二天看结果

Catboost

常见面试题