文章目录

相关文章

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

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

在这里插入图片描述

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

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

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

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

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

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

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

3.1 目标函数定义

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

对于第ttt次迭代的模型,目标函数为:
L(t)=∑i=1nL(yi,y^i(t−1)+ft(xi))+∑k=1tΩ(fk)\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=1nL(yi,y^i(t1)+ft(xi))+k=1tΩ(fk)

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

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

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

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

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

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

L(y,y^(t−1)+ft)≈L(y,y^(t−1))+gift(xi)+12hift2(xi)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^(t1)+ft)L(y,y^(t1))+gift(xi)+21hift2(xi)

  • 其中:
    • gi=∂L(yi,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(t1)L(yi,y^i(t1))(一阶导数,损失函数的斜率);
    • hi=∂2L(yi,y^i(t−1))∂(y^i(t−1))2h_i = \frac{\partial^2 L(y_i, \hat{y}_i^{(t-1)})}{\partial (\hat{y}_i^{(t-1)})^2}hi=(y^i(t1))22L(yi,y^i(t1))(二阶导数,损失函数的曲率)。

3.4 化简目标函数

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

L(t)≈∑i=1n(gift(xi)+12hift2(xi))+Ω(ft)\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=1n(gift(xi)+21hift2(xi))+Ω(ft)

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

决策树的预测可表示为:若样本iii落在第jjj个叶子节点,则ft(xi)=wjf_t(x_i) = w_jft(xi)=wjwjw_jwj为叶子节点jjj的输出值)。设叶子节点jjj包含的样本集合为IjI_jIj,则目标函数可改写为:

L(t)≈∑j=1T((∑i∈Ijgi)wj+12(∑i∈Ijhi+λ)wj2)+γ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=1TiIjgiwj+21iIjhi+λwj2+γT

  • 其中:
    • Gj=∑i∈IjgiG_j = \sum_{i \in I_j} g_iGj=iIjgi(叶子节点jjj的一阶导之和);
    • Hj=∑i∈IjhiH_j = \sum_{i \in I_j} h_iHj=iIjhi(叶子节点jjj的二阶导之和)。

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

wjw_jwj求导并令导数为0,可得最优wjw_jwj

wj∗=−GjHj+λw_j^* = -\frac{G_j}{H_j + \lambda} wj=Hj+λGj

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

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

3.7 树分裂的Gain计算

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

Gain=Gleft2Hleft+λ+Gright2Hright+λ−Gparent2Hparent+λ−γ\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+λGright2Hparent+λGparent2γ

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

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


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

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

成员年龄真实喜好分数 yiy_iyi
小男孩83
小女孩72
父亲352
母亲321
爷爷650

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

初始预测值为所有样本的均值:
y^(0)=3+2+2+1+05=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^)2L(y, \hat{y}) = (y - \hat{y})^2L(y,y^)=(yy^)2,其梯度为:

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

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

成员yiy_iyi(真实值)gig_igi(一阶导)hih_ihi(二阶导)
小男孩32×(1.6−3)=−2.82×(1.6 - 3) = -2.82×(1.63)=2.82
小女孩22×(1.6−2)=−0.82×(1.6 - 2) = -0.82×(1.62)=0.82
父亲22×(1.6−2)=−0.82×(1.6 - 2) = -0.82×(1.62)=0.82
母亲12×(1.6−1)=1.22×(1.6 - 1) = 1.22×(1.61)=1.22
爷爷02×(1.6−0)=3.22×(1.6 - 0) = 3.22×(1.60)=3.22

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

在这里插入图片描述

