【本文章由高校教师徐博士撰写】
2025年的第一篇机器学习系列文章,我们从Boosting算法开始讲起。
先前我们就已经讲解过,随机森林是通过Bagging(袋装)的方式将多棵决策树集成起来,各决策树之间是独立并行的,也就是所有决策树可以同时构建并且互不影响。
而除了Bagging,Boosting(提升)是另一种重要的集成方式。
Boosting的核心思想是通过依次构建多个基学习器,后一个基学习器尝试纠正前一个的错误,从而使集成模型更加准确。
因此Boosting算法中基学习器是串行的,基学习器之间有强依赖关系。
Bagging和Boosting示意图
常见的Boosting算法有:AdaBoost、GBDT、极限梯度提升(eXtreme Gradient Boosting,XGBoost)和轻量梯度提升机(Light Gradient Boosting Machine,LightGBM)。
AdaBoost和GBDT分别于1995和1999年提出,是经典Boosting算法;
XGBoost和LightGBM则是对经典算法的改进版本,是目前最常用的两种Boosting算法。
今天这篇文章,我们将着重介绍XGBoost和LightGBM这两种经典算法。干讲理论太过枯燥,我们将用一个简单的例子,带大家理解如何运用。
内容有些长,希望大家耐心观看。
XGBoost如何计算?
首先结合一个简单例子讲解XGBoost内部是怎么计算的,争取初中生也能理解。
我们看如下数据,由5条观测组成,目标是用年龄和性别变量,构建XGBoost模型预测是否饮酒(二分类任务)。
第1步:给出初始预测概率
对于二分类任务,XGBoost的初始预测概率一般是目标类别的平均概率:
表示所有观测的饮酒初始预测概率都为0.6。
第2步:计算梯度和Hessian
XGBoost计算每条观测的梯度和Hessian。
梯度和Hessian分别是目标函数对预测概率的一阶和二阶导数。对于二分类任务,我们一般使用对数损失函数作为目标函数,在该目标函数下,
√梯度,也称残差,计算式为
√Hessian计算式为
据此我们得到
第3步:构建XGBoost树
[1]从残差开始
XGBoost应用CART算法构建每棵树,每棵树都从根结点开始,根节点中包括所有观测的残差
[2]计算相似度得分
对于二分类任务,相似度得分(,SS)的计算式为:
为正则化参数,起到抗过拟合作用,在软件中的默认值一般为1,这里也设为1。
对于当前节点,
[3]确定最佳决策规则
通过逐一计算所有决策规则的增益(Gain),以Gain最大时的规则作为最佳决策规则划分当前节点的残差。Gain的计算式为
表示划分后左侧和右侧节点的相似度得分之和减去原节点相似度得分。
接下来让我们来演示一下。
(1)我们首先尝试用性别(男、女)来划分残差
(2)我们接下来尝试用年龄来划分残差
由于年龄是连续型变量,我们首先对年龄从小到大排序,计算相邻年龄的平均值,
依次使用这四个平均值作为阈值来划分残差,并计算不同阈值的增益。
首先使用年龄<23划分残差:
此时
另外三个阈值也进行同样操作:
在性别和四个年龄阈值的分割方式中,年龄<39.5的Gain最大,因此我们把它作为该节点的决策规则。
[4]建立决策树
按照步骤[3]继续不断划分节点中的节点,建立一棵完整的决策树。
当前的树结构是:
右节点中残差相等,无需进一步划分。对于左节点,我们只考虑该节点中的观测。
按步骤[3]的做法划分左节点的残差,
这里只有年龄<23时的Gain为正数,以此为决策规则划分该节点。
最终第一棵完整决策树是:
第4步:计算叶节点的输出值
每个叶节点的输出值需要统一,计算式为
n为各叶节点中的观测数,默认为1。
根据该式,各节点的输出值为
第5步:更新预测概率
还记得吗,当前所有观测的饮酒预测概率都是0.6,这是没有区分性的。
因此我们希望使得实际饮酒和实际不饮酒观测之间的预测概率的差距尽量增大,从而区分两者,这就需要通过更新预测概率实现。
对于二分类任务,更新预测概率需经过下面步骤,涉及概率和线性值的转换。
以观测①所在叶节点为例,
1.根据公式将原始预测概率0.6转换为线性值0.405;
2.根据公式更新线性值,
为学习率,软件中的默认值一般为0.3,用于控制模型迭代速度和收敛性。
将各值代入,得到更新后的线性值为;
3.根据公式将更新后的线性值转换回概率值,得到更新后的预测概率
。
同样地,可以得到其它观测更新后的预测概率:
相比将所有观测预测为0.6,更新后的预测概率增大了实际饮酒和实际不饮酒观测之间的差距,表明我们在正确方向上前进了一小步。
第6步:使用新的预测概率计算梯度和Hessian
第7步:重复上面的第3-6步
接下来只要不断重复相同过程,每次构建新的树更新预测概率并计算残差,直至残差减少至一定程度或达到我们预先设定的最大迭代次数。
用一张简单但不严谨(其中还涉及概率和线性值之间的转换)的图来表示本示例的预测概率计算过程,最终预测概率基于R软件计算。
以上就是XGBoost算法。
LightGBM是什么?
LightGBM可以看作是XGBoost的简化版。
通过加入互斥特征捆绑、直方分桶、叶子优先生长和单边梯度抽样技术,LightGBM能在预测效果同XGBoost相当的前提下运行速度更快,尤其对于大规模数据。
目前LightGBM在Kaggle竞赛中广泛应用,很重要的一个原因就是它相比其它模型运行速度快并且效果也在最佳之列。
接下来,我们一起来看看这4种技术。
直方分桶(Histogram-Based Splitting)
从上面的例子中,我们可以看到,XGBoost需要遍历每个变量的所有可能取值来确定最佳划分值,这对那些有大量取值多的变量的数据集将非常慢。
而LightGBM的做法是先将变量值按范围分桶,比如年龄变量可以分成“0-20岁”、“20-40岁”和“>40岁”三个桶,之后只在这些分桶上寻找最佳的划分方式,大大减少了计算量。
互斥特征捆绑(Exclusive Feature Bundling,EFB)
EFB是将一些不同时取非零值(互斥)的变量合并为一个变量,这对于高维稀疏数据特别有用,将很大程度减少变量数目,从而减少计算量。
叶子优先生长(Leaf-Wise Growth)
传统决策树是从根节点开始,每一层的所有节点同时分裂,这种按层生长的缺点是即便某些节点的残差已经很小还是会占用计算资源。
但叶子优先的策略是先看哪个(1-2个)节点的残差最大,优先分裂那个节点。
通过这种方式就可以快速减少整体残差。
单边梯度抽样(Gradient-based One-Side Sampling,GOSS)
GOSS是对节点中的样本进行不均匀采样,保留梯度/残差绝对值大的样本,按比例随机保留梯度小的样本,从而减少计算量,加速训练。
例如,在某个节点中有如下8条观测,通过GOSS保留梯度最大的4条观测,余下观测随机保留2条。之后基于保留的6条观测进一步划分。
看了这些技术,有读者可能会想:LightGBM以这种“粗放”的方式训练,预测效果真的可以保证吗?
我们来看看LightGBM的作者开展的同XGBoost的对比实验结果。
√对于预测效果,在这5个数据集上,LightGBM的预测效果都是略优于XGBoost的。
√对于运行时间,LightGBM比XGBoost快了不止一个数量级。
Boosting算法优缺点
√优点
1.预测表现稳定:通过集成多棵决策树,Boosting算法的预测表现通常较好;
2.抗过拟合能力较强:通过加入正则化项、限制树的深度、控制叶节点数量等,Boosting算法能在一定程度上降低过拟合风险;
3.不需要太多数据预处理:Boosting算法能容忍数据中存在缺失值,并且无需对数据进行归一化。
√缺点:
1.计算开销大:需要迭代训练大量决策树,训练过程是串行的,当数据量较大时训练时间往往较长;
2.对噪声和异常值敏感:当数据中有较多噪声或异常值时,Boosting算法可能会过度拟合这些数值,导致预测效果不佳;
3.模型解释性较差:决策过程相对不透明,不易于向不熟悉该算法的个体解释具体决策过程;
4.超参数调优较复杂:算法的超参数(例如学习率、正则化系数、迭代次数、树的深度等)较多,并且对算法效果影响较大,需要合理设置。
今天这篇文章就分享到这里,如有疑问,欢迎评论留言,一起交流。
【本文章由高校教师徐博士撰写】
关于郑老师团队及公众号
大型医学统计服务公众号平台,专注于医学生、医护工作者学术研究统计支持,我们是你们统计助理
我们开展对临床预测模型、机器学习、医学免费数据库NHANES、GBD数据库、孟德尔随机化方法、MIMIC 一对一R语言指导开展统计分析(一年内不限时间,周末、晚上均统计师一对一指导)。
①指导学习R语言基本技巧
②全程指导课程学习
③课程R语言代码运行bug修复
④支持学员一篇SCI论文的数据分析
详情联系助教小董咨询(微信号aq566665)