60 秒回答模板

XGBoost 处理缺失值不是简单先填均值,而是在每个分裂节点为缺失样本学习一个默认方向。枚举某个特征分裂时,只用非缺失样本计算候选阈值,同时分别尝试把缺失样本放到左子树或右子树,选择带来更大增益的方向,推理时该节点缺失值就沿这个默认方向走。目标函数做二阶泰勒展开,是因为 XGBoost 每轮要在当前预测附近估计加一棵树后的损失变化,使用一阶梯度和二阶 Hessian 可以得到叶子权重的闭式解和分裂增益公式,让分裂选择更准确也更高效,并能自然结合正则化。

考点 不是简单填充
难度 真实面经题
回答目标 讲清原理、实现和边界

深入解析

01

缺失值默认方向

XGBoost 在每个节点学习缺失样本走左还是走右,而不是全局固定填充值。同一个特征在不同树、不同节点上的默认方向都可能不同,因为局部样本分布和目标不同。

02

如何学习方向

枚举分裂时,非缺失样本按特征值计算候选切分;缺失样本先临时归到一侧,再临时归到另一侧,比较两种情况下的分裂增益,选择增益更大的作为该节点默认方向。

03

二阶展开目标

Boosting 每轮新增一棵树来修正当前预测。XGBoost 用当前预测处的一阶梯度和二阶 Hessian 近似新增树带来的损失变化,比只用一阶信息更能反映曲率。

04

叶子权重和增益

二阶近似后,每个叶子的最优权重可以由该叶样本梯度和 Hessian 聚合得到,分裂增益也能写成左右子叶收益减去父叶收益再减正则项。这样可以快速比较大量候选分裂。

05

工程注意点

缺失值方向学习能利用缺失本身携带的信息,但如果训练和线上缺失机制不一致,效果会变差。回答时要补充缺失率监控、特征一致性和异常缺失切片评估。

易错点

  • 把 XGBoost 缺失值处理说成统一均值填充或 0 填充。
  • 只背二阶泰勒展开公式,不解释它如何服务分裂增益和叶子权重。
  • 认为默认方向是全局固定的,忽略它是节点级学习结果。
  • 忽略缺失机制变化导致训练线上不一致。

面试官追问

缺失值默认方向和均值填充有什么区别?

均值填充把缺失当成一个数值,可能抹掉缺失信息;默认方向是在每个节点根据目标增益学习缺失样本该走哪边。

为什么二阶展开比一阶更有用?

二阶项包含曲率信息,能更好估计新增树对损失的影响,并推导出叶子权重和分裂增益的闭式公式。

Hessian 很小会有什么风险?

可能导致叶子权重过大或不稳定,因此需要 lambda、min_child_weight 等正则和结构约束。

线上缺失率变化会怎样?

如果线上缺失机制和训练不同,默认方向学到的规律可能失效,需要监控缺失率、分布漂移和分切片效果。