$npx -y skills add QFIN-tech/model-evo --skill uplift-model-feature-quality-analysis已有 confirmed task_config_path 和 modeling_sample_spec_path 后,用于运行特征质量诊断、生成筛选建议、确认或复用 feature plan。不要用于模型训练、调参、模型比较或最终报告。
| 1 | # 特征质量分析 |
| 2 | |
| 3 | ## 1. 输入依赖 |
| 4 | |
| 5 | 本 skill 负责特征质量诊断和建模特征方案交接: |
| 6 | |
| 7 | - Basic Quality:缺失率、唯一值数量和值集中度。 |
| 8 | - Split PSI:训练集和测试、验证、OOT 样本之间的分布稳定性。 |
| 9 | - Monthly PSI:按月观察特征分布稳定性,仅作为参考。 |
| 10 | - Uplift Bivar:观察特征分组内 treatment/control outcome 差异,仅作为参考。 |
| 11 | - Feature plan:把用户确认后的特征列表沉淀为 `feature_plan_path`,供建模 skill 消费。 |
| 12 | |
| 13 | 已有 confirmed `task_config_path` 和 `modeling_sample_spec_path` 后使用。 |
| 14 | |
| 15 | ## 2. 执行入口 |
| 16 | |
| 17 | 统一 CLI: |
| 18 | |
| 19 | ```bash |
| 20 | python <skill-dir>/scripts/run.py --input - --output-dir <output_dir> |
| 21 | ``` |
| 22 | |
| 23 | Windows 环境可按需将路径分隔符改为反斜杠。 |
| 24 | |
| 25 | `--output-dir` 必须是已存在的 `run_dir`;runner 不创建 run_dir,不扫描 `latest/current`。本 skill 输出到: |
| 26 | |
| 27 | ```text |
| 28 | {run_dir}/uplift-model-feature-quality-analysis/{timestamp}_feature_quality/ |
| 29 | inputs/0001_<action>.request.json |
| 30 | results/0001_<action>.result.json |
| 31 | artifacts/ |
| 32 | _flow_manifest.json |
| 33 | _flow_log.jsonl |
| 34 | report.md |
| 35 | ``` |
| 36 | |
| 37 | 所有 stdout、result、manifest 和 log 中的持久化 path 都是 `run_dir` 相对路径。需要复用同一 flow 的 action 必须显式传入 `outputs.flow_dir`,不得从 recommendation、draft 或 feature_plan artifact path 反推 flow。 |
| 38 | |
| 39 | 请求 JSON 必须通过 stdin 传入: |
| 40 | |
| 41 | ```json |
| 42 | {"action": "diagnostics_only", "payload": {"task_config_path": "...", "modeling_sample_spec_path": "...", "analysis_scope": {"diagnostics": ["basic_quality", "split_psi"], "confirmed": true}}} |
| 43 | ``` |
| 44 | |
| 45 | runner stdout 是 JSON object。调用方只读取 stdout 或 result JSON 中的 `outputs.*` 字段,例如 `outputs.report_path`、`outputs.feature_selection_recommendation_path`、`outputs.feature_plan_path`。 |
| 46 | |
| 47 | 只接受显式 `*_path` / `*_paths` 字段。收到旧的 `*_ref` / `*_refs` 输入时,runner 返回 `needs_input`,并在 `issues` 与 `next_steps` 中给出对应替代字段。 |
| 48 | |
| 49 | ## 3. Actions 与参数说明 |
| 50 | |
| 51 | ### 默认交互流程 |
| 52 | |
| 53 | 诊断、筛选推荐、feature plan 确认是三个独立步骤。用户确认前一步不代表确认后一步。 |
| 54 | |
| 55 | 当用户只说“继续”“开始特征质量分析”“先看一下特征”时,调用方必须先向用户展示候选诊断项和推荐诊断计划,不得直接生成筛选推荐或 feature plan。 |
| 56 | |
| 57 | 诊断前面向用户展示的内容只包含候选项、用途、推荐诊断计划和本步产物边界,不写“建议运行”“参与筛选依据”“仅作参考”“默认不纳入”等判断性表述。推荐展示口径: |
| 58 | |
| 59 | ```text |
| 60 | 我将先做特征质量诊断。本步只生成诊断报告,不生成筛选推荐,也不生成 feature plan。 |
| 61 | |
| 62 | 候选诊断项: |
| 63 | 1. basic_quality:检查缺失率、唯一值数量和值集中度。 |
| 64 | 2. split_psi:检查 train/test/valid/OOT 之间的特征分布稳定性。 |
| 65 | 3. monthly_psi:按月检查特征分布稳定性,需要可用时间字段。 |
| 66 | 4. uplift_bivar:观察特征分组内 treatment/control outcome 差异。 |
| 67 | |
| 68 | 推荐诊断计划: |
| 69 | - basic_quality |
| 70 | - split_psi |
| 71 | - uplift_bivar |
| 72 | |
| 73 | 如果按这个计划执行,我会先跑诊断;诊断完成后再展示摘要,并询问是否按默认规则生成筛选推荐。 |
| 74 | ``` |
| 75 | |
| 76 | 默认诊断计划固定为: |
| 77 | |
| 78 | ```text |
| 79 | diagnostics: |
| 80 | - basic_quality |
| 81 | - split_psi |
| 82 | - uplift_bivar |
| 83 | ``` |
| 84 | |
| 85 | `monthly_psi` 可由用户加入;加入时必须有明确 `date_column`。如果 `modeling_sample_spec` / `task_config` 中不能明确识别时间字段,则停止并询问用户提供字段名,不自动猜测。 |
| 86 | |
| 87 | 用户确认诊断计划后,默认调用 `diagnostics_only`,并传入 `analysis_scope.confirmed=true`。缺少该确认时 runner 返回 `needs_confirmation`。诊断完成后,先展示诊断摘要,再询问用户是否按默认规则生成筛选推荐,并展示默认规则: |
| 88 | |
| 89 | ```text |
| 90 | 默认规则: |
| 91 | - 缺失率 > 80%:进入剔除候选 |
| 92 | - PSI > 0.25:进入剔除候选 |
| 93 | - 众数占比 >= 99%:进入剔除候选 |
| 94 | - 缺失率 > 50%:标记为预警 |
| 95 | - PSI > 0.10:标记为预警 |
| 96 | - 众数占比 >= 95%:标记为预警 |
| 97 | ``` |
| 98 | |
| 99 | 用户确认筛选规则后,调用 `selection_only` 复用本轮诊断结果,并显式传入默认阈值和 `selection_scope.confirmed=true`: |
| 100 | |
| 101 | ```json |
| 102 | { |
| 103 | "new_thresholds": { |
| 104 | "missing_rate_warning": 0.5, |
| 105 | "missing_rate_exclude": 0.8, |
| 106 | "psi_warning": 0.1, |
| 107 | "psi_exclude": 0.25, |
| 108 | "near_constant_mode_ratio": 0.99, |
| 109 | "high_concentration_mode_ratio": 0.95 |
| 110 | }, |
| 111 | "selection_scope": { |
| 112 | "confirmed": true, |
| 113 | "rule_source": "default" |
| 114 | } |
| 115 | } |
| 116 | ``` |
| 117 | |
| 118 | 如果用户不接受默认规则,则让用户调整阈值;未提到的阈值沿用默认值。 |
| 119 | |
| 120 | 筛选推荐生成后,必须展示推荐方案,并停止等待用户选择接受、修改或调整阈值重跑。展示粒度至少包含保留数量、剔除数量、剔除特征及原因。保留特征数量较少时完整展示;数量较多时可展示预览,但必须说明可以展开完整列表。在用户明确选择接受或修改前,不调用 `accept_recommendation`、`modify_recommendation` 或 `confirm_artifact`。 |
| 121 | |
| 122 | `diagnostics_only` |
| 123 | |
| 124 | - 输入:`task_config_path`、`modeling_sample_spec_path`、`analysis_scope`。 |
| 125 | - `analysis_scope.confirmed=true` 必填,表示调用方已经展示候选诊断项和推荐诊断计划并获得用户确认;缺少时返回 `needs_confirmation`。 |
| 126 | - `analysis_scope.diagnostics` 支持 `basic_quality`、`split_psi`、`monthly_psi`、`uplift_bivar`。 |
| 127 | - 只输出请求的诊断表和报告,不生成特征筛选建议。 |
| 128 | - 定位:默认诊断入口。用于执行用户已确认的诊断计划。 |
| 129 | - 默认不生成 `feature_selection_recommendation_path`,不生成或修改 feature plan。 |
| 130 | |
| 131 | `selection_only` |
| 132 | |
| 133 | - 输入:`source_result_path`、`new_thresholds`、`selection_scope`。 |
| 134 | - `selection_scope.confirmed=true` 必填,表示调用方已经展示诊断摘要和筛选规则并获得用户确认;缺少时返回 `needs_confirmation`。 |
| 135 | - `selection_scope.rule_source` 必须是 `default` 或 `custom`。 |
| 136 | - 复用已有 Basic Quality / Split PSI 明细,生成新的 `feature_selection_recommendation_path`。 |
| 137 | - 定位:诊断完成后的筛选推荐入口。默认用于复用本轮 `diagnostics_only` 结果生成推荐。 |
| 138 | - 调用前必须先向用户展示诊断摘要和筛选规则,并获得用户确认。 |
| 139 | - 只生成筛选推荐,不生成 confirmed feature plan。 |
| 140 | |
| 141 | `accept_recommendation` |
| 142 | |
| 143 | - 输入:`recommendation_path`,可选 `source_result_path`、`task_config_path`、`modeling_sample_spec_path`。 |
| 144 | - 输出:已确认的 `feature_plan_path`。 |
| 145 | - 定位:用户看过推荐方案并明确接受后使用。 |
| 146 | - 调用前必须展示推荐保留/剔除方案和剔除原因。用户没有明确接受前不得调用。 |
| 147 | |
| 148 | `modify_recommendation` |
| 149 | |
| 150 | - 输入:`recommendation_path`、`include_features`、`exclude_features`。 |
| 151 | - 输出:草稿 `feature_plan_path`,需要再调用 `confirm_artifact`。 |
| 152 | - 定位:用户看过推荐方案并指定额外保留或剔除特征后使用。 |
| 153 | - 输出草稿后必须再次展示草稿方案,并等待用户确认。 |
| 154 | |
| 155 | `manual_feature_plan` |
| 156 | |
| 157 | - 输入:`task_config_path`、`modeling_sample_spec_path`、`feature_list` 或 `feature_list_path`。 |
| 158 | - 输出:草稿 `feature_plan_path`,需要再调用 `confirm_artifact`。 |
| 159 | - 定位:用户明确提供人工特征列表时使用。 |
| 160 | - 输出草稿后必须展示草稿方案,并等待用户确认。 |
| 161 | |
| 162 | `confirm_artifact` |
| 163 | |
| 164 | - 输入:`source_draft_path`、`artifact_kind="feature_plan"`。 |
| 165 | - 输出:已确认的 `feature_plan_path`。 |
| 166 | - 定位:只用于确认已经展示给用户并由用户明确接受的 fea |