92 lines
3.7 KiB
Markdown
92 lines
3.7 KiB
Markdown
---
|
||
title: "Hosmer-Lemeshow Test"
|
||
type: concept
|
||
tags: [model-evaluation, calibration-testing, goodness-of-fit]
|
||
last_updated: 2026-04-25
|
||
---
|
||
|
||
## Definition
|
||
|
||
Hosmer-Lemeshow(HL)检验是一种评估二分类模型预测概率校准程度的拟合优度检验,通过比较预测概率分箱后的观测正例数与期望正例数,判断模型预测与实际结果之间是否存在显著差异。p-value < 0.05 时拒绝原假设(模型校准良好),认为模型存在显著的校准偏差。
|
||
|
||
## Algorithm
|
||
|
||
1. 将样本按预测概率从小到大分箱(默认 10 箱,或自定义 g 组)
|
||
2. 对每箱计算:
|
||
- **观测正例数** $O_g = \sum_{i \in \text{group } g} y_i$
|
||
- **期望正例数** $E_g = \sum_{i \in \text{group } g} \hat{p}_i$
|
||
- **样本数** $n_g$
|
||
3. 计算 HL 统计量:
|
||
|
||
$$H = \sum_{g=1}^{G} \frac{(O_g - E_g)^2}{E_g (1 - E_g / n_g)}$$
|
||
|
||
4. 自由度 $df = G - 2$(减去截距和斜率估计参数)
|
||
5. 与 $\chi^2(df)$ 分布比较,$p = 1 - F_{H}(H)$
|
||
|
||
## Interpretation
|
||
|
||
```python
|
||
from scipy.stats import chi2
|
||
|
||
def hosmer_lemshow_test(y_true: pd.Series, y_pred: pd.Series, groups: int = 10) -> dict:
|
||
data = pd.DataFrame({"y": y_true, "p": y_pred})
|
||
data["bucket"] = pd.qcut(data["p"], groups, duplicates="drop")
|
||
|
||
agg = data.groupby("bucket", observed=True).agg(
|
||
n=("y", "count"),
|
||
observed=("y", "sum"),
|
||
expected=("p", "sum"),
|
||
)
|
||
|
||
hl_stat = (
|
||
((agg["observed"] - agg["expected"])**2) /
|
||
(agg["expected"] * (1 - agg["expected"] / agg["n"]))
|
||
).sum()
|
||
|
||
dof = len(agg) - 2
|
||
p_value = 1 - chi2.cdf(hl_stat, dof)
|
||
|
||
return {
|
||
"HL_statistic": round(hl_stat, 4),
|
||
"p_value": round(p_value, 6),
|
||
"calibrated": p_value >= 0.05, # True = well calibrated
|
||
"dof": dof,
|
||
"groups_used": len(agg),
|
||
}
|
||
```
|
||
|
||
| p-value | 判读 |
|
||
|---------|------|
|
||
| ≥ 0.05 | 🟢 模型校准良好,无显著证据表明预测概率偏离实际频率 |
|
||
| < 0.05 | 🔴 拒绝原假设,模型存在显著校准偏差 |
|
||
|
||
## Limitations
|
||
|
||
1. **分组方式敏感**:不同分箱数量/方法导致不同结果,10 等分是惯例但非最优
|
||
2. **样本量敏感**:大样本下即使微小偏差也能导致显著 p-value(实际影响可能很小)
|
||
3. **掩盖子群体问题**:整体通过 HL 检验不等于所有子群体都校准良好
|
||
4. **序贯分组问题**:qcut 在重复值多时可能合并箱子,需检查 `groups_used`
|
||
|
||
## Alternatives
|
||
|
||
- **Brier Score**:无需分组,对样本量稳健,但只能给出误差量级而非定位
|
||
- **Spiegelhalter's Z-test**:基于 Brier Score 的统计检验
|
||
- **Reliability Curves**:可视化诊断,比 HL 检验提供更多信息
|
||
- **Expected Calibration Error (ECE)**:量化平均校准误差,解释性更强
|
||
|
||
## Model QA 中的应用
|
||
|
||
Model QA Specialist 将 HL 检验用于:
|
||
1. **模型上线前验证**:新模型上线必须通过 HL 检验(p ≥ 0.05)
|
||
2. **定期监控**:在 OOT 窗口上重复执行,监控校准随时间恶化趋势
|
||
3. **子群体分层测试**:在关键子群体(高风险/低风险/新客户)上分别执行
|
||
4. **Champion-Challenger**:对比 champion model vs challenger model 的 HL 结果
|
||
|
||
## Relationship
|
||
|
||
- **被依赖** [[Calibration-Testing]]:HL 检验是 Calibration Testing 的核心统计工具之一
|
||
- **依赖** [[Discrimination-Metrics]]:先确认模型有区分能力(AUC/Gini 达标),再讨论校准
|
||
- **依赖** [[Population-Stability-Index]]:PSI 漂移往往是 HL 检验失败的前兆
|
||
- **依赖** [[SHAP]]:HL 检验发现校准问题后,用 SHAP waterfall 诊断具体原因
|
||
- **支撑** [[specialized-model-qa]](Source):Model QA Specialist 校准测试步骤的核心工具
|