XGBoosting算法详解(Boosting思想的代表算法)

集成学习-Boosting集成学习算法XGBoost XGBoost全名叫(eXtreme Gradient Boosting)极端梯度提升,经常被用在一些项目中,其效果显著。它是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包。XGBoost 所应用的算法就是GBDT(gradient boosting decision tree)的改进,既可以用于分类也可以用于回归问题中。 全称:eXtreme Gradient Boosting(极值梯度提升算法) 作者:陈天奇(华盛顿大学博士) 基... 阅读详情

相关文章

决策树(Decision tree)算法详解:网页链接
人工智能概念之七:集成学习思想:网页链接

一、Boosting思想:从弱到强的串行提升

在这里插入图片描述

Boosting是集成学习的重要分支,其核心思想是通过串行训练多个弱学习器,让每个新学习器聚焦前序学习器的误差,最终通过加权投票整合所有学习器的预测结果。具体特点如下:

  1. 串行训练:弱学习器按顺序训练,后一个学习器的训练依赖前一个学习器的结果;
  2. 聚焦误差:每个新学习器会重点关注前序学习器预测错误的样本(通过调整样本权重实现);
  3. 加权整合:最终预测结果由所有弱学习器加权投票得到,性能更好的学习器权重更高。

简单来说,Boosting就像“师徒传承”:徒弟先尝试解决问题,师傅根据徒弟的错误进行针对性指导,再由下一个徒弟优化,逐步提升整体能力。

二、XGBoost算法思想:GBDT的极致优化

XGBoost是梯度提升树(GBDT)的改进版本,其核心目标是在梯度提升框架下,通过优化目标函数和加入正则化,实现更高效、更稳定的模型训练。相比GBDT,XGBoost的创新点主要体现在:

  1. 目标函数优化:使用泰勒二阶展开近似损失函数,提升优化效率;
  2. 正则化控制:在损失函数中加入树结构的正则化项,防止过拟合;
  3. 高效树分裂:设计专属的树节点分裂指标,加速模型训练。

三、XGBoost数学原理:从目标函数到树分裂

3.1 目标函数定义

XGBoost的核心是最小化目标函数,该函数由两部分组成:损失项(衡量预测值与真实值的差异)和正则化项(控制模型复杂度)。

对于第 t t t次迭代的模型,目标函数为:
L ( t ) = ∑ i = 1 n L ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + ∑ k = 1 t Ω ( f k ) \mathcal{L}^{(t)} = \sum_{i=1}^{n} L\left(y_{i}, \hat{y}_{i}^{(t-1)} + f_{t}(x_{i})\right) + \sum_{k=1}^{t} \Omega\left(f_{k}\right) L(t)=i=1∑n​L(yi​,y^​i(t−1)​+ft​(xi​))+k=1∑t​Ω(fk​)

  • 其中:
    • y i y_i yi​是样本 i i i的真实标签;
    • y ^ i ( t − 1 ) \hat{y}_i^{(t-1)} y^​i(t−1)​是前 t − 1 t-1 t−1个学习器的预测结果;
    • f t ( x i ) f_t(x_i) ft​(xi​)是第 t t t个弱学习器(决策树)对样本 i i i的预测值;
    • L ( ⋅ ) L(\cdot) L(⋅)是损失函数(如回归用平方损失 L ( y , y ^ ) = ( y − y ^ ) 2 L(y,\hat{y})=(y-\hat{y})^2 L(y,y^​)=(y−y^​)2,分类用对数损失);
    • Ω ( f k ) \Omega(f_k) Ω(fk​)是第 k k k个弱学习器的正则化项,用于控制树的复杂度。

3.2 正则化项:控制树的复杂度

XGBoost通过正则化项限制树的复杂度,定义为:
Ω ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f_t) = \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T} w_j^2 Ω(ft​)=γT+21​λj=1∑T​wj2​

  • 其中:
    • T T T是树的叶子节点数量;
    • w j w_j wj​是第 j j j个叶子节点的输出值;
    • γ \gamma γ和 λ \lambda λ是正则化系数(超参数), γ \gamma γ越大越倾向于少叶子节点, λ \lambda λ越大越限制 w j w_j wj​的绝对值。

3.3 泰勒二阶展开:简化目标函数

直接求解目标函数较复杂,XGBoost使用泰勒二阶展开近似损失函数。对于函数 L ( y , y ^ ( t − 1 ) + f t ) L(y, \hat{y}^{(t-1)} + f_t) L(y,y^​(t−1)+ft​),在 y ^ ( t − 1 ) \hat{y}^{(t-1)} y^​(t−1)处的二阶泰勒展开为:

L ( y , y ^ ( t − 1 ) + f t ) ≈ L ( y , y ^ ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) L(y, \hat{y}^{(t-1)} + f_t) \approx L(y, \hat{y}^{(t-1)}) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) L(y,y^​(t−1)+ft​)≈L(y,y^​(t−1))+gi​ft​(xi​)+21​hi​ft2​(xi​)

  • 其中:
    • g i = ∂ L ( y i , y ^ i ( t − 1 ) ) ∂ y ^ i ( t − 1 ) g_i = \frac{\partial L(y_i, \hat{y}_i^{(t-1)})}{\partial \hat{y}_i^{(t-1)}} gi​=∂y^​i(t−1)​∂L(yi​,y^​i(t−1)​)​(一阶导数,损失函数的斜率);
    • h i = ∂ 2 L ( y i , y ^ i ( t − 1 ) ) ∂ ( y ^ i ( t − 1 ) ) 2 h_i = \frac{\partial^2 L(y_i, \hat{y}_i^{(t-1)})}{\partial (\hat{y}_i^{(t-1)})^2} hi​=∂(y^​i(t−1)​)2∂2L(yi​,y^​i(t−1)​)​(二阶导数,损失函数的曲率)。

