在上一节中,我们看到有序目标统计(Ordered TS)提供了一种合理的方法,通过仅依赖数据中已观察到的历史信息来编码类别特征。与简单的目标编码方法相比,这项技术大幅降低了目标泄露的风险。然而,在标准的梯度提升训练过程中,一个称为预测偏差的问题仍然可能出现。预测偏差的出现,是因为在第 $m$ 次迭代中为特定训练样本计算的梯度(或残差)依赖于使用所有先前迭代构建的模型 $F_{m-1}$。如果在构建 $F_{m-1}$ 中的树时使用了目标统计信息,那么即使编码本身使用了有序目标统计,模型也已隐式地获取了当前样本目标变量的信息。模型更新过程本身会重新引入偏差。具体来说,当为样本 $x_i$ 计算残差时,模型已经通过先前提升步骤中使用的目标统计信息受到了样本 $i$ 目标值的影响。CatBoost 提出了有序提升来直接处理这种预测偏差。与在原始数据集上训练单个模型序列不同,有序提升使用训练数据的随机置换。考虑模型 $F_m$ 顺序构建的标准提升过程: $$ F_m(x) = F_{m-1}(x) + \alpha \cdot h_m(x) $$ 在此, $h_m(x)$ 是在第 $m$ 步训练的树,通常拟合到使用 $F_{m-1}$ 计算的负梯度(残差)$r_{m-1}$。问题在于,当为样本 $x_i$ 计算 $r_{m-1}$ 时,所使用的模型 $F_{m-1}$ 可能已经通过在步骤 $1, ..., m-1$ 中的目标编码受到了 $y_i$ 的影响。有序提升修改了此过程。其工作方式如下:生成置换: CatBoost 生成多个随机置换,例如 $\sigma_1, \sigma_2, ..., \sigma_S$,这些置换是训练数据索引 ${1, ..., n}$ 的。训练置换专用模型: 对于每个置换 $\sigma_s$,CatBoost 维护一个单独的模型序列 $M^s_0, M^s_1, ..., M^s_{m_{max}}$。有序残差计算: 当为置换 $\sigma_s$ 构建第 $m$ 棵树时,该特定置换中第 $i$ 个样本(即索引为 $\sigma_s(i)$ 的样本)的残差仅使用在置换 $\sigma_s$ 的前 $i-1$ 个样本上训练的模型 $M^s_{m-1}$ 进行计算。也就是说,残差 $r_{\sigma_s(i)}$ 依赖于 $M^s_{m-1}(\mathbf{x}_{\sigma_s(j)})$,其中 $j < i$。模型更新: 弱学习器(树) $h^s_m$ 使用这些精心计算的残差进行训练。置换 $s$ 的模型得到更新:$M^s_m = M^s_{m-1} + \alpha h^s_m$。最终模型: 最终的预测模型源自这些置换专用模型。具体机制很复杂,但它汇集了所有置换的学习结果。这一过程确保了在为给定样本计算梯度估计时,用于此计算的模型没有受到该样本目标值的影响。它模拟了推断时的情形,即目标值未知的情况。让我们用一个简化视图来理解这一点,以单个置换 $\sigma$ 为例。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fillcolor="#e9ecef", style=filled]; edge [color="#868e96"]; subgraph cluster_perm { label = "置换 σ"; bgcolor="#f8f9fa"; rankdir=LR; X1 [label="x_σ(1)"]; X2 [label="x_σ(2)"]; X3 [label="x_σ(3)"]; Xdots [label="..."]; Xn [label="x_σ(n)"]; X1 -> X2 -> X3 -> Xdots -> Xn [style=invis]; } subgraph cluster_model { label = "用于残差的模型 (步骤 m)"; bgcolor="#f8f9fa"; rankdir=LR; M0 [label="M_{m-1}(在 { } 上训练)", shape=ellipse, color="#1c7ed6", fillcolor="#a5d8ff"]; M1 [label="M_{m-1}(在 {x_σ(1)} 上训练)", shape=ellipse, color="#1c7ed6", fillcolor="#a5d8ff"]; M2 [label="M_{m-1}(在 {x_σ(1), x_σ(2)} 上训练)", shape=ellipse, color="#1c7ed6", fillcolor="#a5d8ff"]; Mdots [label="...", shape=none, fillcolor=none, color=none]; Mprev [label="M_{m-1}(在 {x_σ(1), ..., x_σ(n-1)} 上训练)", shape=ellipse, color="#1c7ed6", fillcolor="#a5d8ff"]; M0 -> M1 -> M2 -> Mdots -> Mprev [style=invis]; } X1 -> M0 [label=" 残差 r_σ(1) 使用"]; X2 -> M1 [label=" 残差 r_σ(2) 使用"]; X3 -> M2 [label=" 残差 r_σ(3) 使用"]; Xn -> Mprev [label=" 残差 r_σ(n) 使用"]; }有序提升在提升步骤 $m$ 的简化视图,以一个置换 $\sigma$ 为例。用于计算样本 $x_{\sigma(i)}$ 残差的模型仅使用置换中位于其之前的样本($x_{\sigma(1)}$ 到 $x_{\sigma(i-1)}$)构建。有序提升与有序目标统计相辅相成。有序目标统计确保样本 $x_i$ 的特征编码仅使用置换中位于其之前的样本的目标信息。有序提升则确保 $x_i$ 的梯度计算仅使用在该置换中位于其之前的样本上训练的模型。它们共同为防止目标泄露污染特征表示和模型更新步骤提供了防御。虽然维护 $S$ 个单独的模型看似计算量很大,但 CatBoost 采用高效的实现技术,特别是运用了其无偏差树(将在“无偏差树”一节讨论)的结构,使有序提升变得实用。“有序提升的主要优点是大幅减少预测偏差,从而使模型在训练数据到未见过数据上具有更好的泛化能力。这在处理包含强大类别预测器的数据集时尤其有益,因为在这些数据集中,目标泄露很容易导致训练期间的性能指标虚高,而这些指标无法转化为实际性能。最终的模型通常更可靠。”主要的权衡是与不采用此类机制的标准梯度提升实现相比,训练时间可能增加。然而,CatBoost 的整体优化,包括 GPU 加速和对类别数据的有效处理,通常使其在实践中具有竞争力甚至更快,特别是在其专门功能有优势的数据集上。通过直接解决预测偏差问题,有序提升结合有序目标统计,代表了梯度提升算法在处理类别数据方面的一大进步,大大提升了 CatBoost 在开箱即用时的准确性和稳定性方面的声誉。