Skip to content

Latest commit

 

History

History
237 lines (180 loc) · 8.78 KB

File metadata and controls

237 lines (180 loc) · 8.78 KB

损失函数 (LossBase)

语言:中文

最后更新:2026-07-27

页面定位:模型文档

切换:English

概述

LossBase 是 statgpu 中所有损失函数的通用基类。它为优化求解器和惩罚函数提供统一接口。

求解器算法详见:求解器算法

各损失详细文档参见:

  • 分位数回归 — pinball 损失、PenalizedQuantileRegression、Proximal IRLS-CD
  • 稳健回归 — Huber、Bisquare、Fair 损失、PenalizedRobustRegression
  • CoxPH — Breslow/Efron/Exact、start-stop、分层、推断与 CV

五种新损失类型扩展了 LossBase(在已有 7 种 GLM 家族之外):

损失 R 等价 用途
分位数 QuantileLoss quantreg::rq() 条件分位数、中位数回归
Huber HuberLoss MASS::rlm() 稳健回归(M-估计器)
Bisquare BisquareLoss MASS::rlm(psi="bisquare") 重降 M-估计器
Fair FairLoss MASS::rlm(psi="fair") Fair M-估计器
Cox PH CoxPartialLikelihoodLoss survival::coxph() 生存分析

LossBase 提供统一接口,但可用组合仍由各损失和公开 estimator 的能力约束,不应理解为 每个损失都自动支持全部惩罚和求解器。惩罚封装器包括 PenalizedQuantileRegressionPenalizedRobustRegressionPenalizedCoxPHModel;其中 Cox 封装器当前验证 L1、L2、Elastic Net、SCAD、MCP 五类惩罚。

路径

statgpu.losses.LossBase
statgpu.losses.QuantileLoss
statgpu.losses.HuberLoss
statgpu.losses.BisquareLoss
statgpu.losses.FairLoss
statgpu.losses.CoxPartialLikelihoodLoss

架构

LossBase (statgpu/losses/_base.py)
├── GLMLoss (statgpu/glm_core/_base.py) — 添加 _mu_from_eta、IRLS 提示
│   ├── SquaredErrorLoss、LogisticLoss、PoissonLoss 等
├── QuantileLoss — pinball 损失,非光滑
├── HuberLoss — 稳健,光滑
├── BisquareLoss — 重降,光滑
├── FairLoss — Fair 损失,光滑
└── CoxPartialLikelihoodLoss — 生存分析,有 Hessian

目标函数

所有损失最小化: $$ \min_{\beta} \frac{1}{n} \sum_{i=1}^n \ell(X_i \beta, y_i) + \text{penalty}(\beta) $$

Quantile 损失 (Pinball)

$$ \ell(\eta, y) = \rho_\tau(y - \eta), \quad \rho_\tau(u) = u \cdot (\tau - \mathbf{1}{u < 0}) $$

$\tau = 0.5$ 时即为绝对损失(中位数回归)。

Huber 损失

$$ \ell(\eta, y) = \begin{cases} \frac{1}{2}(y - \eta)^2 & \text{若 } |y - \eta| \le \delta \\ \delta(|y - \eta| - \frac{1}{2}\delta) & \text{否则} \end{cases} $$

Bisquare 损失 (Tukey biweight)

$$ \ell(\eta, y) = \rho_c(y - \eta) $$,其中 $$ \rho_c(u) = \begin{cases} \frac{c^2}{6}\left[1 - \left(1 - (\frac{u}{c})^2\right)^3\right] & |u| \le c \ \frac{c^2}{6} & |u| > c \end{cases} $$

Cox 部分似然(负对数)

$$ \ell(\beta) = -\frac{1}{n} \log L(\beta) $$

CoxPartialLikelihoodLoss 接收 [time, event] 二列响应,$L(\beta)$ 为 Breslow 或 Efron 部分似然。它是 PenalizedCoxPHModel 的标准右删失损失。需要 Exact ties、 $(\text{start},\text{stop}]$stratasubject_id 时,应使用 CoxPH/CoxPHCV 的计数过程实现。

求解器兼容性

求解器 Quantile Huber Bisquare Fair Cox PH
FISTA
FISTA-BB
FISTA-LLA ✅ (SCAD/MCP) ✅ (SCAD/MCP)
Proximal IRLS-CD ✅ (SCAD/MCP)
Proximal Newton ❌ (无 Hessian) ✅ (5-10 iter) ✅ (5-10 iter) ❌(Cox 当前走 FISTA-LLA)
Newton ❌ (无 Hessian)
L-BFGS
ADMM
IRLS ✅ (仅 L2)

参数

QuantileLoss

参数 默认值 说明
quantile 0.5 目标分位数,取值范围 (0, 1)

HuberLoss

参数 默认值 说明
delta 1.0 阈值:|u| ≤ delta 时二次,否则线性
epsilon 1.345 稳健性调节(95% 高斯效率)
method "MAD" 尺度估计方法:"MAD""huber_prop2"

BisquareLoss

参数 默认值 说明
epsilon 4.685 稳健性调节(95% 高斯效率)
method "MAD" 尺度估计方法