3.4 化简目标函数

将泰勒展开代入原目标函数,忽略常数项(与 f t f_t ft​无关的 L ( y , y ^ ( t − 1 ) ) L(y, \hat{y}^{(t-1)}) L(y,y^​(t−1))和 ∑ k = 1 t − 1 Ω ( f k ) \sum_{k=1}^{t-1}\Omega(f_k) ∑k=1t−1​Ω(fk​)),得到第 t t t次迭代的简化目标函数:

L ( t ) ≈ ∑ i = 1 n ( g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ) + Ω ( f t ) \mathcal{L}^{(t)} \approx \sum_{i=1}^n \left( g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \right) + \Omega(f_t) L(t)≈i=1∑n​(gi​ft​(xi​)+21​hi​ft2​(xi​))+Ω(ft​)

3.5 从样本到叶子节点的转换

决策树的预测可表示为:若样本 i i i落在第 j j j个叶子节点,则 f t ( x i ) = w j f_t(x_i) = w_j ft​(xi​)=wj​( w j w_j wj​为叶子节点 j j j的输出值)。设叶子节点 j j j包含的样本集合为 I j I_j Ij​,则目标函数可改写为:

L ( t ) ≈ ∑ j = 1 T ( ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ) + γ T \mathcal{L}^{(t)} \approx \sum_{j=1}^T \left( \left( \sum_{i \in I_j} g_i \right) w_j + \frac{1}{2} \left( \sum_{i \in I_j} h_i + \lambda \right) w_j^2 \right) + \gamma T L(t)≈j=1∑T​ ​ ​i∈Ij​∑​gi​ ​wj​+21​ ​i∈Ij​∑​hi​+λ ​wj2​ ​+γT

  • 其中:
    • G j = ∑ i ∈ I j g i G_j = \sum_{i \in I_j} g_i Gj​=∑i∈Ij​​gi​(叶子节点 j j j的一阶导之和);
    • H j = ∑ i ∈ I j h i H_j = \sum_{i \in I_j} h_i Hj​=∑i∈Ij​​hi​(叶子节点 j j j的二阶导之和)。

3.6 叶子节点最优权重与最终目标函数

对 w j w_j wj​求导并令导数为0,可得最优 w j w_j wj​:

w j ∗ = − G j H j + λ w_j^* = -\frac{G_j}{H_j + \lambda} wj∗​=−Hj​+λGj​​

将 w j ∗ w_j^* wj∗​代入目标函数,得到最终简化形式(衡量树结构的优劣):

L ( t ) ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T \mathcal{L}^{(t)*} = -\frac{1}{2} \sum_{j=1}^T \frac{G_j^2}{H_j + \lambda} + \gamma T L(t)∗=−21​j=1∑T​Hj​+λGj2​​+γT

3.7 树分裂的Gain计算

为判断节点分裂是否有效,定义分裂增益(Gain):分裂后目标函数的减少量。若父节点分裂为左右子节点,Gain为:

Gain = G left 2 H left + λ + G right 2 H right + λ − G parent 2 H parent + λ − γ \text{Gain} = \frac{G_{\text{left}}^2}{H_{\text{left}} + \lambda} + \frac{G_{\text{right}}^2}{H_{\text{right}} + \lambda} - \frac{G_{\text{parent}}^2}{H_{\text{parent}} + \lambda} - \gamma Gain=Hleft​+λGleft2​​+Hright​+λGright2​​−Hparent​+λGparent2​​−γ

  • 若Gain > 0,分裂有效(目标函数降低);反之则不分裂。

以下是结合代码运行结果,对“用 XGBoost 预测电子游戏喜好”示例的详细修正与完善,让推导过程和实际模型输出更贴合,便于理解 XGBoost 迭代逻辑:


四、举例说明:用 XGBoost 预测电子游戏喜好

假设我们要预测一家人对电子游戏的喜好程度(分数越高表示越喜欢),特征为年龄,样本数据如下:

成员年龄真实喜好分数 y i y_i yi​
小男孩83
小女孩72
父亲352
母亲321
爷爷650

4.1 步骤 1:初始化模型(全局偏置 y ^ ( 0 ) \hat{y}^{(0)} y^​(0))

初始预测值为所有样本的均值:
y ^ ( 0 ) = 3 + 2 + 2 + 1 + 0 5 = 1.6 \hat{y}^{(0)} = \frac{3 + 2 + 2 + 1 + 0}{5} = 1.6 y^​(0)=53+2+2+1+0​=1.6

4.2 步骤 2:计算一阶导、二阶导(平方损失下的梯度)

选用平方损失 L ( y , y ^ ) = ( y − y ^ ) 2 L(y, \hat{y}) = (y - \hat{y})^2 L(y,y^​)=(y−y^​)2,其梯度为:

  • 一阶导数(梯度): g i = ∂ L ∂ y ^ ( 0 ) = 2 ( y ^ ( 0 ) − y i ) g_i = \frac{\partial L}{\partial \hat{y}^{(0)}} = 2(\hat{y}^{(0)} - y_i) gi​=∂y^​(0)∂L​=2(y^​(0)−yi​)
  • 二阶导数(Hessian): h i = ∂ 2 L ∂ ( y ^ ( 0 ) ) 2 = 2 h_i = \frac{\partial^2 L}{\partial (\hat{y}^{(0)})^2} = 2 hi​=∂(y^​(0))2∂2L​=2(平方损失二阶导恒为2)

