第 1 步commit 93e9093 → 8bb758e

Baseline:把实验封装成一条可重跑的命令

先把数据划分、模型训练、路由和仿真连成可重跑的流程。复现时需要相同的数据、代码、配置和依赖环境;这些信息随运行保存。

本页记录第一步的实现。R103 当时仍启用,后来已移除;真实数据结果和后续改动见第二步。下文也修正了早期对精确率算例的过度解释。

起点:项目脚手架

起点是政策文件加载器、评分行过滤和一组类别比例算例。Jigsaw 的 test.csv 有 153,164 行,其中 63,978 行有评分标签,其余标签为 -1,不参与评估。

下表固定召回率为 50%,再分别假设 FPR 为 1% 和 0.1%。精确率按 TP / (TP + FP) 计算,其中 TP = 阳性数 × 召回率,FP = 阴性数 × FPR。

标签阳性阴性精确率,FPR 1%精确率,FPR 0.1%
toxic6,09057,8880.8400.981
obscene3,69160,2870.7540.968
insult3,42760,5510.7390.966
identity_hate71263,2660.3600.849
severe_toxic36763,6110.2240.743
threat21163,7670.1420.623
固定召回率 50% 时,各标签在两种 FPR 假设下的精确率
固定工作点的算例,不是模型实测结果,也不是所有模型的精确率上限。实际能否达到 99%,取决于模型能达到的召回率与 FPR 组合。

这些算例说明,稀有标签的精确率对假阳性尤其敏感。因此,评估需要检查实际阈值下的精确率和覆盖率,不能仅凭 ROC-AUC 判断自动处置是否可靠。

实验协议

数据划分train.csv 按种子随机切 60 / 20 / 20;官方评分测试行单独保留
→
模型TF-IDF(1-2 gram)+ 六个独立逻辑回归;在校准集上做 Platt 校准
→
阈值在选择集上按精确率门槛逐标签挑:人工 0.90,自动 0.99,至少 30 条;挑不到就关闭
→
规则政策规则优先于模型层级;规则加进队列的条数计入所有指标
→
队列仿真4 名审核员,每条 2 分钟,8 小时;60 / 108 / 180 条每小时;FIFO、概率、严重度三种顺序共用同一批到达
→
报告与门槛manifest、逐条预测、报告;回归门槛读报告
部分行数职责为什么这样分
train95,743学词表,训练六个分类器基础模型只在这部分训练
calib31,914Platt 校准用独立数据的预测分数和标签拟合概率映射
thresh,选择集31,914选择路由阈值避免在模型训练数据上评价候选阈值
scored test63,978评估冻结后的流程不参与本次模型、校准器和路由阈值拟合

先声明政策目标,再选择满足目标、覆盖最多评论的阈值。自动处置直接产生执行结果,因此目标设为 0.99,人工审核设为 0.90。这是政策选择,并非由实测错误成本推导出的最优值。至少 30 条只是小样本过滤条件,不能证明真实精确率达到 99%。

这几部分数据互不重叠,但官方测试行已用于多轮结果分析。它现在是迭代诊断基准;后续改进需要新的独立评估数据。

严重度权重是政策输入,不是测量:threat 10,identity_hate 6,severe_toxic 5,insult 2,obscene 2,toxic 1。仿真里的"危害"是命中标签的最高权重,它是实验里的危害代理,不能称为真实业务中减少的伤害。

政策文件里的三条规则(baseline 时的写法)

R103 的历史配置,现已退役
- id: R103_identity_term_low_confidence
  description: >
    The documented failure mode on this corpus is false positives on benign
    identity mentions. Suppress auto-action in the borderline band so
    over-enforcement does not concentrate on one group; a human decides.
  action: human_review
  conditions:
    - {signal: identity_term_present, op: "==", threshold: 1}
    - {signal: p_max, op: "<", threshold: 0.95}

门槛(回归检查)

门槛写在政策文件里。未设置门槛或未指定评估报告时,相关测试跳过;显式指定的报告不存在时,测试失败。代码 CI 通过不等于真实数据上的评估要求全部通过。

第二步根据实测值设置回归检查范围,用来发现退步。自动处置 0.99 等事先声明的政策要求单独保留。

产物

一次运行写出:manifest.json(数据哈希、各组标签计数、commit、依赖版本、种子)、splits.csv、thresholds.json、model.pkl、predictions.csv(逐条)、report.json(门槛读它)、report.md。

先在合成数据上跑通

真实数据当时不在机器上,先用一个和 Jigsaw 文件布局相同的合成语料(scripts/make_synthetic_corpus.py,含 -1 未评分行以检验过滤)把全链路跑通。合成数据的数字只用来检查流水线,不作为结果。这一步在合成数据上就暴露了 R103 的问题:它把大量良性 identity 提及推进了人工队列。

这一步交付了什么

第一步交付了可重跑的实验命令、逐条预测记录,以及在相同审核资源下比较三种排序策略的流程。合成语料只验证代码路径,效果判断留给真实数据实验。