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 只在固定子集上比