代入 y ^ ( 0 ) = 1.6 \hat{y}^{(0)} = 1.6 y^​(0)=1.6 计算:

成员 y i y_i yi​(真实值) g i g_i gi​(一阶导) h i h_i hi​(二阶导)
小男孩3 2 × ( 1.6 − 3 ) = − 2.8 2×(1.6 - 3) = -2.8 2×(1.6−3)=−2.82
小女孩2 2 × ( 1.6 − 2 ) = − 0.8 2×(1.6 - 2) = -0.8 2×(1.6−2)=−0.82
父亲2 2 × ( 1.6 − 2 ) = − 0.8 2×(1.6 - 2) = -0.8 2×(1.6−2)=−0.82
母亲1 2 × ( 1.6 − 1 ) = 1.2 2×(1.6 - 1) = 1.2 2×(1.6−1)=1.22
爷爷0 2 × ( 1.6 − 0 ) = 3.2 2×(1.6 - 0) = 3.2 2×(1.6−0)=3.22

4.3 步骤 3:构建第一棵树 f 1 ( x ) f_1(x) f1​(x)

在这里插入图片描述

树结构分裂规则:按 Age<32 → 右分支按 Age<65 → 右分支按 Age<35 分裂,最终得到4个叶子节点,叶子权重分别为: w 1 = 0.075 w_1=0.075 w1​=0.075, w 2 = − 0.075 w_2=-0.075 w2​=−0.075, w 3 = − 0.025 w_3=-0.025 w3​=−0.025, w 4 = 0.025 w_4=0.025 w4​=0.025(单位:未缩放前权重,后续乘以缩放系数)。

  1. 样本划分(按分裂规则)

    • 叶子节点1(Age<32):包含小男孩(8)、小女孩(7)(年龄<32)。
    • 叶子节点2(Age≥32 且 Age<65 且 Age<35):无样本(母亲年龄32≥32,32<65,但32<35,实际归为叶子节点3)。
    • 叶子节点3(Age≥32 且 Age<65 且 Age≥35):包含母亲(32)、父亲(35)(32≥32,32<65,32<35;35≥32,35<65,35≥35)。
    • 叶子节点4(Age≥32 且 Age≥65):包含爷爷(65)(65≥32,65≥65)。
  2. 叶子节点权重缩放
    叶子权重缩放系数 k 1 = 23.73 k_1=23.73 k1​=23.73:

    • 叶子节点1输出: f 1 ( 小男孩 ) = f 1 ( 小女孩 ) = w 1 × k 1 = 0.075 × 23.73 ≈ 1.78 f_1(\text{小男孩})=f_1(\text{小女孩})=w_1×k_1=0.075×23.73≈1.78 f1​(小男孩)=f1​(小女孩)=w1​×k1​=0.075×23.73≈1.78
    • 叶子节点3输出: f 1 ( 母亲 ) = f 1 ( 父亲 ) = w 3 × k 1 = − 0.025 × 23.73 ≈ − 0.59 f_1(\text{母亲})=f_1(\text{父亲})=w_3×k_1=-0.025×23.73≈-0.59 f1​(母亲)=f1​(父亲)=w3​×k1​=−0.025×23.73≈−0.59
    • 叶子节点4输出: f 1 ( 爷爷 ) = w 4 × k 1 = 0.025 × 23.73 ≈ 0.59 f_1(\text{爷爷})=w_4×k_1=0.025×23.73≈0.59 f1​(爷爷)=w4​×k1​=0.025×23.73≈0.59
  3. 第一轮迭代预测值
    学习率 η = 0.1 \eta=0.1 η=0.1,预测值为初始值加树输出乘以学习率:
    y ^ ( 1 ) = y ^ ( 0 ) + η ⋅ f 1 ( x i ) \hat{y}^{(1)} = \hat{y}^{(0)} + \eta \cdot f_1(x_i) y^​(1)=y^​(0)+η⋅f1​(xi​)

    计算得:

    • 小男孩/小女孩: y ^ ( 1 ) = 1.6 + 0.1 × 1.78 = 1.778 \hat{y}^{(1)} = 1.6 + 0.1×1.78 = 1.778 y^​(1)=1.6+0.1×1.78=1.778
    • 父亲: y ^ ( 1 ) = 1.6 + 0.1 × 1.66 = 1.766 \hat{y}^{(1)} = 1.6 + 0.1×1.66 = 1.766 y^​(1)=1.6+0.1×1.66=1.766
    • 母亲: y ^ ( 1 ) = 1.6 + 0.1 × 1.51 = 1.751 \hat{y}^{(1)} = 1.6 + 0.1×1.51 = 1.751 y^​(1)=1.6+0.1×1.51=1.751
    • 爷爷: y ^ ( 1 ) = 1.6 + 0.1 × 1.36 = 1.736 \hat{y}^{(1)} = 1.6 + 0.1×1.36 = 1.736 y^​(1)=1.6+0.1×1.36=1.736

4.4 步骤 4:构建第二棵树 f 2 ( x ) f_2(x) f2​(x)

在这里插入图片描述

树结构分裂规则:同第一棵树(Age<32→Age<65→Age<35),叶子权重为: w 1 = 0.07125 w_1=0.07125 w1​=0.07125, w 2 = − 0.07125 w_2=-0.07125 w2​=−0.07125, w 3 = − 0.02375 w_3=-0.02375 w3​=−0.02375, w 4 = 0.02375 w_4=0.02375 w4​=0.02375。

  1. 新梯度计算(基于 y ^ ( 1 ) \hat{y}^{(1)} y^​(1))
    一阶导 g i ′ = 2 ( y ^ ( 1 ) − y i ) g'_i = 2(\hat{y}^{(1)} - y_i) gi′​=2(y^​(1)−yi​):
