☰
【机器学习】XGBoost 回归
2026/10/13 9:53:23 网站建设 项目流程

一、模型定位

XGBoost(eXtreme Gradient Boosting,极限梯度提升)是一个功能强大、应用广泛的机器学习算法库,可以看作是梯度提升决策树(GBDT)算法在性能和效果上的“极致升级版”。它由陈天奇等人开发,因其在众多数据科学竞赛中的出色表现而闻名。

XGBoost的核心思想可以用一句话概括:通过串行生成多棵决策树,让后一棵树不断学习和纠正前一棵树的错误,最终把所有树的结果加起来,形成一个强大的模型。

  • 归属:基于决策树的集成学习(Boosting家族)
  • 核心哲学:串行生成多棵弱回归树,每棵新树拟合前一棵树的负梯度方向(可以通俗理解为“残差”的方向)
  • 最终预测:所有树的预测值累加(加权和)
  • 与线性回归的本质区别:
    • 线性回归:解方程求最优系数(一次完成)
    • XGBoost:分步迭代,逐树逼近真实值

二、训练总流程(伪代码)

输入:训练数据 D = {(x_i, y_i)},树棵数 K,学习率 lr,正则化参数 λ, γ 输出:K棵决策树的集成模型 1. 初始化预测值: 回归任务:pred = mean(y)(样本均值) 分类任务:pred = log(正例数/负例数)(对数几率,即原始分数) 2. For t = 1 to K: a. 计算每个样本的一阶导数 g_i 和二阶导数 h_i - 回归(均方误差):g_i = pred_i - y_i,h_i = 1 - 分类(逻辑损失):令 p_i = 1/(1+e^{-pred_i})(概率) g_i = p_i - y_i,h_i = p_i * (1 - p_i) (注意:这里 pred_i 是累加的原始分数,不是概率) b. 以 {g_i, h_i} 为训练目标,构建一棵回归树 (树拟合的是“负梯度方向”,而非原始 y) c. 计算每个叶子节点的最优权重: w_j = - (Σg_i) / (Σh_i + λ) d. 更新预测值: pred_i = pred_i + lr × w_j(对应样本落入的叶子) (lr 通常 ∈ [0.01, 0.3],每棵树只贡献一小步) 3. 返回:所有树的结构及叶子权重

实战补充:实际训练时不会固定循环K棵,而是用验证集监控效果,当验证集误差连续多轮不再下降时(早停,early stopping)就提前终止,避免过拟合。

三、单棵树生长流程

3.1 节点分裂的“暴力搜索”机制

目标:在当前节点,从所有特征和所有候选切分点中,选出增益最大的分裂方式。

步骤1:生成候选切分点
  • 连续特征:将特征值排序,取相邻值的中点作为候选阈值
    • 例:[80, 95, 100, 120] → 候选点:87.5, 97.5, 110
  • 大数据优化:用百分位数分箱(如100个分位点),只取分位点边界,大幅减少候选数
  • 离散特征:XGBoost会先把类别按目标统计量排序,再转为有序数值进行切分(类似“按均值排序后二分”),不会暴力枚举所有类别组合
步骤2:计算每个候选的增益

对每个候选切分点,将样本分为左右两堆,计算:

增益=GL2HL+λ+GR2HR+λ−(GL+GR)2HL+HR+λ−γ \text{增益} = \frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} - \gamma增益=HL​+λGL2​​+HR​+λGR2​​−HL​+HR​+λ(GL​+GR​)2​−γ

其中:

  • $ G_L = \sum_{i \in 左} g_i $(左子树一阶梯度和)
  • $ H_L = \sum_{i \in 左} h_i $(左子树二阶梯度和)
  • $ G_R, H_R $ 同理对应右子树
  • $ \lambda $:L2正则化系数(默认1)
  • $ \gamma $:分裂最小增益阈值(默认0),γ越大树越保守
步骤3:挑选最优分裂

遍历所有特征的所有候选点,取增益最大者作为该节点的分裂条件(如“面积 < 97.5”)

3.2 样本划分规则

  • 左子树:满足分裂条件的样本(如面积 < 97.5)
  • 右子树:不满足分裂条件的样本(如面积 ≥ 97.5)
  • 关键:划分只基于原始特征值,与当前节点的预测值无关
  • 划分后,每个样本的 $ g_i, h_i $ 原封不动随样本移动

3.3 缺失值处理(XGBoost的重要特色)

如果某个样本在分裂特征上取值缺失,XGBoost不会直接丢弃它,而是:

  • 先尝试全部归入左子树,计算增益
  • 再尝试全部归入右子树,计算增益
  • 选择增益更大的方向作为缺失值的默认走向

这样既保留了缺失样本的信息,又让模型自动学习“缺失”本身是否有预测价值。

3.4 递归生长

  • 对左右子树递归执行上述分裂过程
  • XGBoost采用**按层生长(level-wise)**策略:先分裂完当前层的所有节点,再进入下一层,保证树的平衡
  • 每棵树的默认最大深度为6(防止过拟合)

3.5 停止条件(预剪枝)

满足以下任一条件即停止分裂,当前节点变为叶子:

  1. 树深度达到max_depth(默认6)
  2. 叶子节点样本数 <min_child_weight(默认1)
  3. 最大增益 <gamma(阈值控制)
  4. 所有样本的 $ g_i $ 已经为0(完美拟合,极少发生)

四、叶子节点权重计算

当节点停止分裂成为叶子后,计算其输出值:

