趋近智
如前所述,标准回归方法通常侧重于预测目标变量的条件均值。然而,分位数回归使我们能够对条件分位数(例如中位数、第10百分位数或第90百分位数)进行建模,对预测变量与目标变量分布之间的关系提供了更全面的认识。为了使用梯度提升进行分位数回归,我们需要定义并实施合适的损失函数:即分位数损失,也称作弹珠损失。
针对特定分位数 α∈(0,1) 的分位数损失函数衡量真实值 y 与预测分位数 y^ 之间的误差。其定义为:
Lα(y,y^)={α(y−y^)(1−α)(y^−y)如果 y−y^>0如果 y−y^≤0这可以使用指示函数 I(⋅) 更简洁地表示:
Lα(y,y^)=(y−y^)(α−I(y−y^<0))请注意其不对称性:
下图展示了不同 α 值下的弹珠损失。
该图显示了分位数损失特有的“弹珠”形状。请注意斜率在零误差处如何变化,以及不对称性如何取决于分位数 α。对于 α=0.9,正误差(低估)受到更重的惩罚,而对于 α=0.1,负误差(高估)则受到更大的惩罚。α=0.5 对正负误差对称处理。
梯度提升算法通过迭代地将基础学习器(通常是树)拟合到损失函数相对于当前预测的负梯度。因此,我们需要 Lα(y,y^) 相对于 y^ 的一阶导数(梯度)。XGBoost 和 LightGBM 等一些高级实现也使用二阶导数(Hessian)来实现更快的收敛和正则化。
让我们找出梯度:
g=∂y^∂Lα(y,y^)=I(y−y^<0)−α=I(y^>y)−α因此,梯度为:
现在,考虑 Hessian:
h=∂y^2∂2Lα(y,y^)=∂y^∂g梯度是一个阶跃函数,这意味着它的导数在除 y^=y 点之外的所有地方都为零,而在 y^=y 点处,导数是未定义的(数学上,它涉及一个狄拉克δ函数)。标准的梯度提升实现,特别是那些使用二阶近似(如 XGBoost)的实现,需要一个明确定义的 Hessian。
我们如何处理这个问题?
objective='quantile')。在这种情况下,库在内部处理 Hessian,可能使用近似值或适用于非平滑目标函数的特定算法。如果可用,使用内置目标函数通常是推荐的方法。让我们看看如何在 Python 中为 XGBoost 或 LightGBM 等库构建自定义分位数损失函数。这些库期望一个函数,该函数接收当前预测值 (preds) 和真实标签 (dtrain,其中包含 y),并为每个样本返回梯度和 Hessian。
以下是自定义分位数目标函数的 Python 函数结构:
import numpy as np
def quantile_objective(alpha):
"""
分位数回归的自定义目标函数。
参数:
alpha (浮点数): 目标分位数,必须在 (0, 1) 之间。
返回值:
可调用对象:一个与 XGBoost/LightGBM 自定义目标函数兼容的函数。
"""
def objective_function(preds, dtrain):
"""
计算分位数损失的梯度和 Hessian。
参数:
preds (np.ndarray): 当前模型预测。
dtrain: 数据容器(例如 xgboost.DMatrix 或 lightgbm.Dataset)
通过 dtrain.get_label() 获取真实标签。
返回值:
grad (np.ndarray): 损失函数相对于 preds 的梯度。
hess (np.ndarray): 损失函数相对于 preds 的 Hessian。
"""
labels = dtrain.get_label()
errors = preds - labels # 注意:使用 preds - labels 与 I(preds > y) 约定一致
# 计算梯度
grad = np.where(errors > 0, 1 - alpha, -alpha)
# 计算 Hessian(使用小的常数近似)
# 一个小的正常量有助于确保算法的稳定性。
# 具体值可能需要调整或实验。
hess = np.full_like(preds, 1.0) # 或者更小的值,如 1e-6
return grad, hess
return objective_function
# 示例用法
# alpha_value = 0.75 # 目标是第75百分位数
# custom_obj = quantile_objective(alpha_value)
# 在 XGBoost 中:
# model = xgb.train(params, dtrain, num_boost_round=100, obj=custom_obj)
# 在 LightGBM 中:
# model = lgb.train(params, dtrain, num_boost_round=100, fobj=custom_obj)
重要考量:
alpha 参数的 objective='quantile'),这些函数通常经过优化,比自定义实现更受青睐。CatBoost 也支持分位数损失函数。通过实施或使用分位数损失函数,您可以使梯度提升模型具备超越均值预测、估计条件分位数的能力,从而为各种特殊任务提供对底层数据分布更丰富、更全面的认识。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造