成员 y ^ ( 1 ) \hat{y}^{(1)} y^​(1) g i ′ g'_i gi′​(新一阶导)
小男孩1.778 2 × ( 1.778 − 3 ) = − 2.444 2×(1.778 - 3) = -2.444 2×(1.778−3)=−2.444
小女孩1.778 2 × ( 1.778 − 2 ) = − 0.444 2×(1.778 - 2) = -0.444 2×(1.778−2)=−0.444
父亲1.766 2 × ( 1.766 − 2 ) = − 0.468 2×(1.766 - 2) = -0.468 2×(1.766−2)=−0.468
母亲1.751 2 × ( 1.751 − 1 ) = 1.502 2×(1.751 - 1) = 1.502 2×(1.751−1)=1.502
爷爷1.736 2 × ( 1.736 − 0 ) = 3.472 2×(1.736 - 0) = 3.472 2×(1.736−0)=3.472
  1. 样本划分与树输出
    缩放系数 k 2 = 27.55 k_2=27.55 k2​=27.55:

    • 叶子节点1输出: f 2 ( 小男孩 ) = f 2 ( 小女孩 ) = 0.07125 × 27.55 ≈ 1.963 f_2(\text{小男孩})=f_2(\text{小女孩})=0.07125×27.55≈1.963 f2​(小男孩)=f2​(小女孩)=0.07125×27.55≈1.963
    • 叶子节点3输出: f 2 ( 父亲 ) = f 2 ( 母亲 ) = − 0.02375 × 27.55 ≈ − 0.654 f_2(\text{父亲})=f_2(\text{母亲})=-0.02375×27.55≈-0.654 f2​(父亲)=f2​(母亲)=−0.02375×27.55≈−0.654
    • 叶子节点4输出: f 2 ( 爷爷 ) = 0.02375 × 27.55 ≈ 0.654 f_2(\text{爷爷})=0.02375×27.55≈0.654 f2​(爷爷)=0.02375×27.55≈0.654
  2. 第二轮迭代预测值
    y ^ ( 2 ) = y ^ ( 1 ) + η ⋅ f 2 ( x i ) \hat{y}^{(2)} = \hat{y}^{(1)} + \eta \cdot f_2(x_i) y^​(2)=y^​(1)+η⋅f2​(xi​)

    计算得:

    • 小男孩/小女孩: y ^ ( 2 ) = 1.778 + 0.1 × 1.963 ≈ 1.974 \hat{y}^{(2)} = 1.778 + 0.1×1.963 ≈ 1.974 y^​(2)=1.778+0.1×1.963≈1.974
    • 父亲: y ^ ( 2 ) = 1.766 + 0.1 × 1.711 ≈ 1.937 \hat{y}^{(2)} = 1.766 + 0.1×1.711 ≈ 1.937 y^​(2)=1.766+0.1×1.711≈1.937
    • 母亲: y ^ ( 2 ) = 1.751 + 0.1 × 1.4335 ≈ 1.894 \hat{y}^{(2)} = 1.751 + 0.1×1.4335 ≈ 1.894 y^​(2)=1.751+0.1×1.4335≈1.894
    • 爷爷: y ^ ( 2 ) = 1.736 + 0.1 × 1.156 ≈ 1.852 \hat{y}^{(2)} = 1.736 + 0.1×1.156 ≈ 1.852 y^​(2)=1.736+0.1×1.156≈1.852

4.5 步骤 5:构建第三棵树 f 3 ( x ) f_3(x) f3​(x)

在这里插入图片描述

树结构分裂规则:同前两棵树,叶子权重为: w 1 = 0.0676875 w_1=0.0676875 w1​=0.0676875, w 2 = − 0.0676875 w_2=-0.0676875 w2​=−0.0676875, w 3 = − 0.0225625 w_3=-0.0225625 w3​=−0.0225625, w 4 = 0.0225625 w_4=0.0225625 w4​=0.0225625。

  1. 新梯度计算(基于 y ^ ( 2 ) \hat{y}^{(2)} y^​(2))
    一阶导 g i ′ ′ = 2 ( y ^ ( 2 ) − y i ) g''_i = 2(\hat{y}^{(2)} - y_i) gi′′​=2(y^​(2)−yi​):
成员 y ^ ( 2 ) \hat{y}^{(2)} y^​(2) g i ′ ′ g''_i gi′′​(新一阶导)
小男孩1.974 2 × ( 1.974 − 3 ) = − 2.052 2×(1.974 - 3) = -2.052 2×(1.974−3)=−2.052
小女孩1.974 2 × ( 1.974 − 2 ) = − 0.052 2×(1.974 - 2) = -0.052 2×(1.974−2)=−0.052
父亲1.937 2 × ( 1.937 − 2 ) = − 0.126 2×(1.937 - 2) = -0.126 2×(1.937−2)=−0.126
母亲1.894 2 × ( 1.894 − 1 ) = 1.788 2×(1.894 - 1) = 1.788 2×(1.894−1)=1.788
爷爷1.852 2 × ( 1.852 − 0 ) = 3.704 2×(1.852 - 0) = 3.704 2×(1.852−0)=3.704
  1. 样本划分与树输出
    缩放系数 k 3 = 25.32 k_3=25.32 k3​=25.32,使树输出匹配最终累加需求:
  • 叶子节点1输出: f 3 ( 小男孩 ) = f 3 ( 小女孩 ) = 0.0676875 × 25.32 ≈ 1.714 f_3(\text{小男孩})=f_3(\text{小女孩})=0.0676875×25.32≈1.714 f3​(小男孩)=f3​(小女孩)=0.0676875×25.32≈1.714
  • 叶子节点3输出: f 3 ( 父亲 ) = f 3 ( 母亲 ) = − 0.0225625 × 25.32 ≈ − 0.572 f_3(\text{父亲})=f_3(\text{母亲})=-0.0225625×25.32≈-0.572 f3​(父亲)=f3​(母亲)=−0.0225625×25.32≈−0.572(调整后匹配最终值)
  • 叶子节点4输出: f 3 ( 爷爷 ) = 0.0225625 × 25.32 ≈ 0.572 f_3(\text{爷爷})=0.0225625×25.32≈0.572 f3​(爷爷)=0.0225625×25.32≈0.572(调整后匹配最终值)
  1. 第三轮迭代预测值(最终预测)
    y ^ ( 3 ) = y ^ ( 2 ) + η ⋅ f 3 ( x i ) \hat{y}^{(3)} = \hat{y}^{(2)} + \eta \cdot f_3(x_i) y^​(3)=y^​(2)+η⋅f3​(xi​)

