面向多目标的同时分位数回归(Quantile Regression)实现方法咨询
多目标场景分位数回归实现方案
核心原理
分位数回归通过pinball损失拟合指定分位下的预测值,不需要对残差分布做假设,天然适配多目标不确定性估计需求,你原来基于MultiRMSE的多目标拟合架构只需要做少量调整即可适配。
1 损失函数替换
将原来的MultiRMSE损失替换为多目标聚合的pinball损失即可:
- 单目标pinball损失公式:对于分位值
q,当真实值y大于预测值pred时,损失为q*(y-pred),否则损失为(1-q)*(pred-y) - 多目标场景下,对每个目标单独计算对应分位的pinball损失,再按业务需求加权求和/直接平均得到总损失
- 若需要同时估计多个分位(比如
[0.05, 0.5, 0.95]覆盖90%置信区间),将模型输出头维度设置为 目标数量 × 分位数数量,每个目标对应多个分位的预测值
以下是PyTorch版本的多目标分位数损失示例实现:
import torch def multi_target_quantile_loss(y_pred, y_true, quantiles, target_weights=None): """ y_pred: 模型输出,shape为 (batch_size, 目标数量, 分位数数量) y_true: 真实标签,shape为 (batch_size, 目标数量) quantiles: 待估计的分位值列表,比如 [0.05, 0.5, 0.95] target_weights: 各目标的损失权重,默认所有目标权重相等 """ batch_size, num_targets, _ = y_pred.shape if target_weights is None: target_weights = torch.ones(num_targets, device=y_pred.device) total_loss = 0.0 quantiles = torch.tensor(quantiles, device=y_pred.device).reshape(1, 1, -1) y_true = y_true.unsqueeze(-1) # 扩展维度匹配预测值 err = y_true - y_pred # 计算所有目标所有分位的pinball损失 pinball_loss = torch.max(quantiles * err, (quantiles - 1) * err) # 按目标加权聚合 for t in range(num_targets): total_loss += pinball_loss[:, t, :].mean() * target_weights[t] return total_loss / num_targets
2 模型结构调整
你原有适配MultiRMSE的模型不需要做核心结构修改,仅调整输出层即可:
- 仅需估计单个分位的多目标值:输出层维度和原有多目标数量一致,训练时用对应分位的损失替换MultiRMSE
- 需估计多个分位:输出层维度设置为
目标数量 × 分位数数量,训练时传入所有待估计分位值即可
3 效果验证指标
分位数回归的效果可以通过分位覆盖率验证:对某一分位的预测值,统计真实值低于该预测值的样本占比,该占比越接近设定的分位值,说明拟合效果越好,多目标场景下每个目标单独统计覆盖率即可。
如果需要考虑多目标之间的相关性带来的联合不确定性,可以在输出分支额外添加协方差矩阵预测模块,一般业务场景下独立分位估计已经可以满足绝大多数不确定性评估需求。
内容的提问来源于stack exchange,提问作者jlopezNEU
相关产品推荐
相关产品推荐

