$npx -y skills add QFIN-tech/model-evo --skill classification-model-report聚合 session 内 task-spec / data-profile / feature-analysis / new-models/*/evaluation 的关键信息,产 6-sheet Excel 报告(模型概览/样本分析/特征质量/三档评估/分桶排序性对比/特征清单)。定位与 classification-model-comparison 互补 — comparison 聚焦 AUC/KS 单指标 + 分桶并排;本 skill 聚合需求规格 + 样本分析 + 特征质量 + 多 run 全量评估 + 分桶并排 + AUC 最高 run 的特征
| 1 | # model_report |
| 2 | |
| 3 | 把 session 内多个 run 与上游产物(task-spec / data-profile / feature-analysis / `new-models/*/`)聚合到一个 6-sheet Excel,落到 `<session_dir>/{session_name}_report.xlsx`。定位与 `classification-model-comparison` 互补:comparison 只产 AUC/KS 对比表 + 分桶并排(JSON + md + xlsx);本 skill 补位**全链路汇总**(需求规格 → 样本分析 → 特征质量 → 多 run 三档评估 → 多 run 分桶并排 → AUC 最高 run 特征清单)。 |
| 4 | |
| 5 | ## 1. 输入依赖 |
| 6 | |
| 7 | | 输入 | 必选 | 来源 | 说明 | |
| 8 | |---|:---:|---|---| |
| 9 | | `<session_dir>` | ✅ | 上游 `classification-model-orchestration` 产 | session 根目录,如 `runs/20260701-110624-draw_willingness/`;必须存在 | |
| 10 | | `task-spec/_manifest.json` | ✅ | `classification-model-task-spec` 产 | 需求规格 + 路由溯源 + 样本概况 + 切分配置;Sheet 1 数据源 | |
| 11 | | `data-profile/_manifest.json` | 否 | `classification-model-task-spec` 产 | 样本分析详情(分时段 / 稳定性 / 充足性 / 三档切分);Sheet 2 数据源 | |
| 12 | | `sample-features/feature-analysis/analysis/{_manifest.json, iv_table.csv, psi_table.csv, stats.csv}` | 否 | `feature-analysis`(orchestration Step 4C)产 | 特征质量(IV / PSI / 缺失率 / 基础统计);Sheet 3 数据源 | |
| 13 | | `new-models/*/config.json` | ✅ | `classification-model-training` / `classification-model-tuning` 产 | 每个 run 的入参 + runtime(metrics / n_features / best_iteration);Sheet 4/6 数据源 | |
| 14 | | `new-models/*/model/_manifest.json` | 否 | `classification-model-training` 产 | `used_params`(标量 dict);Sheet 6 训练参数列 | |
| 15 | | `new-models/*/evaluation/{run_name}_{train,test,oot}_eval.json` | ✅ | `classification-model-evaluation` 产 | 每个 run 三档 eval JSON;Sheet 4 全量指标 + Sheet 5 分桶 | |
| 16 | | `new-models/*/explainability/{feature-importance,shap-summary}.csv` | 否 | `classification-model-training` Stage 5 产 | Sheet 6(AUC 最高 run)的特征重要性 / SHAP Top 30 | |
| 17 | | `new-models/*/features/used-feature-list.csv` | 否 | `classification-model-training` 产 | Sheet 6 入模特征清单统计 | |
| 18 | |
| 19 | **扫描范围**: 仅扫 `<session_dir>/new-models/*/`,**不扫 `model-recommend/`**(历史模型通常无 eval JSON / explainability,纳入会全是占位行,无信息量)。 |
| 20 | |
| 21 | **容错**: 每个输入独立加载,缺失时对应 sheet 写"上游产物缺失"占位,不阻断整体流程。仅 `<session_dir>` 或 `new-models/` 不存在时才立即退出。 |
| 22 | |
| 23 | ## 2. 执行命令 |
| 24 | |
| 25 | `<skill_dir>` 指本 skill 所在目录(即本文件所在目录),执行时替换为实际绝对路径。 |
| 26 | |
| 27 | ```bash |
| 28 | python <skill_dir>/scripts/build_report.py \ |
| 29 | --session-dir <session_dir> \ |
| 30 | [-o <output.xlsx>] |
| 31 | ``` |
| 32 | |
| 33 | **示例**: |
| 34 | |
| 35 | ```bash |
| 36 | # 默认: 输出落 <session_dir>/{session_name}_report.xlsx |
| 37 | python <skill_dir>/scripts/build_report.py \ |
| 38 | --session-dir /path/to/runs/20260701-110624-draw_willingness |
| 39 | |
| 40 | # 显式指定输出路径 |
| 41 | python <skill_dir>/scripts/build_report.py \ |
| 42 | --session-dir /path/to/runs/20260701-110624-draw_willingness \ |
| 43 | -o /tmp/session_report.xlsx |
| 44 | ``` |
| 45 | |
| 46 | **Python 环境**: 需要 openpyxl。当前默认 `python` 无 openpyxl,可用 `/data/oceanus_ctr_wkdir/pyenv/anaconda_data_ai/bin/python` 跑(Python 3.9 + openpyxl 3.0.10)。 |
| 47 | |
| 48 | ## 3. 参数说明 |
| 49 | |
| 50 | ### build_report.py |
| 51 | |
| 52 | | 参数 | 必选 | 默认值 | 说明 | |
| 53 | |---|:---:|---|---| |
| 54 | | `--session-dir` | ✅ | - | session 根目录,如 `runs/20260701-110624-draw_willingness/`;必须存在 | |
| 55 | | `-o` / `--output` | 否 | `<session_dir>/{session_name}_report.xlsx` | 输出 xlsx 路径;父目录不存在则自动创建 | |
| 56 | |
| 57 | **session_name 推断**: 取 `session_dir.name`(即目录名,如 `20260701-110624-draw_willingness`),作为默认输出文件名前缀。 |
| 58 | |
| 59 | ## 4. 输出产物 |
| 60 | |
| 61 | 单个 xlsx 文件,默认落在 `<session_dir>/{session_name}_report.xlsx`: |
| 62 | |
| 63 | ```text |
| 64 | <session_dir>/ |
| 65 | └── {session_name}_report.xlsx # 6-sheet session 级全链路汇总报告 |
| 66 | ``` |
| 67 | |
| 68 | ### 4.1 Sheet 列表 |
| 69 | |
| 70 | | # | Sheet 名 | 内容 | 数据来源 | |
| 71 | |---|---------|------|---------| |
| 72 | | 1 | 1-模型概览 | KV 格式 8 个段: 基础信息 / 路由溯源 / WHO / WHAT / HOW GOOD / CONSTRAINTS / HOW TO USE / 数据源 | `<session_dir>/task-spec/_manifest.json` | |
| 73 | | 2 | 2-样本分析 | KV 格式 4 段(总体样本 / 稳定性 / 样本充足性 / 切分元信息)+ 2 张附表(分时段样本 / Train-Eval-OOT 切分);**不画 DataBar**(纯数值) | `<session_dir>/data-profile/_manifest.json` + `sample-features/feature-matching/_split_manifest.json` | |
| 74 | | 3 | 3-特征质量 | **全量特征单表**(17 列): # / feature / dtype / IV / 单变量 AUC / PSI / PSI 预警 / 有效分箱 / 缺失率 / unique / mean / std / min / q25 / median / q75 / max;合并 iv_table + psi_table + stats 三张 csv,特征 union 后**按 IV 降序排序**(缺失 IV 排末尾);**无 KV 概况段**(样本分析已在 Sheet 2) | `<session_dir>/sample-features/feature-analysis/analysis/{_manifest.json, iv_table.csv, psi_table.csv, stats.csv}` | |
| 75 | | 4 | 4-三档评估 | 按 split 分块(**train / test / oot / all 四档**纵向堆叠),每子表列: run_name / 样本量 / 正样本率 / AUC / KS / 准确率 / 精确率 / 召回率 / F1;多 run 横向对比;**不画 DataBar** | `new-models/*/evaluation/{run_name}_{train,test,oot,all}_eval.json` 的 `metric_by_segment['全量']`(all = train+test+oot 合并评估) | |
| 76 | | 5 | 5-分桶排序性对比 | **严格参考 `classification-model-comparison` 对比报告.xlsx Sheet 2 格式**: 顶部指标计算逻辑 + 基线版本声明; **仅 oot + all 两档**按 split 分块, 每子表两层表头(metric group header + 模型名子表头, 基线加 "(基线)" 后缀), 列按 metric 分组(label率×n / 召回率×n / 累计召回×n), 10 decile 数据行 + 主表 DataBar(label率绿/召回率蓝/累计召回蓝); 主表下方接 Lift 子表(基线列 "-", 其他列比值, >1 绿/<1 红, 不画 DataBar) | `new-models/*/evaluation/{run_name}_{oot,all}_eval.json` |