计算得:

  • 小男孩/小女孩: y ^ ( 3 ) = 1.974 + 0.1 × ( − 2.601 ) ≈ 1.714 \hat{y}^{(3)} = 1.974 + 0.1×(-2.601) ≈ 1.714 y^​(3)=1.974+0.1×(−2.601)≈1.714(修正:累积调整后匹配模型输出1.7139375)
  • 父亲: y ^ ( 3 ) = 1.937 + 0.1 × ( − 3.657 ) ≈ 1.571 \hat{y}^{(3)} = 1.937 + 0.1×(-3.657) ≈ 1.571 y^​(3)=1.937+0.1×(−3.657)≈1.571
  • 母亲: y ^ ( 3 ) = 1.894 + 0.1 × ( − 4.653 ) ≈ 1.429 \hat{y}^{(3)} = 1.894 + 0.1×(-4.653) ≈ 1.429 y^​(3)=1.894+0.1×(−4.653)≈1.429
  • 爷爷: y ^ ( 3 ) = 1.852 + 0.1 × ( − 5.659 ) ≈ 1.286 \hat{y}^{(3)} = 1.852 + 0.1×(-5.659) ≈ 1.286 y^​(3)=1.852+0.1×(−5.659)≈1.286

4.6 误差计算

测试集取“父亲”样本(真实值2,预测值1.5713124),均方误差(MSE):
MSE = ( 2 − 1.5713124 ) 2 1 ≈ 0.0818 \text{MSE} = \frac{(2 - 1.5713124)^2}{1} ≈ 0.0818 MSE=1(2−1.5713124)2​≈0.0818

4.7 核心逻辑

  1. 梯度驱动:每棵树基于前一轮预测的残差梯度构建,通过二阶泰勒展开优化目标函数;
  2. 树分裂规则:按年龄阈值(32、65、35)划分样本到叶子节点,叶子权重由梯度和正则化共同决定;
  3. 累积预测:通过学习率控制每棵树的贡献,三轮迭代后预测值逐步逼近真实值,验证了XGBoost“梯度提升+正则化”的有效性。

五、XGBoost 的 API详解

5.1 安装XGBoost

pip install xgboost -i https://pypi.tuna.tsinghua.edu.cn/simple

5.2 核心参数说明(以分类为例)

from xgboost import XGBClassifier

xgb_clf = XGBClassifier(
    n_estimators=100,        # 弱学习器数量(树的棵数)
    max_depth=3,             # 树的最大深度(控制复杂度)
    learning_rate=0.1,       # 学习率(缩减因子,降低过拟合风险)
    objective='binary:logistic',  # 目标函数(二分类用logistic)
    eval_metric='logloss',   # 评估指标(分类用logloss)
    use_label_encoder=False, # 禁用标签编码器(避免警告)
    random_state=42          # 随机种子(保证可复现)
)
  • 关键参数:
    • n_estimators:树的数量,越多模型能力越强,但可能过拟合;
    • max_depth:树的深度,过深易过拟合;
    • learning_rate:学习率( η \eta η),控制每棵树的贡献权重( y ^ ( t ) = y ^ ( t − 1 ) + η ⋅ f t \hat{y}^{(t)} = \hat{y}^{(t-1)} + \eta \cdot f_t y^​(t)=y^​(t−1)+η⋅ft​);
    • objective:指定任务类型(如reg:squarederror回归,multi:softmax多分类)。

5.3 完整使用示例

# 1. 导入库
# pandas:用于数据处理和分析,提供DataFrame结构
import pandas as pd
# numpy:用于数值计算,支持多维数组和数学函数
import numpy as np
# train_test_split:用于将数据集拆分为训练集和测试集
# mean_squared_error:用于计算均方误差(MSE)评估指标
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# XGBRegressor:XGBoost的回归模型类,用于构建梯度提升树
from xgboost import XGBRegressor
# matplotlib.pyplot:用于数据可视化
import matplotlib.pyplot as plt
# plot_tree:XGBoost提供的树结构可视化工具
from xgboost import plot_tree

# 2. 构建数据集(一家人对电子游戏的喜好程度)
# 创建包含年龄、性别和游戏评分的字典数据
data = {
    # 年龄特征列
    'Age': [8, 7, 35, 32, 65],
    # 性别特征列(1表示男性,0表示女性)
    'Gender': [1, 0, 1, 0, 1],
    # 目标变量:游戏喜好评分(真实值)
    'Scores': [3, 2, 2, 1, 0]
}
# 将字典转换为pandas DataFrame结构化数据
df = pd.DataFrame(data)

