第2章 目标函数与树的打分 本章跟着一条线走:把"每轮修正残差"的直觉,一步步翻译成一个能求导、能加正则、能闭式求解的目标函数。 从加法模型的定义出发,经过泰勒二阶展开、叶子权重的闭式解、分裂增益公式,最后落在稀疏感知与系统设计——公式越写越长,但每一步都在回答上一节留下的问题。 一条主线 贯穿本章的案例是一个五样本的迷你回归任务。第 1 节我们为它写下目标函数:损失项衡量预测好坏,正则项惩罚树复杂度,两部分天生打架——损失要树多长,正则要树少长,XGBoost 的全部艺术就是让这场架打得明明白白。第 2 节发现目标函数里有个"旧预测加新树"套在损失函数里的复合结构没法直接优化,于是请出泰勒二阶展开,用一阶导数 g 和二阶导数 h 把损失的信息压缩成每样本两个数。
本章跟着一条线走:把"每轮修正残差"的直觉,一步步翻译成一个能求导、能加正则、能闭式求解的目标函数。 从加法模型的定义出发,经过泰勒二阶展开、叶子权重的闭式解、分裂增益公式,最后落在稀疏感知与系统设计——公式越写越长,但每一步都在回答上一节留下的问题。
贯穿本章的案例是一个五样本的迷你回归任务。第 1 节我们为它写下目标函数:损失项衡量预测好坏,正则项惩罚树复杂度,两部分天生打架——损失要树多长,正则要树少长,XGBoost 的全部艺术就是让这场架打得明明白白。第 2 节发现目标函数里有个"旧预测加新树"套在损失函数里的复合结构没法直接优化,于是请出泰勒二阶展开,用一阶导数 g 和二阶导数 h 把损失的信息压缩成每样本两个数。第 3 节把树的形状当作已知条件,推导出叶子权重的闭式解与整棵树的结构分数。第 4 节让树生长:分裂增益公式告诉我们每个候选切分点值不值得切,γ 参数就是长在公式里的剪枝闸门。第 5 节处理真实世界的脏数据(缺失值)与真实世界的算力约束(并行、缓存),公式落地成工程。
第 1 节(加法模型与目标函数)回答"要优化什么"。第 2 节(泰勒二阶展开)回答"旧模型挡在损失里面怎么办"——这是 XGBoost 区别于经典 GBDT 的第一个技术分水岭。第 3 节(结构打分与叶子权重)给出"给定树形状,最优权重是多少、这棵树值多少分"的闭式答案,obj 越小树越好。第 4 节(分裂增益)把"树怎么长"变成可计算的贪心流程,并顺带解释 max_depth、min_child_weight、gamma 三个参数的数学出身。第 5 节(稀疏感知与系统设计)面对现实:特征有缺失、数据装不进内存、多核要喂饱——XGBoost 论文里最常被引用的工程贡献都在这里。
本章最大的认知转折在第 3 节:树的好坏可以被一个标量分数刻画。一旦接受"每棵树有一个 obj 分数",生长、剪枝、早停、调参就统一成同一件事——寻找让分数下降最多的结构改动。很多读者觉得 XGBoost 参数又多又玄,根源是没走过这条推导链;走完之后你会发现,第 3 章的参数表不过是本章公式的参数化清单。
本章要求会求一元函数的一阶与二阶导数(乘法法则与链式法则足够),并对"二次函数配方求最小值"有印象——叶子权重的闭式解本质上就是一次配方。第 1 章的残差实验与 Bagging、Boosting 对比是本章的直接地基:目标函数里"拟合残差"的直觉全部来自那里。代码部分只需要 numpy 基础;每段推导都配了五样本的可复算例子,建议边读边在编辑器里验证,公式与数字对上的那一刻,这一章就真正属于你了。
主线推进到"公式齐备"的节点:目标函数、权重解、增益公式全部就位,但它们都以符号形式存在——γ、λ、深度、采样率都还是抽象量。第 3 章把这些符号逐一映射到 XGBoost 的参数体系,配上物理含义与调优优先级,公式就从纸面走进命令行。