Files
guzhujushi 748affb7f0 feat(models): 落地 compare_models(指标名别名映射)+ 同步你的三条入口口径
你的三条改动(决策 61,已复测入库):
- verify_yt_yp 拦 Inf:rmse([1.0, inf], ...) 从安静返回 inf 变成 ValueError。
- 至少 2 个样本:rmse(1.0, 1.0) 不再被当成 1 个样本算出 0.0。
- mape 从"只拦 0"改成拦 y_true <= 0:原来对负数返回 -1.0(无意义)。
Codex 侧把这三条写进 7 处 Raises(易错点 30 复发 1 次),
test_mape_rejects_zero_in_y_true 的 match 文案改为"非正数",另补 Inf / 样本数两条测试。

compare_models(决策 62,A 档,Codex 实现):
- 别名映射 _METRIC_FUNCS:r2 与 r2_score 指向同一个函数,传哪个列名就叫哪个,
  两个一起传报 ValueError;adjusted_r2 不进表(需要 n_features)。
- cv=0 全量拟合后打分;cv>=2 用手写 K 折(get_rng(random_state).permutation +
  np.array_split),不引入 sklearn 依赖;报折间均值;每折至少 2 个样本 => cv <= n // 2。
- 排序方向跟第一个指标走(误差类升序、R² 降序);models 必须传模型对象(fit/predict),
  X 必须二维,metrics 必须是 tuple/list。
- 原 test_compare_models_... 的用法是错的(传拟合结果当模型),改成测试桩后摘 skip。

tests/test_models.py:23 -> 31 条(排序两条、别名、坏指标名 / 坏 models / 坏 cv、
每折下限、random_state 可复现)。

三连:pytest 233 passed / 25 skipped(258 收集)、ruff 0、pyright 0。

文档:STATUS 决策 61 / 62 + 第十轮(第九轮那 4 条标办结);CHANGELOG 本轮条目;
personal-pitfalls 易错点 30 记复发 1 次 + 新增 33(多行文案少引号 / ValueError 多参数)。
2026-10-12 16:53:01 +08:00
..

文档索引

本目录是 MCM/ICM Toolkit 的需求、架构、方案与开发规范的唯一落盘处。

文档 内容
01-suggestion-review.md 对 ChatGPT 建库建议的审查与精简:留什么、砍什么、补什么
02-architecture.md 精简后的包结构、边界划分、统一接口约定
03-roadmap.md 功能清单分级(L0 / L1 / L2 / 不做)与开发纪律
04-environment.md conda / venv 环境配置、镜像、离线约束
dev/function-card-template.md S 档算法的「函数卡片」模板
05-git-workflow.md Git 工作流、Gitea 远程(SSH 走 Tailscale)、行尾策略
dev/personal-pitfalls.md 个人易错点清单:只追加,追加前不通读

阅读顺序

  1. 先读 01-suggestion-review.md —— 它决定后面所有事。
  2. 再读 02-architecture.md —— 它决定代码往哪写。
  3. 开工前读 03-roadmap.md 的对应条目 —— 它决定这次做什么、做到什么程度。
  4. 环境出问题看 04-environment.md。

项目级进度看根目录的 STATUS.md;本目录只放不会频繁变的内容。