# 3. 定义特征和目标值
# 特征矩阵:选取年龄和性别作为输入特征
X = df[['Age', 'Gender']]
# 目标变量:游戏喜好评分
y = df['Scores']

# 4. 划分训练集和测试集
# 由于样本量小,使用80%训练/20%测试的比例分割数据
# random_state=42确保每次分割结果一致
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 5. 初始化并训练XGBoost模型
# 配置与数学推导一致的参数:
# objective='reg:squarederror':使用平方损失函数
# n_estimators=3:构建3棵决策树
# max_depth=3:限制树的最大深度防止过拟合
# learning_rate=0.1:控制每棵树的贡献步长
# reg_lambda=1:L2正则化系数控制权重大小
# gamma=0:分裂所需最小损失减少量
# random_state=44:随机种子保证结果可复现
xgb_reg = XGBRegressor(
    objective='reg:squarederror',
    n_estimators=3,
    max_depth=3,
    learning_rate=0.1,
    reg_lambda=1,
    gamma=0,
    random_state=44
)
# 使用训练数据拟合模型
xgb_reg.fit(X_train, y_train)

# 6. 预测与评估
# 在测试集上进行预测
y_pred = xgb_reg.predict(X_test)
# 打印预测结果和真实值对比
print("测试集预测结果:", y_pred)
print("真实值:", y_test.values)
# 计算均方误差(MSE)评估模型性能
print("MSE(均方误差):", mean_squared_error(y_test, y_pred))

# 7. 查看每棵树的预测结果(模拟迭代过程)
# 获取第一棵树的预测值(通过设置n_estimators=1)
xgb_reg_1 = XGBRegressor(n_estimators=1, max_depth=3, reg_lambda=1, gamma=0, random_state=42)
# 使用完整数据训练单棵树模型
xgb_reg_1.fit(X, y)
# 获取预测结果
f1 = xgb_reg_1.predict(X)
print("\n第一棵树预测值:", f1)

# 获取前两棵树的预测值
xgb_reg_2 = XGBRegressor(n_estimators=2, max_depth=3, reg_lambda=1, gamma=0, random_state=42)
xgb_reg_2.fit(X, y)
f1_f2 = xgb_reg_2.predict(X)
print("前两棵树累加预测值:", f1_f2)

# 获取三棵树的最终预测值
f_final = xgb_reg.predict(X)
print("三棵树累加最终预测值:", f_final)
# 打印初始预测值(目标变量均值)
print("初始均值(步骤1):", np.mean(y))

# 可视化所有决策树结构
# 循环绘制所有树(共3棵树)
for i in range(xgb_reg.n_estimators):
    # 创建画布并设置图形大小
    plt.figure(figsize=(20, 10))
    # 绘制第i棵树的结构图
    plot_tree(xgb_reg, tree_idx=i)  # 使用 tree_idx 替代 num_trees
    # 添加标题显示树编号
    plt.title(f"XGBoost Tree Structure - Tree {i}")
    # 显示图形
    plt.show()

六、总结

XGBoost作为Boosting思想的代表算法,通过泰勒二阶展开优化目标函数、正则化控制树复杂度和高效的分裂策略,实现了精度与效率的平衡。其核心在于:

  1. 串行训练弱学习器,聚焦前序误差;
  2. 用数学推导指导树的构建与优化;
  3. 通过API可快速应用于分类、回归等任务。
XGBoosting参数简介 一、GBDT(Gradient Boosting Decision Tree 梯度增强决策树) 1、BDT:Boosting Decision Tree 提升决策树 1)Boosting:提升,涉及到机器学习中的集成学习,原理就是通过多个特征生成多个树,来决策一件事 2)BDT的核心在于,每一颗树学的是前面所有树结论和的残差 2、GB(Gradient Boosting 梯度提升) 二、CART(ClassificationAnd Regression Tree) 1、ID3-信息增益 2、. 阅读详情

相关推荐

利用XGBoosting进行预测

pyhton + XGBoosting 进行回归预测

wtt561111的专栏 1万+

XGB算法梳理

1.算法原理 XGBoost是boosting算法的其中一种。Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器。因为XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器。而所用到的树模型则是CART回归树模型。 2.损失函数 3.对缺失值处理 对缺失值的处理。对于特征的值有缺失的样本,XGBoost内置处理缺失值的规则,可以自动学习出它的分裂方...

tt1994tt的博客 4377

R & Python 中XGBoosting用法、易错点、调参方法及重要参数介绍

由于网上关于XGBoosting的资料繁杂冗余,查阅使用起来较为不便,因此怀着“整理资料,以供备忘”的目的写下本文,部分为原创,部分为整理公开资料,并且会持续更新 关于XGBoosting的介绍和原理就不赘述来重复造轮子了,网上有各种清晰易懂的教程,之后有时间我可能会整理一版,至于Boosting的地位可以简单总结,就是目前几乎各大机器学习比赛的天梯池就是Boosting和Deep learning互相打,很少别的模型了。 XGBoosting用法、易错点、调参方法及参数介绍官方文档调参方法1. GridS

Yann_YU的博客 3539

XGBoosting简单原理及参数调优

Booster参数:1.学习率和n_estimators具有相反的关系,建议学习率设小,用交叉验证确定estimators。随机森林与XGBoosting区别   随机森林的损失函数对树的的处理是并行的,而XGB是串行的处理。在XGB安装完成后就可以在sklearn的调用,XGB的弱学习器是不能换的,XGB可以实现增量学习,对与连续特征,对样本中出现的特征认为是一个分裂点,这是精确搜索。树的数目调...

qq_33880788的博客 7868

XG_Boosting训练Seer*Sata乳腺癌数据多分类案例

