File size: 10,204 Bytes
ce97c4c b853a95 ce97c4c b853a95 608f5d3 d99c8d6 608f5d3 d99c8d6 608f5d3 d99c8d6 608f5d3 d99c8d6 608f5d3 d99c8d6 608f5d3 d99c8d6 608f5d3 d99c8d6 5f7a690 b853a95 5f7a690 b853a95 d99c8d6 608f5d3 d99c8d6 608f5d3 d99c8d6 608f5d3 b853a95 608f5d3 d99c8d6 608f5d3 b853a95 608f5d3 d99c8d6 608f5d3 b853a95 d99c8d6 b853a95 d99c8d6 b853a95 d99c8d6 b853a95 d99c8d6 c2904e6 d99c8d6 b853a95 d99c8d6 b853a95 d99c8d6 b853a95 d99c8d6 b853a95 d99c8d6 b853a95 d7bad7f 45a2d58 d7bad7f 45a2d58 d7bad7f 45a2d58 d99c8d6 d7bad7f d99c8d6 608f5d3 d99c8d6 608f5d3 d99c8d6 0270813 b853a95 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | ---
title: README
emoji: 🚀
colorFrom: yellow
colorTo: purple
sdk: static
pinned: false
---
# stage2 各任务说明
## 任务一:RoBERTa 校准(成员 2)
**输入什么**
1. `/pred_roberta_{val,test_id,test_ood}.csv`(三列`id,label,p_ai`,只读)
2. `/metrics.py` + 校准 notebook(`/calibrater.ipynb`)流程
**要做什么**
1. `RUN="fit"`:只用 val → 拟合温度 T → 在校准 val 上选 tau_fpr5 / tau_f1 → 选 t → 冻结
2. `RUN="apply"`:冻结参数应用到三个 split,绝不重选
3. AUROC 校准前后必须一致(单调变换)
**输出什么**(= 本目录现有 7 个文件)
- `thresholds.json`(roberta 条目)、3 份 `pred_roberta_*_calibrated.csv`(新增 `p_ai_calibrated` 列,原始列不覆盖)、`metrics_roberta_binary.csv`(9 行)、`metrics_roberta_three_way.csv`(3 行)、`middle/diagnostics_roberta_abstention.csv`(51 行扫描,自查不交付)
---
## 任务二:TF-IDF 校准(成员 1,复用calibrate.ipynb)
**输入什么**
1. `pred_tfidf_{val,test_id,test_ood}.csv`(三列 `id,label,p_ai`)
2. 校准流程代码(`calibrate.ipynb`)+ `metrics.py`
**要做什么**
1. `RUN="fit"`:只用 val → 拟合 TF-IDF 自己的 T → 在校准 val 上选自己的 tau_fpr5/tau_f1 → 选自己的 t
2. `RUN="apply"`:把冻结参数应用到三个 split,绝不重选
3. AUROC 校准前后必须一致;ECE/Brier 记录变化
**输出什么**
- `pred_tfidf_{val,test_id,test_ood}_calibrated.csv`
- `metrics_tfidf_binary.csv`(9 行)、`metrics_tfidf_three_way.csv`(3 行)
- `thresholds.json` 新增 `tfidf` 条目(TF-IDF 自己的 T/tau/t,不共用 RoBERTa 的参数)
---
## 任务三:Qwen 零样本/少样本校准(成员 3,复用calibrate.ipynb)
**输入什么**
1. Qwen 在 val/test 上的预测(零样本、少样本**两个版本分开**,各一套 `id,label,p_ai`)
2. 校准流程代码 + `../metrics.py`
3. 固定 200 条平衡子集(成员 1 已产出)
**要做什么**
1. 两个版本各自走一遍与任务一相同的 fit → apply 流程,参数不能共用、结果不能混
2. 零样本/少样本分别记录到 thresholds.json 的 `qwen_zeroshot` / `qwen_fewshot` 条目
3. 所有指标结论注明"固定 200 条人工平衡子集,小样本限定"
**输出什么**
- `pred_qwen_zeroshot/` 和 `pred_qwen_fewshot/` 两个版本的 calibrated 预测与两张 metrics 表
- thresholds.json 新增 `qwen_zeroshot`、`qwen_fewshot` 两个条目
**已知卡点**:目前成员 1 的子集只从 test_id 抽,**Qwen 没有 val 预测,fit 没原料**——需先确认是否补跑一份 val 预测(可同为固定子集),并同步全组口径。
---
## 任务四:FP/FN 错误分析(成员 2)
**输入什么**
1. `pred_roberta_test_id_calibrated.csv`、`pred_roberta_test_ood_calibrated.csv` → 取 `p_ai_calibrated` 列
2. `thresholds.json` → 取 `tau_fpr5`(本条目 = 0.994)
3. `/dataset/test_id.csv`、`test_ood.csv` → 取 `text_hash, text, label, source`(按 `id = text_hash` join)
4. `metrics_roberta_binary.csv` → `calibrated + tau_fpr5` 行的 tn/fp/fn/tp(test_id 5170/6/2/2513,test_ood 1172/74/4/1301),用于对账
**要做什么**
1. 对两个 split 各自:join dataset → 用 `tau_fpr5` 标误判 → 与 metrics 表逐格核对(不一致直接报错,不准继续算)
2. 按三个维度汇总:`source`(领域)、`len(text)`(字符长度桶)、以及全部 FP 明细
3. FP 并非只挑典型,全部收录(共 80 条)
**输出什么**
- 同目录三张表:`fp_by_domain.csv`(各领域样本数/FPR/FNR)、`fp_by_length.csv`(各长度桶样本数/human-FPR)、`fp_cases.csv`(全部 FP,待人工填归因)
---
## 任务五:三分类 Demo(成员 2)
**输入什么**
1. RoBERTa 训练产出的 checkpoint 目录(含模型权重)
2. `thresholds.json` → 取 `T`(=1.81834)和 `t`(=0.5)
3. 一段或多段待检测文本
**要做什么**
1. 文本 → tokenizer(`distilroberta-base`,截断 256 token)→ 模型 → 原始 `p_ai`
2. 用 `T` 温度校准:`q = sigmoid(logit(p_ai)/T)`
3. 三分判定:`q < 0.5` → Human;`q > 0.5` → AI;`q == 0.5` → Uncertain(与 metrics.py 边界规则一致)
4. 不重新拟合任何参数
**输出什么**
- `stage2/demo.py` 的 `detect(text)` 返回 `(Human/AI/Uncertain, 校准后的 p_ai)`
- 已知现状:`t=0.5` 区间退化,实际上永远不输出 Uncertain(README/报告须如实说明)
---
## 任务六:跨模型汇总与 id 对齐(成员 1)
**输入什么**
1. 各模型的 `pred_*_calibrated.csv`(RoBERTa 由任务一、TF-IDF 由任务二、Qwen 由任务三产出)
2. 各模型两张 metrics 表
3. thresholds.json(四模型条目齐后)
**要做什么**
1. 按 `id` 把三个模型在同一批样本上的预测对齐;标签不一致/缺 id 直接报错
2. 合并 `thresholds.json` 为统一参数文件
3. 汇总各模型指标成对比表;对齐后的数据交给成员 3 画图、交给成员 2 做跨模型错误对照(任务七)
**输出什么**
- 统一的 `thresholds.json`(四模型参数全齐)
- 汇总指标对比表
- 跨模型对齐数据(供错误对照与画图)
---
## 任务七:跨模型错误对照(成员 1)
**输入什么**
1. 任务六产出的按 id 对齐数据(RoBERTa / TF-IDF 在同一批样本上的预测)
2. 各模型自己的冻结 tau_fpr5(RoBERTa 0.994、TF-IDF 用它 fit 出的值,不得混用)
**要做什么**
1. 校准口径下各自标出 FP/FN,比较两模型在同一批 id 上的误判异同
2. 注意区分:成员 1 的预研 csv(raw 口径、经验阈值 0.8/0.2、只 test_id 10 FP + 9 FN)是早期素材,不作为对照口径
**输出什么**
- 错误对比补充表/段落(归属阶段三报告)
---
## 任务八:终版绘图(成员 3)
**输入什么**
1. 各模型 `pred_*_calibrated.csv`(raw 与 calibrated 两列概率都要用)
2. 各模型两张 metrics 表(混淆矩阵直接取 tn/fp/fn/tp,不重算)
3. thresholds.json(图上标注所用参数)
4. Qwen 固定 200 条子集 id
**要做什么**
1. 混淆矩阵:2×2 二分类 + 2×3 三分类,数据直接取 metrics 表
2. 校准图:按概率分桶画 raw 与 calibrated 对比曲线,每桶标注样本数 n
3. 风险—覆盖率曲线:用 three_way 表(或续算)画 coverage 与 decided_acc,标出参考点
4. Qwen 所有图基于 200 条人工平衡子集,图注写明小样本限定
**输出什么**
- `figures/confusion_*.png`(2×2 与 2×3)
- `figures/calibration_*.png`(对角线 + raw/calibrated 对比 + 每 bin n)
- `figures/risk_coverage.png`(模型对比与参考点)
- 绘图代码:`stage2/plots.py` 或 notebook
---
## 任务九:交付目录对齐
`stage2/`(共 24 个文件):
```text
runs/stage2/
├── thresholds.json # 四模型参数齐全
├── pred_roberta_val_calibrated.csv # 成员 2:RoBERTa 校准预测
├── pred_roberta_test_id_calibrated.csv
├── pred_roberta_test_ood_calibrated.csv
├── metrics_roberta_binary.csv # 9 行
├── metrics_roberta_three_way.csv # 3 行
├── pred_tfidf_val_calibrated.csv # 成员 1:TF-IDF 校准预测
├── pred_tfidf_test_id_calibrated.csv
├── pred_tfidf_test_ood_calibrated.csv
├── metrics_tfidf_binary.csv
├── metrics_tfidf_three_way.csv
├── pred_qwen_zeroshot_val_calibrated.csv # 成员 3:Qwen 零样本
├── pred_qwen_zeroshot_test_id_calibrated.csv
├── pred_qwen_zeroshot_test_ood_calibrated.csv
├── metrics_qwen_zeroshot_binary.csv
├── metrics_qwen_zeroshot_three_way.csv
├── pred_qwen_fewshot_val_calibrated.csv # 成员 3:Qwen 少样本
├── pred_qwen_fewshot_test_id_calibrated.csv
├── pred_qwen_fewshot_test_ood_calibrated.csv
├── metrics_qwen_fewshot_binary.csv
├── metrics_qwen_fewshot_three_way.csv
├── fp_by_domain.csv # 成员 2:错误分析三张表
├── fp_by_length.csv
├── fp_cases.csv
└── code/ # 代码交付(源文件仍在 src/ 相应位置,此处为镜像)
├── demo.py # 成员 2:三分类 Demo,detect(text) 判定+校准概率
├── test_demo.py # 成员 2:Demo 纯逻辑测试(pytest)
├── README_demo.md # 成员 2:Demo 用法/参数/已知限制
├── plots.py # 成员 3:绘图代码(或画图 notebook)
├── calibrate.ipynb # 成员 2:共享校准流程(成员 1/3 复用的那份)
└── metrics.py # 全组唯一指标入口(复现指标所必需)
```
`figures/`(共 13 张):
```text
figures/
├── confusion_binary_roberta.png # 2×2 混淆矩阵,每模型一张
├── confusion_binary_tfidf.png
├── confusion_binary_qwen_zeroshot.png
├── confusion_binary_qwen_fewshot.png
├── confusion_threeway_roberta.png # 2×3 混淆矩阵(含 Uncertain 列)
├── confusion_threeway_tfidf.png
├── confusion_threeway_qwen_zeroshot.png
├── confusion_threeway_qwen_fewshot.png
├── calibration_roberta.png # 校准图:raw vs calibrated + 每桶 n
├── calibration_tfidf.png
├── calibration_qwen_zeroshot.png
├── calibration_qwen_fewshot.png
└── risk_coverage.png # 风险—覆盖率曲线(模型对比 + 参考点)
```
---
## 附:通用红线
1. 一切判定只用 `p_ai_calibrated`,不用 `p_ai`
2. 一切阈值/温度只从 thresholds.json 读,val 定参数,test 只应用
3. 指标只调 `../metrics.py`,任何人不得自算另写口径
4. 各模型参数独立(各自的 T/tau/t),跨模型比较按 id 对齐,Qwen 只在固定子集上比
|