树结构分裂规则:按 Age<32 → 右分支按 Age<65 → 右分支按 Age<35 分裂,最终得到4个叶子节点,叶子权重分别为:w1=0.075w_1=0.075w1=0.075w2=−0.075w_2=-0.075w2=0.075w3=−0.025w_3=-0.025w3=0.025w4=0.025w_4=0.025w4=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. 叶子节点权重缩放
    叶子权重缩放系数 k1=23.73k_1=23.73k1=23.73

    • 叶子节点1输出:f1(小男孩)=f1(小女孩)=w1×k1=0.075×23.73≈1.78f_1(\text{小男孩})=f_1(\text{小女孩})=w_1×k_1=0.075×23.73≈1.78f1(小男孩)=f1(小女孩)=w1×k1=0.075×23.731.78
    • 叶子节点3输出:f1(母亲)=f1(父亲)=w3×k1=−0.025×23.73≈−0.59f_1(\text{母亲})=f_1(\text{父亲})=w_3×k_1=-0.025×23.73≈-0.59f1(母亲)=f1(父亲)=w3×k1=0.025×23.730.59
    • 叶子节点4输出:f1(爷爷)=w4×k1=0.025×23.73≈0.59f_1(\text{爷爷})=w_4×k_1=0.025×23.73≈0.59f1(爷爷)=w4×k1=0.025×23.730.59
  3. 第一轮迭代预测值
    学习率 η=0.1\eta=0.1η=0.1,预测值为初始值加树输出乘以学习率:
    y^(1)=y^(0)+η⋅f1(xi)\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.778y^(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.766y^(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.751y^(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.736y^(1)=1.6+0.1×1.36=1.736

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

在这里插入图片描述

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

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

    • 叶子节点1输出:f2(小男孩)=f2(小女孩)=0.07125×27.55≈1.963f_2(\text{小男孩})=f_2(\text{小女孩})=0.07125×27.55≈1.963f2(小男孩)=f2(小女孩)=0.07125×27.551.963
    • 叶子节点3输出:f2(父亲)=f2(母亲)=−0.02375×27.55≈−0.654f_2(\text{父亲})=f_2(\text{母亲})=-0.02375×27.55≈-0.654f2(父亲)=f2(母亲)=0.02375×27.550.654
    • 叶子节点4输出:f2(爷爷)=0.02375×27.55≈0.654f_2(\text{爷爷})=0.02375×27.55≈0.654f2(爷爷)=0.02375×27.550.654
  2. 第二轮迭代预测值
    y^(2)=y^(1)+η⋅f2(xi)\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.974y^(2)=1.778+0.1×1.9631.974
    • 父亲:y^(2)=1.766+0.1×1.711≈1.937\hat{y}^{(2)} = 1.766 + 0.1×1.711 ≈ 1.937y^(2)=1.766+0.1×1.7111.937
    • 母亲:y^(2)=1.751+0.1×1.4335≈1.894\hat{y}^{(2)} = 1.751 + 0.1×1.4335 ≈ 1.894y^(2)=1.751+0.1×1.43351.894
    • 爷爷:y^(2)=1.736+0.1×1.156≈1.852\hat{y}^{(2)} = 1.736 + 0.1×1.156 ≈ 1.852y^(2)=1.736+0.1×1.1561.852

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

在这里插入图片描述

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

  1. 新梯度计算(基于 y^(2)\hat{y}^{(2)}y^(2)
    一阶导 gi′′=2(y^(2)−yi)g''_i = 2(\hat{y}^{(2)} - y_i)gi′′=2(y^(2)yi)
成员y^(2)\hat{y}^{(2)}y^(2)gi′′g''_igi′′(新一阶导)
小男孩1.9742×(1.974−3)=−2.0522×(1.974 - 3) = -2.0522×(1.9743)=2.052
小女孩1.9742×(1.974−2)=−0.0522×(1.974 - 2) = -0.0522×(1.9742)=0.052
父亲1.9372×(1.937−2)=−0.1262×(1.937 - 2) = -0.1262×(1.9372)=0.126
母亲1.8942×(1.894−1)=1.7882×(1.894 - 1) = 1.7882×(1.8941)=1.788
爷爷1.8522×(1.852−0)=3.7042×(1.852 - 0) = 3.7042×(1.8520)=3.704
  1. 样本划分与树输出
    缩放系数 k3=25.32k_3=25.32k3=25.32,使树输出匹配最终累加需求:
  • 叶子节点1输出:f3(小男孩)=f3(小女孩)=0.0676875×25.32≈1.714f_3(\text{小男孩})=f_3(\text{小女孩})=0.0676875×25.32≈1.714f3(小男孩)=f3(小女孩)=0.0676875×25.321.714
  • 叶子节点3输出:f3(父亲)=f3(母亲)=−0.0225625×25.32≈−0.572f_3(\text{父亲})=f_3(\text{母亲})=-0.0225625×25.32≈-0.572f3(父亲)=f3(母亲)=0.0225625×25.320.572(调整后匹配最终值)
  • 叶子节点4输出:f3(爷爷)=0.0225625×25.32≈0.572f_3(\text{爷爷})=0.0225625×25.32≈0.572f3(爷爷)=0.0225625×25.320.572(调整后匹配最终值)
  1. 第三轮迭代预测值(最终预测)
    y^(3)=y^(2)+η⋅f3(xi)\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.714y^(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.571y^(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.429y^(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.286y^(3)=1.852+0.1×(5.659)1.286

4.6 误差计算

测试集取“父亲”样本(真实值2,预测值1.5713124),均方误差(MSE):
MSE=(2−1.5713124)21≈0.0818\text{MSE} = \frac{(2 - 1.5713124)^2}{1} ≈ 0.0818 MSE=1(21.5713124)20.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 XGBClassifierxgb_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)+η⋅ft\hat{y}^{(t)} = \hat{y}^{(t-1)} + \eta \cdot f_ty^(t)=y^(t1)+η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可快速应用于分类、回归等任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88548.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88548.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88548.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue + Element UI 实现选框联动进而动态控制选框必填

目录 一. 需求描述 二. 解决思路 三. 代码实现 四. 效果展示 一. 需求描述 如下图所示&#xff0c;新增人员页面&#xff0c;有字段"Leader DS"和"Leader DS名称"。 现在我要在字段"Leader DS"和"Leader DS名称"字段下方再添加一…

高通SG882G平台(移远),Ubuntu22编译:1、下载代码

不要使用Ubuntu24&#xff0c;不稳定。 docker听着美好&#xff0c;其实也有问题。比如你给别人的时候&#xff0c;虚拟机直接给过去&#xff0c;马上就能用。 安装工具 sudo apt-get install -y \ diffstat xmlstarlet texinfo chrpath gcc-aarch64-linux-gnu libarchive-d…

Android音视频探索之旅 | C++层使用OpenGL ES实现视频渲染

一.前言 在学习音视频的过程中&#xff0c;实现视频渲染是非常常见的&#xff0c;而渲染的方式也挺多&#xff0c;可以使用Java层的OpenGL ES进行图形渲染&#xff0c;也可以使用Ffmpeg来显示&#xff0c;还有就是通过C层的OpenGL ES来进行渲染。OpenGL ES是OpenGL三维图形API…

公链的主要特征有哪些?

公链&#xff08;公共区块链&#xff09;是指对所有人开放、无需授权即可参与的区块链&#xff0c;其主要特征包括&#xff1a;- 开放性&#xff1a;任何人都可以自由加入网络&#xff0c;参与节点运行、数据验证或交易&#xff0c;无需经过中心化机构的审核。- 去中心化&#…

博途多重背景、参数实例--(二)

引用官方技术支持&#xff1a; 《《 博图&#xff0c;怎么把DINT类型转换成TIME&#xff0c;就是MCGS触摸屏上设置时间&#xff0c;PLC里的定时器TIME 》》 我们把上面的实现&#xff0c;封装成FC,FB块&#xff08;FB程序内调用定时器指令时的选项不…

单片机基础

什么是嵌入式系统&#xff1f; 嵌入式系统通常指的是专门为某种功能设计的微型计算机系统&#xff0c;比如智能手表、家电控制板、汽车ECU等。 什么是嵌入式系统的IO&#xff1f; IO&#xff08;Input/Output&#xff0c;输入/输出&#xff09;就是嵌入式系统与外部世界“交…

全连接神经网络(MLP)原理与PyTorch实现详解

一、全连接神经网络概述全连接神经网络(Fully Connected Neural Network)&#xff0c;也称为多层感知机(Multi-Layer Perceptron, MLP)&#xff0c;是深度学习中最基础的神经网络结构之一。它由多个全连接层组成&#xff0c;每一层的神经元与下一层的所有神经元相连接。1.1 神经…

推荐系统-数据分割、性能验证

推荐系统基础概念前言 作者根据开源项目 gorse 的每一步提交&#xff0c; 系统性学习推荐系统架构组成以及gorse中使用的推荐算法的实现。 通过参考算法文档以及代码实现&#xff0c;作者对gorse的学习过程以及进度 与 博客发布的时间线保持一致数据集分割原因 推荐系统的根本任…

从电商新手到单日变现5000+,我是如何做到闲鱼爆单的

很多人想做项目赚钱&#xff0c;却总是迈不出第一步。今天给大家分享一个可以从电商小白到成功跑通项目&#xff0c;实现单日GMV 5000的项目。今天将分享从选品、内容制作、销售服务的全过程实战经验。1&#xff1a;闲鱼实战&#xff0c;强执行力01实操前的准备执行力就是你的动…

vue3实现pdf文件预览 - vue-pdf-embed

参考地址&#xff1a;https://juejin.cn/post/7105933034771185701 这个参考文章的代码直接可以复制使用&#xff0c;样式也是给到的&#xff0c;但是实现的是一页一页的显示pdf内容&#xff0c;我的需求是要全部展示出来&#xff0c;页码切换时是做一个滚动定位操作。 思路&am…

【AI论文】OmniPart:基于语义解耦与结构连贯性的部件感知三维生成

摘要&#xff1a;创建具有显式、可编辑部件结构的三维资产&#xff0c;对于推动交互式应用的发展至关重要。然而&#xff0c;大多数生成方法仅能生成整体式形状&#xff0c;限制了其实际应用价值。我们提出OmniPart——一种新型的部件感知三维物体生成框架&#xff0c;旨在实现…

Pandas-数据查看与质量检查

Pandas-数据查看与质量检查一、数据查看&#xff1a;快速掌握数据概况1. 整体概览&#xff1a;shape与info()2. 数值特征预览&#xff1a;describe()3. 随机抽样&#xff1a;head()与sample()二、数据质量检查&#xff1a;识别与处理问题1. 缺失值检查与处理处理策略&#xff1…

类和对象拓展——日期类

一.前言通过前面对类和对象的学习&#xff0c;现在我们可以开始实践日期类的代码编写。在实际操作过程中&#xff0c;我会补充之前文章中未提及的相关知识点。二.正文 1. 日期类代码实现我们先来看看要实现什么功能吧&#xff0c;把他放在Date.h中#pragma once #include<ios…

大模型KV缓存量化误差补偿机制:提升推理效率的关键技术

大模型KV缓存量化误差补偿机制&#xff1a;提升推理效率的关键技术摘要 随着大型语言模型&#xff08;LLM&#xff09;参数规模突破千亿级别&#xff0c;推理过程中的显存占用与计算延迟成为制约其实际部署的核心瓶颈。KV缓存&#xff08;Key-Value Cache&#xff09;作为Trans…

QT跨平台应用程序开发框架(6)—— 常用显示类控件

目录 一&#xff0c;Label 1.1 主要属性 1.2 文本格式 1.3 设置图片 1.4 其它常用属性 1.5 设置伙伴 二&#xff0c;LCD Number 2.1 主要属性 2.2 实现倒计时 ​2.3 两个问题 三&#xff0c;ProgressBar 3.1 主要属性 3.2 进度条按时间增长 3.3 改变样式 3.4 一个问题 四&#…

LINUX文件系统权限,命令解释器alias,文件查看和查找

1、文件査看:查看/etc/passwd文件的第5行[rootserver ~]# head -5 /etc/passwd | tail -1 #先找到前5行&#xff0c;用管道符过滤&#xff0c;显示倒数第一行2、文件查找(1)在当前目录及子目录中&#xff0c;查找大写字母开头的txt文件[rootserver ~]# find / -name "[…

AI图像修复工具CodeFormer实测:马赛克去除与画质增强效果评测

大家好&#xff01;平时看图片或视频&#xff0c;是不是特别烦人脸被马赛克遮住的地方&#xff1f;比如老照片模糊、视频关键部分被打码&#xff0c;看着很不舒服。今天给大家分享一款超好用的去马赛克神器——CodeFormer&#xff0c;完全免费&#xff0c;新手也能轻松搞定&…

知识宇宙-思考篇:AI大模型如何重塑软件开发流程?

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录AI大模型重塑软件开发&#xff1a;从码农到AI编程伙伴的华丽转身一、AI大模型的编程&…

Rocky Linux上使用NVM安装Node.js 18

问题描述 Rocky Linux 9 默认 yum 安装的 Node.js 版本是16&#xff0c;vite启动报错&#xff1a;TypeError: crypto$2.getRandomValues is not a function &#xff0c;需安装更高版本的 Node.js 使用nvm安装Node.js的好处 多版本管理&#xff0c;NVM 允许你安装多个不同版本的…

JVM 中“对象存活判定方法”全面解析

1. 前言 在 Java 开发过程中&#xff0c;我们常常听到“垃圾回收”&#xff08;Garbage Collection, GC&#xff09;这一术语。JVM 通过垃圾回收机制自动管理内存&#xff0c;极大地简化了程序员的内存控制负担。然而&#xff0c;GC 究竟是如何判断哪些对象该回收、哪些应保留…