语言:中文
最后更新:2026-07-01
页面定位:模型文档
切换:English
QuantileLoss 实现 quantile 回归的 pinball(check)损失。PenalizedQuantileRegression 封装了最多 10 种惩罚和 8 种求解器,包括专门针对 SCAD/MCP 的 Proximal IRLS-CD 求解器。
| 组件 | 路径 |
|---|---|
| 损失 | statgpu.losses.QuantileLoss |
| 独立模型 | statgpu.linear_model.QuantileRegression |
| 惩罚模型 | statgpu.linear_model.penalized.PenalizedQuantileRegression |
| 专用求解器 | statgpu.solvers._proximal_irls_quantile.proximal_irls_quantile_solver |
| R 等价 | quantreg::rq() |
Pinball 损失,在分位数 τ ∈ (0, 1) 处:
逐样本梯度(subgradient,在 u=0 处):
关键属性:梯度是阶梯函数,不随残差大小变化。因此 has_hessian = False、smooth_gradient = False。
| 参数 | 默认值 | 说明 |
|---|---|---|
quantile |
0.5 |
目标分位数,取值范围 (0, 1)。τ=0.5 为中位数回归。 |
无尺度参数;quantile 回归是尺度无关的。
| 求解器 | 支持 | 说明 |
|---|---|---|
| Proximal IRLS-CD | ✅ | 专用:IRLS 上界 + LLA 处理 SCAD/MCP。大规模 ~49x GPU 加速。 |
| FISTA | ✅ | 非光滑惩罚(L1、SCAD、MCP)和非凸 group 惩罚。 |
| IRLS | ✅ | 光滑惩罚(L2、none)。使用 Frisch-Newton 算法(匹配 statsmodels QuantReg)。 |
| L-BFGS | ✅ | 光滑惩罚,中低维度。 |
| ADMM | ✅ | 所有惩罚的替代方案。 |
| Newton | ❌ | Quantile 无 Hessian。 |
| Proximal Newton | ❌ | Quantile 无 Hessian。 |
| 惩罚 | 求解器 (auto) | 说明 |
|---|---|---|
| l2 / none | IRLS | 5-15 次迭代收敛。 |
| l1 / elasticnet | FISTA | 基于 subgradient。 |
| SCAD / MCP | Proximal IRLS-CD | 最快:CPU ~3x / GPU ~49x 加速。 |
| adaptive_l1 | FISTA-LLA | 加权 L1 proximal。 |
| group_* | FISTA-LLA | Group proximal 算子。 |
from statgpu.linear_model import QuantileRegression
# 中位数回归,含 kernel 标准误
model = QuantileRegression(
quantile=0.5,
compute_inference=True,
inference_method="kernel", # Powell (1991) sandwich
kernel="epa", # Epanechnikov 核
bandwidth="hsheather", # Hall-Sheather 带宽
)
model.fit(X, y)
print(model.coef_) # 系数
print(model._bse) # 标准误
print(model._pvalues) # p 值
print(model._conf_int) # 95% 置信区间
# Bootstrap 推断,使用批量 FISTA(GPU 加速)
model = QuantileRegression(
quantile=0.5,
compute_inference=True,
inference_method="bootstrap",
n_bootstrap=200,
device="cuda", # 或 "torch" / "cpu"
)
model.fit(X, y)from statgpu.linear_model.penalized import PenalizedQuantileRegression
# 中位数回归 (τ=0.5)
model = PenalizedQuantileRegression(quantile=0.5, penalty='scad', alpha=0.1)
model.fit(X, y)
print(model.coef_)
# 上四分位数 + L2 惩罚
model = PenalizedQuantileRegression(quantile=0.75, penalty='l2', alpha=0.01)
model.fit(X, y)
# 下四分位数 + MCP
model = PenalizedQuantileRegression(quantile=0.25, penalty='mcp', alpha=0.1)
model.fit(X, y)import torch
X_t = torch.tensor(X, dtype=torch.float64).cuda()
y_t = torch.tensor(y, dtype=torch.float64).cuda()
model = PenalizedQuantileRegression(quantile=0.5, penalty='scad', alpha=0.1)
model.fit(X_t, y_t)sample_weight = np.ones(n)
sample_weight[:50] = 5.0 # 前 50 个样本权重加倍
model = PenalizedQuantileRegression(quantile=0.5, penalty='l2', alpha=0.01)
model.fit(X, y, sample_weight=sample_weight)对于 quantile + 非凸惩罚,专用求解器使用:
-
IRLS 二次上界:每次迭代计算权重 w_i = τ_i / max(|r_i|, ε)。形成非光滑 pinball 损失的二次上界:Q(β) = ½ Σ w_i(y_i − X_iβ)²。
-
LLA(局部线性近似):非凸 SCAD/MCP 通过 P'(|β_j|) 权重转为加权 L1。
-
并行对角化:Jacobi 风格更新使用矩阵运算(每次 O(np))——GPU 友好。
-
GPU 优化:收敛检查在 device 上比较,仅同步 bool 到 CPU。每 5 次迭代检查。
使用 Frisch-Newton 算法(匹配 statsmodels QuantReg):
- IRLS 权重:w_i = (τ + (1−2τ)·1_{r_i<0}) / max(|r_i|, ε)
- 求解加权最小二乘:(X'WX + n·α·I) β = X'Wy
- 重复至收敛(~5-15 次迭代)
| 属性 | 类型 | 说明 |
|---|---|---|
coef_ |
(p,) float | 估计系数 |
intercept_ |
float | 估计截距 |
n_iter_ |
int | 迭代次数 |
quantile |
float | 目标分位数 |
- R
quantreg::rq(): IRLS 路径系数与 Frisch-Newton IRLS 匹配到 1e-6。 - sklearn
QuantileRegressor: HiGHS LP 求解器产生相同的 active set 和系数(tol=1e-8)。 - FISTA-LLA 对等性: Proximal IRLS-CD 与 FISTA-LLA 的 active set 一致(rtol=0.15)。
- Score 使用加权 pinball 损失:
score()返回负平均 pinball 损失以兼容 sklearn。 sample_weight全求解器支持。- GPU 设备(
cuda/torch)不静默回退 CPU。 - 大规模问题(n=10K, p=500)GPU 比 CPU 快 ~49x。
- Koenker, R. & Bassett, G. (1978). Regression Quantiles. Econometrica, 46(1), 33-50.
- Koenker, R. (2005). Quantile Regression. Cambridge University Press.
- Wu, Y. & Liu, Y. (2009). Variable Selection in Quantile Regression. Statistica Sinica, 19, 801-817.
- Hunter, D. R. & Li, R. (2005). Variable Selection using MM Algorithms. Annals of Statistics, 33(4), 1617-1642.