XGBoost 如何处理缺失值?
简化版
XGBoost 在每个候选切分中学习缺失值的默认方向:分别尝试缺失样本走左或右,选择增益更高者;预测遇到 NaN 就沿保存方向走。它不是先用均值填补,缺失模式变化时默认方向也可能失效。
详细版
-
稀疏感知算法只遍历非缺失值并同时评估默认方向。
-
缺失本身可携带信号,但这不代表因果合理。
-
数值 0 是否被当缺失取决于数据格式与 missing 配置。
-
训练和线上缺失表示必须一致,避免 NaN、空串、哨兵值混用。
-
缺失率和默认路由比例应按特征监控。
完整版教学
一、默认方向也是切分参数的一部分
对阈值切分,非缺失样本按大小分流,缺失样本没有比较结果。
XGBoost 将“缺失全走左”和“缺失全走右”都计入增益搜索。
所选方向是当前节点、当前训练分布下最优,因此同一特征在不同节点可能有不同默认方向。
二、底层机制与公式
gain_left_missing = gain(L + M, R)
gain_right_missing = gain(L, R + M)
default = argmax(gain_left_missing, gain_right_missing)
三、带数字的推演
某节点非缺失切分后左/右各 40 个,另有 20 个缺失。
缺失走左增益 12,走右增益 8,则保存左为默认;线上 NaN 不做均值比较,直接进入左子树。
四、方案对比
| 方案/对象 | 核心特点 | 代价或边界 |
|---|---|---|
| 原生默认方向 | 无需预填补 | 依赖训练缺失机制 |
| 统计插补 | 流水线通用 | 需防泄漏并加指示器 |
| 单独缺失分支 | 语义直观 | 结构与实现成本更高 |
五、执行流程
统一缺失编码 -> 训练节点同时搜索阈值和默认方向
-> 保存方向 -> 验证缺失/非缺失切片 -> 上线监控缺失率和路由
六、边界条件与工程代价
用 -999 表示缺失却未配置为 missing,模型会把它当极小真实值参与阈值,行为与原生 NaN 路由不同。
若线上采集故障使缺失率从 2% 变 40%,模型会把大量请求送入训练时很少使用的路径,必须触发数据质量告警。
记忆钩子:缺失值不参与大小比较,而是让左右两边各试一次,收益高的一边成为本节点默认路。
七、常见误区与追问
-
误区:XGBoost 自动用均值填补缺失。 它通常学习节点级默认方向。
-
追问:默认方向怎么选? 比较缺失整体走左或右的切分增益。
-
误区:0 一定会被当成缺失。 取决于稀疏表示和 missing 参数。
-
追问:同一特征默认方向固定吗? 不同节点可学习不同方向。
-
追问:如何上线验收? 分别评估缺失切片并监控缺失率与路由占比。
八、加强记忆
缺失值不参与大小比较,而是让左右两边各试一次,收益高的一边成为本节点默认路。
这个规则依赖训练缺失机制,必须监控漂移。