机器学习算法实现(4):GBDT的两种实现——XGBoost、LightGBM

【系列开头】开这个系列是因为最近学习某些算法纸上谈兵太久,算法流程背的再熟,没有实现过就没法真正的理解算法的细节。这个系列要实现算法的顺序为逻辑回归、决策树(CART)、AdaBoost、GBDT。其他算法根据后续学习情况进行添加。

XGBoost和LightGBM的实现暂时先搁置一下,打算花一两天时间,通过阅读论文再结合网络上的资料先将其核心原理记录下来,供以后复习使用,力求做到简洁和易懂,但是仍然需要一些基础,比如GBDT等。

XGBoost核心技术与实现

XGBoost

首先是对于Tree Boosting的改进。

CART的目标函数借鉴了RGF的思想,增加一个新的正则化项(防止过拟合),对损失函数l做了个二阶近似(二阶泰勒展开)。

PS:正则项作用的解释——Bayes先验解释,把正则当成先验
L2正则,模型参数服从高斯分布,对参数加了分布约束,大部分绝对值很小;
L1正则,模型参数服从拉普拉斯分布,对参数加了分布约束,大部分取值为0。

使用shrinkage和column(feature) subsampling两种技术来防止过拟合。

其次是最重要的split finding算法。(近似算法、稀疏数据处理)
在树学习算法中大部分使用的是exact greedy算法,单机版的XGBoost也是如此,但是随着数据越来越大,内存放不下,以及由此产生的分布式处理的需求,一种近似算法应运而生。

简单来说该近似算法分为两步。第一步,对特征按照百分位选择一些候选划分点;第二步,将特征值映射到候选点划分的桶里,然后通过每个桶的信息来决定最优划分方案。

最后是系统设计部分。(column block、cache-aware access)

column block起初是为了减少排序的成本而将数据分割成的单元。每个block是CSC格式,在当前划分特征上进行排序。

Cache-aware Access pre-fecthing

Out-of-core Computation使用了两种技术:Block Compression、Block Sharding。

LightGBM

  • GOSS(Gradient-based One-Side Sampling)
    insight:gradients值大的样本对信息增益的贡献更大。
    保留gradients大的样本,随机丢掉小的样本。
  • EFB(Exclusive Feature Bundling)
    insight:稀疏特征大部分是无效的。
    bundle sparse features.

你可能感兴趣的:(炼丹笔记)