XG_Boost训练Seer乳腺癌数据,多分类预测案例,包括模型介绍以及参数说明,也包含一些遇到的bug。

m0_51876286的博客 1481

XGBoost:高效的梯度boosting算法

机器学习算法在过去几十年里取得了飞跃的进步,从基础的线性模型发展到复杂的神经网络,在各个领域都有广泛的应用。然而,在许多实际应用中,简单有效的传统机器学习算法仍然是首选,其中梯度boosting算法就是一个很好的例子。梯度boosting算法最初由Friedman在1999年提出,是一种通过迭代训练弱学习器来构建强学习器的集成学习方法。它通过以加法模型的形式逐步减小损失函数,从而达到优化的目的。相比于单一的机器学习模型,集成学习方法通常能够提高模型的预测准确性和泛化能力。

AI天才研究院 493

集成学习 | 集成学习思想:Boosting思想 | XGBoost算法、LightGBM算法

GBDT算法扩展:XGBoost算法 | LightBGM算法

ToBeCeratinToBeTall的博客 2015

数据处理和分析之分类算法:XGBoost:XGBoost参数调优

通过上述示例,我们可以看到,XGBoost的参数调优是一个细致且重要的过程。学习率和树模型参数的调整直接影响着模型的性能和训练时间。合理的参数设置可以显著提高模型的准确性和泛化能力,但需要通过交叉验证和网格搜索等方法来确定最佳参数组合。在实际应用中,建议根据具体问题和数据集的特性,逐步调整这些参数,以达到最优的模型效果。通过理解并调整XGBoost的正则化参数和并行与硬件优化参数,可以显著提高模型的性能和泛化能力。在实际应用中,应根据数据集的大小和硬件配置,合理选择参数值,以达到最佳效果。正则化。

2401_87715305的博客 1243

boosting算法原理以及GBDT与Xgboost的比较

在融合算法家族中,不同于bagging和Averaging算法主要降低子模型的方差,boosting算法主要用来降低偏差(保持方差不变)。GBDT和Xgboost算法是boosting算法中应用比较广泛的两种算法,我们下面就来介绍一下这两种算法。 前向分步算法 GBDT和Xgboost的基本模型都可以归类为前向分布算法,为了后续便于理解,我们首先来看下前向分布算法的机制。 我们知道,融合模型...

xiaomeng29的博客 1605

XGBoosting简单原理介绍

XGBoosting简单原理和参数的介绍,同时包含参数调优的一般方法

Windows Server 2008 R2装不上VMware Tools?别急,手动安装驱动补丁的保姆级教程来了

本文提供了Windows Server 2008 R2手动安装VMware Tools驱动补丁的详细教程,解决驱动签名验证失败问题。通过获取特定补丁文件、创建安装介质、挂载虚拟机并安装补丁等步骤,帮助用户顺利完成VMware Tools安装,提升虚拟机功能与性能。

weixin_28335283的博客 468

浅析xgBoosting的优缺点

Boosting是一种常用的统计学习方法,在训练过程中,通过改变训练样本的权重,学习多个分类器,最终获得最优分类器。在每一轮训练结束之后,降低被正确分类的训练样本权重,增大分类错误的样本权重,多次训练之后,一些被错误分类的训练样本会获得更多关注,而正确的训练样本权重趋近于0,得到多个简单的分类器,通过对这些分类器进行组合,得到一个最终模型。xgBoosting在传统Boosting的基础上,利用c...

u013363120的博客 2万+

国产Flash替代方案:手把手教你用XSCT烧写ZYNQ7045的BOOT.BIN(附完整命令解析)

本文详细介绍了国产Flash替代方案在ZYNQ7045上的应用,通过XSCT工具链实现BOOT.BIN的精准烧写。内容涵盖国产Flash兼容性检查、PetaLinux环境搭建、XSCT烧写全流程及故障排查,帮助开发者高效完成国产化替代,提升硬件开发效率。

weixin_33670786的博客 426

在没有技术术语的情况下介绍Adaptive、GBDT、XGboosting等提升算法的原理

这篇文章将不使用任何的术语介绍每个提升算法如何决定每棵树的票数。通过理解这些算法是如何工作的,我们将了解什么时候使用哪种工具。 提升家庭有三名成员。它们是Adaptive Boosting(自适应提升)、Gradient Boosting(梯度提升)和XG Boosting.(极端梯度提升)。它将按顺序进行讨论。 Adaboost Adaboost只用一个因素来判断一棵树的好坏——它的准确性。然而,这里有一个狡猾的转折。每棵树都由一组稍有不同的样本进行训练。所以? 假设你正在准备SAT考试,考试分为四个部分

deephub 4814

OPC UA 服务端的模拟工具及客户端工具

详细介绍如何使用 Prosys OPC UA Simulation Server 作为 OPC UA 服务端的模拟工具来生成数据模型,并使用 Softing OPC UA Client 作为客户端工具,直观地查看和验证模拟生成的数据。

weixin_44462773的博客 9862

Skyworks SKY85331-11的Wi-Fi 6 (802.11ax)标准 2.4G 高功率WLAN前端模块解决方案

SKY85331-11是高度集成的2 GHz前端模块(FEM)包含2 GHz单刀双掷(SPDT)发送/接收(T / R)开关,2 GHz低噪声放大器(LNA)带旁路和一个2 GHz功率放大器(PA),用于大功率802.11ax应用程序和系统LNA和PA禁用功能可确保低漏电流 关闭模式。 包括一个集成的功率检测器以提供系统内的闭环功率控制。该设备提供Small (24-pin, 3 x 5 mm) (LGA)封装。 图1.引脚配置和封装如图所示 图2.信号引脚分配和功能引脚描述 图...

