拦截

Added in version 2.0.0.

自2.0.0版本起,XGBoost支持在训练时基于目标值自动估计模型截距(名为 base_score)。该行为可以通过将 base_score 设置为常数值来控制。以下代码片段禁用了自动估计:

import xgboost as xgb

reg = xgb.XGBRegressor()
reg.set_params(base_score=0.5)

此外,这里的 0.5 表示应用逆链接函数后的值。有关描述,请参阅文档末尾。

除了 base_score 之外,用户还可以通过数据字段 base_margin 提供全局偏差,这取决于任务,可以是向量或矩阵。在多输出和多类情况下,base_margin 是一个大小为 (n_samples, n_targets)(n_samples, n_classes) 的矩阵。

import xgboost as xgb
from sklearn.datasets import make_regression

X, y = make_regression()

reg = xgb.XGBRegressor()
reg.fit(X, y)
# Request for raw prediction
m = reg.predict(X, output_margin=True)

reg_1 = xgb.XGBRegressor()
# Feed the prediction into the next model
reg_1.fit(X, y, base_margin=m)
reg_1.predict(X, base_margin=m)

它为每个样本指定偏差,并且可以用于在其他模型之上堆叠XGBoost模型,参见 从预测中提升的演示 以获取一个工作示例。当指定 base_margin 时,它会自动覆盖 base_score 参数。如果你正在堆叠XGBoost模型,那么使用应该相对简单,前一个模型提供原始预测,新模型使用该预测作为偏差。对于更多自定义输入,用户需要额外注意链接函数。设 \(F\) 为模型,\(g\) 为链接函数,由于当存在样本特定的 base_margin 时,base_score 被覆盖,我们在这里将省略它:

\[g(E[y_i]) = F(x_i)\]

当提供基边距 \(b\) 时,它会被添加到原始模型输出 \(F\) 中:

\[g(E[y_i]) = F(x_i) + b_i\]

最终模型的输出是:

\[g^{-1}(F(x_i) + b_i)\]

以伽马偏差目标 reg:gamma 为例,它具有对数链接函数,因此:

\[\begin{split}\ln{(E[y_i])} = F(x_i) + b_i \\ E[y_i] = \exp{(F(x_i) + b_i)}\end{split}\]

因此,如果你正在使用类似GLM的模型及其相应的目标函数生成输出,请确保输出尚未通过逆链接(激活)进行转换。

base_score``(截距)的情况下,可以在估计后通过 :py:meth:`~xgboost.Booster.save_config` 访问它。与 ``base_margin 不同,返回的值表示在应用逆链接后的值。以逻辑回归和 logit 链接函数为例,给定 base_score 为 0.5,\(g(intercept) = logit(0.5) = 0\) 被添加到原始模型输出中:

\[E[y_i] = g^{-1}{(F(x_i) + g(截距))}\]

0.5 等同于 \(base\_score = g^{-1}(0) = 0.5\)。如果你移除模型并仅考虑截距,这会更直观,因为截距是在模型拟合之前估计的:

\[\begin{split}E[y] = g^{-1}{(g(截距))} \\ E[y] = 截距\end{split}\]

对于一些目标如MAE,存在接近的解决方案,而对于其他目标,则通过一步牛顿法进行估计。