FairLoss

参数 默认值 说明
c 1.4 调节常数

CoxPartialLikelihoodLoss

参数 默认值 说明
ties "breslow" ties 处理方法:"breslow""efron"

此处的 loss 对象不接受 ties="exact"。Exact 是 statgpu.survival.CoxPHCoxPHCV 的 estimator 级能力。

示例

CPU

import numpy as np
from statgpu.losses import QuantileLoss, HuberLoss
from statgpu.solvers import lbfgs_solver

n, p = 200, 10
X = np.random.randn(n, p)
y = X @ np.array([1.0, 0, -0.5, 0, 0.3, 0, 0, 0, 0, 0]) + np.random.randn(n) * 0.5

# Quantile 回归(中位数)
loss = QuantileLoss(quantile=0.5)
coef, n_iter = lbfgs_solver(loss, None, X, y)

# 稳健回归
loss = HuberLoss(epsilon=1.345)
coef, n_iter = lbfgs_solver(loss, None, X, y)

GPU (torch-CUDA)

import torch
X_t = torch.tensor(X, dtype=torch.float64).cuda()
y_t = torch.tensor(y, dtype=torch.float64).cuda()

from statgpu.losses import HuberLoss
from statgpu.penalties import SCADPenalty
from statgpu.solvers import fista_solver

loss = HuberLoss(epsilon=1.345)
coef, n_iter = fista_solver(loss, SCADPenalty(alpha=0.1), X_t, y_t)

Penalized Quantile + SCAD(CPU/GPU)

from statgpu.linear_model.penalized import PenalizedQuantileRegression

# CPU
model = PenalizedQuantileRegression(quantile=0.5, penalty='scad', alpha=0.1)
model.fit(X, y)

# GPU
model = PenalizedQuantileRegression(quantile=0.5, penalty='scad', alpha=0.1)
model.fit(X_t, y_t)

外部验证

  • QuantileLoss: 与 R quantreg::rq()(Frisch-Newton IRLS)和 sklearn QuantileRegressor(HiGHS LP 求解器)对齐。系数精度 1e-6。
  • HuberLoss: 与 R MASS::rlm() Huber psi 函数对齐。
  • BisquareLoss: 与 R MASS::rlm(psi="bisquare") 对齐。支持 SCAD/MCP 通过 proximal Newton(5-10 次迭代收敛)。
  • CoxPartialLikelihoodLoss / CoxPH:Breslow/Efron 与 statsmodels PHReg 对齐;Exact 由小规模暴力枚举验证。2026-07-12 的 quickfull 产物覆盖 NumPy、CuPy、 Torch 的 delayed-entry、Exact、重 ties、stratified start-stop 兼容性与精度矩阵。

注意事项

  • CoxPartialLikelihoodLoss 的 Breslow/Efron 路径在 NumPy、CuPy CUDA 和 Torch CUDA 后端执行;Torch 不依赖 CuPy 桥接。预处理阶段会把排序后的 timeevent 一次性复制到主机以构造确定性的失败组元数据,再把索引缓存到所选设备;设计矩阵、 predictor、目标函数、梯度和 Hessian 在迭代中不会转到 CPU。显式 GPU 输入在对应 路径失败时 raise RuntimeError,不会回退 NumPy。
  • SCAD/MCP 的 trusted-gradient 路径会跳过重复的 finite-state 检查,但每次计算仍保留 自适应 predictor-range 分段;求解器快速路径不会关闭稳定的风险集缩放。
  • PenalizedCoxPHModel 无可识别截距,且当前仅提供估计:fit_intercept=True 会报错, compute_inference=True 会抛出 NotImplementedError。SCAD/MCP 使用 FISTA-LLA; 需要标准误和基线风险时使用 CoxPH
  • QuantileLosssmooth_gradient=Falsehas_hessian=False;对 SCAD/MCP 使用 FISTA 或 proximal IRLS-CD。
  • HuberLossBisquareLosshas_hessian=True;proximal Newton 对 SCAD/MCP 5-10 次迭代收敛。
  • 所有损失接受 sample_weightCoxPartialLikelihoodLoss 除外,会 raise NotImplementedError)。
  • 详见 Loss × Penalty × Solver 框架

参考文献

  • Koenker, R. & Bassett, G. (1978). Regression Quantiles. Econometrica, 46(1), 33-50.
  • Huber, P. J. (1964). Robust Estimation of a Location Parameter. Annals of Mathematical Statistics, 35(1), 73-101.
  • Beaton, A. E. & Tukey, J. W. (1974). The Fitting of Power Series. Technometrics, 16(2), 147-185. (Bisquare)
  • Cox, D. R. (1972). Regression Models and Life-Tables. Journal of the Royal Statistical Society, B34, 187-220.
  • Wu, Y. & Liu, Y. (2009). Variable Selection in Quantile Regression. Statistica Sinica, 19, 801-817.
  • Fan, J. & Li, R. (2001). Variable Selection via Nonconcave Penalized Likelihood. JASA, 96, 1348-1360. (SCAD)