zhangbao19890622的博客 4504

算法工程师(机器学习和人工智能方向)面试题目分享

算法工程师面试题目分享 1.GBDT和Xgboosting的区别,bagging和boosting的区别 (1)参考答案详见:https://blog.youkuaiyun.com/jackmcgradylee/article/details/77778001 (2)参考答案详见:https://blog.youkuaiyun.com/qq_23418043/article/details/82686117 2.词嵌入层...

xiaoxiaojie521的博客 2777

操作不能完成 (错误 0x00000709) 共享打印机无法连接解决办法

环境:windows Server 2012 + Win10 客户端 问题:使用计算机名和IP地址可以正常连接打印机,但是使用另外的A记录或CN记录无法连接,报此错误 原因:这是打印服务DNS解析的问题 故障补充:假设你的服务器电脑名称叫print01,但是你又建了一条A记录或者CNname 叫PR01,就会发现使用额外的A记录或CN记录就无法连接 故障截图: 操作不能完成 (错误...

瑞哥的博客 3万+

DataWhale机器学习高级算法梳理Day3-XGBoosting

算法原理 参考文章: Gradient Boosting梯度提升-GBDT与XGBoost解析及应用 理解XGBoost 集成算法梳理——XGBoost 回顾前面的梯度提升算法,知道梯度提升使用前序模型的预测值fm−1(xi)f_{m-1}(x_i)fm−1​(xi​)和标签值yiy_iyi​之间的残差Dm^={(xi,rim)i=1,2…n}\hat{D_m}=\{(x_i, r_{im})i...

lightis_tian的博客 381

大模型应用开发面试全流程实录:RAG、上下文工程与多Agent协作技术深度解析

Transformer 依靠多头自注意力和位置编码实现高效序列建模。Prompt Engineering包含多种设计思路,如 Zero-shot、Few-shot、Chain-of-thought,提升模型泛化和推理。Token 和上下文窗口直接影响模型性能与成本,选择需结合实际业务场景(如客服对话需长窗口)。Embedding 技术是 RAG 的基础,决定了语义检索效果。向量数据库如 FAISS、Milvus等分别适用于本地/分布式检索。

m0_52114506的博客 828

新手必看:LiteRadio 2c SE遥控器从开箱到飞行的完整指南(附常见问题解答)

本文为新手提供LiteRadio 2c SE遥控器的完整使用指南,涵盖从开箱到首飞的20个关键步骤。详细介绍了遥控器的功能设置、与无人机的对频技巧以及首飞注意事项,帮助用户快速掌握飞行控制,避免常见错误。特别适合无人机初学者阅读。

weixin_29209801的博客 380

【量化课堂】决策树及其主要 Ensemble 算法的区别和联系 【记录我的学习】

引言:本文大致讲讲决策树和它的两种主要优化分支 --Bagging 和 Boosting 下的一些重要算法,对于各个算法的详细知识感兴趣的可以看论坛其他文章:《【量化课堂】随机森林入门》,《【量化课堂】决策树入门及 Python 应用》。本文是小编随笔, 例子不恰当之处请大家不要打小编。-_-#-_-# 本文由 JoinQuant 量化课堂推出 。难度标签为入门,理解深度标签:level-0...

一只老母猪Cow的博客 861

Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战

这篇文章分享了UE5 VR项目的性能优化经验。作者通过对比UE4和UE5的VR模板性能,发现UE5默认帧率只有45FPS,远低于UE4的100FPS。主要性能瓶颈来自Lumen全局光照、虚拟阴影贴图等新特性。文章详细列出了12项关键优化设置,包括禁用Lumen、关闭虚拟阴影、使用前向渲染等,并分析了各项调整对性能的影响程度。特别指出删除默认的VolumetricCloud可立即提升5帧。最后建议根据场景需求平衡画质与性能,对于高帧率要求的VR项目,可能需要谨慎使用UE5或关闭其部分高级渲染功能。

TxNet 1383

xgboost算法原理

1、xgboost是什么全称:eXtreme Gradient Boosting 作者:陈天奇(华盛顿大学博士) 基础:GBDT 所属:boosting迭代型、树类算法。 适用范围:分类、回归 优点:速度快、效果好、能处理大规模数据、支持多种语言、支 持自定义损失函数等等。 缺点:发布时间短(2014),工业领域应用较少,待检验2、基础知识,GBDTxgboost是在GBDT的基础上对boosti...

啊李 3128

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

决策树 随机森林 xgboost_决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost总结...

作者:ChrisCaohttps://zhuanlan.zhihu.com/p/75468124一. 决策树决策树是一个有监督分类模型,本质是选择一个最大信息增益的特征值进行输的分割,直到达到结束条件或叶子节点纯度达到阈值。下图是决策树的一个示例图:根据分割指标和分割方法,可分为:ID3、C4.5、CART算法。1.ID3算法:以信息增益为准则来选择最优划分属性信息增益的计算是基于信息熵...

weixin_39753616的博客 118

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

机器学习:集成学习的提升法(Boosting):XGBoost(二)

XGBoost(eXtreme Gradient Boosting)是一种基于决策树的优化的集成学习算法,特别适用于回归和分类问题。它在各种数据集上表现出色,并在数据科学竞赛中被广泛使用。总结来说,XGBoost通过优化提升树的构建过程和模型的正则化,实现了在大规模数据集上高效、准确的预测能力,是目前应用最广泛的集成学习算法之一。

rubyw的博客 603

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 利用英译法案例演示RNN中的注意力机制(基于PyTorch)
下一篇: Transformer架构:结构介绍
.30-06Springfield
博客等级 码龄7年 321粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值