GBDT进化->XGBoost & LightGBM简记

  • 很全面的阐释XGBoost: 集成学习之Boosting —— XGBoost

大体来看,XGBoost 在原理方面的改进主要就是在损失函数上作文章。

  1. 一是在原损失函数的基础上添加了正则化项产生了新的目标函数,这类似于对每棵树进行了剪枝并限制了叶结点上的分数来防止过拟合。
  2. 二是对目标函数进行二阶泰勒展开,利用二阶导信息来最小化目标函数。Gradient Boosting只利用了一阶导信息,而 XGBoost 引入二阶导的一大好处是可以推导出一种新的增益计算方法,事实证明采用新的增益计算方法在优化目标函数上更加有效,精确度上也胜过传统的 GBDT。

  • XGBoost 与 GBDT 区别:
  1. 传统 GBDT 在优化时只用到一阶导数信息,XGBoost 则对目标函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。另外 XGBoost 工具支持自定义损失函数,只要函数可一阶和二阶求导。
  2. XGBoost 在损失函数中加入正则化项,用于控制模型的复杂度,防止过拟合,从而提高模型的泛化能力
  3. 传统 GBDT 采用的是均方误差作为内部分裂的增益计算指标(因为用的都是回归树),而 XGBoost 使用的是经过优化推导后的式子,即顶部链接文章中式
  4. XGBoost 添加了对稀疏数据的支持,在计算分裂增益时不会考虑带有缺失值的样本,这样就减少了时间开销。在分裂点确定了之后,将带有缺失值的样本分别放在左子树和右子树,比较两者分裂增益,选择增益较大的那一边作为默认分裂方向
  5. 传统 GBDT 在损失不再减少时会停止分裂,这是一种预剪枝的贪心策略,容易欠拟合。XGBoost采用的是后剪枝的策略,先分裂到指定的最大深度 (max_depth) 再进行剪枝。而且和一般的后剪枝不同, XGBoost 的后剪枝是不需要验证集的。
  • 说了这么多 XGBoost 的优点,其当然也有不完美之处,因为要在训练之前先对每个特征进行预排序并将结果存储起来,对于空间消耗较大。另外虽然相比传统的 GBDT 速度是快了很多,但和后来的 LightGBM 比起来还是慢了不少

酷文章:快的不要不要的lightGBM

  • XGBoost 对比 LightGBM的不足:
  1. 每次迭代训练时需要读取整个数据集,耗时耗内存;
  2. 使用Basic Exact Greedy Algorithm计算最佳分裂节点时需要预先将特征的取值进行排序,排序之后为了保存排序的结果,费时又费内存;
  3. 计算分裂节点时需要遍历每一个候选节点,然后计算分裂之后的信息增益,费时;
  4. 生成决策树是level-wise级别的,也就是预先设置好树的深度之后,每一颗树都需要生长到设置的那个深度,这样有些树在某一次分裂之后效果甚至没有提升但仍然会继续划分树枝,然后再次划分....之后就是无用功了,耗时。

为了避免上述XGB的缺陷,并且能够在不损害准确率的条件下加快GBDT模型的训练速度,lightGBM在传统的GBDT算法上加了两个技术:

  1. 单边梯度采样 Gradient-based One-Side Sampling (GOSS);
  2. 互斥稀疏特征绑定 Exclusive Feature Bundling (EFB)

你可能感兴趣的:(GBDT进化->XGBoost & LightGBM简记)