你的三条改动(决策 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 多参数)。
文档索引
本目录是 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 | 个人易错点清单:只追加,追加前不通读 |
阅读顺序
- 先读
01-suggestion-review.md—— 它决定后面所有事。 - 再读
02-architecture.md—— 它决定代码往哪写。 - 开工前读
03-roadmap.md的对应条目 —— 它决定这次做什么、做到什么程度。 - 环境出问题看
04-environment.md。
项目级进度看根目录的
STATUS.md;本目录只放不会频繁变的内容。