拓冰建站拓冰建站
首页 / 资讯中心 / 正文

【机器学习】XGBoost 回归

一、模型定位XGBoosteXtreme 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_ih_i 1 - 分类逻辑损失令 p_i 1/(1e^{-pred_i})概率 g_i p_i - y_ih_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λ−(GLGR)2HLHRλ−γ \text{增益} \frac{G_L^2}{H_L \lambda} \frac{G_R^2}{H_R \lambda} - \frac{(G_LG_R)^2}{H_LH_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 停止条件预剪枝满足以下任一条件即停止分裂当前节点变为叶子树深度达到max_depth默认6叶子节点样本数 min_child_weight默认1最大增益 gamma阈值控制所有样本的 $ 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_i1假设当前有3个样本真实值 [100, 200, 300]当前预测值都是 150λ1$ g_i pred_i - y_i [50, -50, -150] $正表示预测偏高负表示预测偏低$ Σg 50 (-50) (-150) -150 $$ w -(-150) / (31) 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/(1e^{-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-100800 0.5×80 40第2棵40-605040 0.5×50 65第3棵65-353065 0.5×30 80第4棵80-201880 0.5×18 89第5棵89-111089 0.5×10 94观察每棵树的 g 越来越小因为预测越来越准每棵树的叶子权重越来越小因为需要修正的幅度变小了最终预测值 94虽然不是 100但如果继续加树会无限逼近学习率 0.5 让每步走保守一些防止一步冲过头七、三大工程加速机制机制说明并行化建树时不同特征的分裂评估互不干扰可利用多核CPU并行计算缓存感知预先对特征值排序并存储为块Block后续迭代复用排序结果减少IO开销近似算法使用百分位数分箱只在分位点默认100个计算增益牺牲极小精度换取数十倍速度提升八、与线性回归岭/贝叶斯的关键区别维度岭回归 / 贝叶斯回归XGBoost模型结构线性加权和全局单一公式数百棵树的累加分段常数特征关系基本形式只能捕捉线性关系但可加核技巧扩展自动捕捉非线性交互如年龄×面积输出信息系数值贝叶斯还给出预测方差代表不确定性仅有预测值黑盒需SHAP等工具解释计算速度极快毫秒级较慢秒-分钟级数据量要求特征数 样本数时容易失效特征数 样本数时仍可用但需调大正则化λ并限制树深度防过拟合可解释性强系数直接解释弱需SHAP等工具辅助超参数调优1-2个λ10个树深、学习率、正则化等
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门