w=−∑i∈叶子gi∑i∈叶子hi+λ w = - \frac{\sum_{i \in 叶子} g_i}{\sum_{i \in 叶子} h_i + \lambda}w=−∑i∈叶子​hi​+λ∑i∈叶子​gi​​

物理含义拆解(用回归任务举例,h_i=1):

假设当前有3个样本,真实值 [100, 200, 300],当前预测值都是 150,λ=1:

  • $ g_i = pred_i - y_i = [50, -50, -150] $(正表示预测偏高,负表示预测偏低)
  • $ Σg = 50 + (-50) + (-150) = -150 $
  • $ w = -(-150) / (3+1) = +37.5 $

这个 +37.5 的含义:因为整体预测偏低(Σg为负),所以叶子给一个正权重,下一轮会抬高预测值,向真实值靠拢。

负号的作用:它让叶子权重的方向始终与“整体误差方向”相反,从而保证每一轮都在纠正上一轮的错误。

  • 分母 + λ:L2收缩,防止单棵树权重过大(λ越大,叶子值越被压缩)

五、最终预测流程(推理)

输入:新样本 x,已训练的 K 棵树 输出:预测值 ŷ 1. pred = 初始均值(同训练时的常数) 2. For t = 1 to K: a. 将 x 落入第 t 棵树的某个叶子节点 b. 取出该叶子的权重 w_t c. pred = pred + lr × w_t 3. 回归任务直接返回 pred 分类任务经 sigmoid 转换为概率(即 1/(1+e^{-pred}))

六、多棵树是如何协同计算的?(从单棵到集成)

6.1 预测阶段(推理):串行累加

当我们要预测一个新样本时,所有树都要参与,每棵树贡献一个值,最后全部加起来。

具体流程:

新样本 x 来了: pred = 初始值(回归=均值,分类=对数几率) 第1棵树:x 落入某个叶子 → 取出权重 w₁ → pred = pred + lr × w₁ 第2棵树:x 落入某个叶子 → 取出权重 w₂ → pred = pred + lr × w₂ 第3棵树:x 落入某个叶子 → 取出权重 w₃ → pred = pred + lr × w₃ ... 第K棵树:x 落入某个叶子 → 取出权重 w_K → pred = pred + lr × w_K 最终 pred 就是输出(回归直接返回,分类转成概率)

关键理解:

  • 每棵树都有完整的结构(从根到叶子的所有分裂条件)
  • 新样本会从头开始走每一棵树,从根节点一路落到某个叶子
  • 每棵树只用到一个叶子(就是样本最终落入的那个)
  • 所有树的贡献累加起来,才是最终结果

6.2 训练阶段(建树):每棵树都在纠正前面所有的错误

训练时,树是依次生成的,不是同时生成的。

第1棵树:

  • 基于初始预测值(常数),计算每个样本的梯度 g_i
  • 建树,得到叶子权重
  • 更新预测值:每个样本的预测值被抬高或压低了一点点

第2棵树:

  • 基于更新后的预测值,重新计算每个样本的梯度 g_i
  • 注意:此时 g_i 已经变了(因为预测值变了,误差变小了)
  • 建树,拟合新的梯度方向
  • 再次更新预测值

第3棵树及以后:

  • 重复上述过程,每棵树都在当前预测值的基础上继续修正

关键理解:

  • 第 t 棵树看到的 g_i,是前面 t-1 棵树累积效果之后的残差方向
  • 所以每棵树都在“补前人的锅”,而不是重复劳动
  • 这就是 Boosting 的“串行纠正”本质

6.3 一个完整的数值例子

假设回归任务,真实值 y = 100,初始预测值 = 0,学习率 lr = 0.5(为了演示取大一点)

轮次当前预测值g = pred - y该树叶子权重 w更新后预测值
初始0———
第1棵0-100+800 + 0.5×80 = 40
第2棵40-60+5040 + 0.5×50 = 65
第3棵65-35+3065 + 0.5×30 = 80
第4棵80-20+1880 + 0.5×18 = 89
第5棵89-11+1089 + 0.5×10 = 94

观察:

  • 每棵树的 g 越来越小(因为预测越来越准)
  • 每棵树的叶子权重越来越小(因为需要修正的幅度变小了)
  • 最终预测值 94,虽然不是 100,但如果继续加树,会无限逼近
  • 学习率 0.5 让每步走保守一些,防止一步冲过头

七、三大工程加速机制

机制说明
并行化建树时不同特征的分裂评估互不干扰,可利用多核CPU并行计算
缓存感知预先对特征值排序并存储为块(Block),后续迭代复用排序结果,减少IO开销
近似算法使用百分位数分箱,只在分位点(默认100个)计算增益,牺牲极小精度换取数十倍速度提升

八、与线性回归(岭/贝叶斯)的关键区别

维度岭回归 / 贝叶斯回归XGBoost
模型结构线性加权和(全局单一公式)数百棵树的累加(分段常数)
特征关系基本形式只能捕捉线性关系(但可加核技巧扩展)自动捕捉非线性交互(如年龄×面积)
输出信息系数值(贝叶斯还给出预测方差,代表不确定性)仅有预测值(黑盒,需SHAP等工具解释)
计算速度极快(毫秒级)较慢(秒-分钟级)
数据量要求特征数 > 样本数时容易失效特征数 > 样本数时仍可用,但需调大正则化(λ)并限制树深度防过拟合
可解释性强(系数直接解释)弱(需SHAP等工具辅助)
超参数调优1-2个(λ)10+个(树深、学习率、正则化等)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询