guzhujushi
9907289ec8
feat(models): 审查 metrics.py:工程侧收口 + 修 r2/smape 两个真 bug(+18 条测试)
models/metrics.py(用户写、Codex 审):6 个回归指标 + 共享入口 verify_yt_yp 落地,
compare_models 仍是 TODO(L1)。
真 bug(决策 59,由用户亲手改定):
- r2_score 的 SS_tot 基准用了 np.mean(y_pred),必须是 np.mean(y_true)。
探针实测:修前 0.8803827751196172、修后 0.875 = sklearn.metrics.r2_score 一致;
adjusted_r2 复用它,一并修正。完美拟合(r2_score(y, y) == 1)与常量 y 都掩盖了这个错,
所以新测试特意用"非完美拟合"的数据。ss_tol 顺带改名 ss_tot。
- smape 的 np.where 掩码防不住零除(两条分支都会被求值),在
filterwarnings = ["error::RuntimeWarning"] 下任何含 0 的用例直接红 → 改 np.divide(where=),
数值结果不变(决策 60)。
工程侧(决策 47):报错文案统一为"参数名 + 实际值";补 7 处 docstring
(Parameters / Returns / Raises,把 NaN 报错、mape 遇 0、r2 常量 y、adjusted_r2 分母保护
写成契约;n_features 注明不含截距);ruff 9 条清零(6 F541 + 3 W293)。
tests/test_models.py:5 条 → 23 条(2 条摘 skip 转正 + 18 条新增)。
三连:pytest 224 passed / 26 skipped(250 收集)、ruff 0、pyright 0。
文档:STATUS 决策 59 / 60 + 第九轮(含 4 条待拍板口径);CHANGELOG 本轮条目;
docs/dev/personal-pitfalls.md 追加易错点 31(基准量抄错对象)与 32(np.where 掩码防不住零除)。
2026-10-10 17:07:46 +08:00
..
2026-10-01 17:43:48 +08:00
2026-10-01 17:43:48 +08:00
2026-10-03 19:17:22 +08:00
2026-10-02 20:43:03 +08:00
2026-10-01 17:43:48 +08:00
2026-10-10 17:07:46 +08:00
2026-10-10 09:31:30 +08:00
2026-10-03 19:59:38 +08:00
2026-10-01 17:43:48 +08:00