Invalid 预测率详解

Invalid 预测率(Invalid Prediction Rate)衡量:模型生成结果中,无法被解析为合法任务输出 的样本占比。在生成式分类、结构化 JSON 输出、固定词表标签等场景,它是 Accuracy / F1 之外的必要补充——告诉你有多少回答「格式上已经不可用」。

段末注释:Invalid 非 sklearn 内置指标,需在评估脚本中根据 LABEL_SET、JSON schema 或正则规则自行判定;通常与 Accuracy、混淆矩阵并列报告。

系列索引:微调评估指标导读


一、直观含义

对 (N) 个测试样本,设解析函数 (\text{parse}(\cdot)) 返回合法标签或 None

$$
\text{Invalid Rate} = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}[\text{parse}(\hat{s}_i) = \text{None}]
$$

其中 (\hat{s}_i) 为模型原始生成字符串。

人话:100 条回复里,有多少条「根本没法当成有效答案用」。

典型 Invalid 表现:

  • 情绪分类应输出 fear,模型输出 I think the emotion is fear.(解析规则只认纯标签)
  • 应输出 JSON,模型输出 markdown 代码块外加解释文字
  • 输出词表外标签 fearfulUNKNOWN
  • 空串、仅标点、超长废话

二、使用场景与所需数据

场景 是否需要
生成式多类分类(固定标签集) 强烈建议
JSON / 工具调用结构化输出 强烈建议
开放对话 一般不用(无固定 parse)
分类头 argmax 不适用(输出恒合法)

数据要求

  1. 模型 generate()原始字符串
  2. 明确定义的 合法输出集合schema
  3. 与训练 SYSTEM_PROMPT 一致的格式约束描述

三、计算方式

3.1 解析规则示例(标签分类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import re

LABEL_SET = {"sadness", "joy", "love", "anger", "fear", "surprise"}
LABEL_PATTERN = re.compile(
r"\b(sadness|joy|love|anger|fear|surprise)\b",
re.IGNORECASE,
)

def parse_label(raw: str) -> str | None:
raw = raw.strip()
if raw.lower() in LABEL_SET:
return raw.lower()
m = LABEL_PATTERN.search(raw)
return m.group(1).lower() if m else None

def invalid_rate(raw_outputs: list[str]) -> float:
invalid = sum(parse_label(s) is None for s in raw_outputs)
return invalid / len(raw_outputs)

3.2 与 Accuracy 的衔接

解析后:

1
2
3
4
5
6
7
8
9
10
11
parsed = [parse_label(s) for s in raw_outputs]
invalid_count = sum(p is None for p in parsed)

# 常见做法 A:Invalid 计为错误,不参与「有效子集 accuracy」
valid_mask = [p is not None for p in parsed]
y_pred_valid = [p for p in parsed if p is not None]
y_true_valid = [y for y, ok in zip(y_true, valid_mask) if ok]

# 常见做法 B:混淆矩阵增加 INVALID 列/行
ALL_LABELS = sorted(LABEL_SET) + ["INVALID"]
y_pred_for_cm = [p if p is not None else "INVALID" for p in parsed]

必须在报告中声明采用哪种做法,否则 Accuracy 不可比。

3.3 汇总指标

1
2
3
4
5
6
metrics = {
"invalid_rate": invalid_count / len(raw_outputs),
"invalid_count": invalid_count,
"evaluated_examples": len(raw_outputs),
"accuracy": accuracy_score(y_true, y_pred_for_cm), # 若 INVALID 算错
}

四、如何解读

现象 可能原因
微调前 invalid 低、微调后升高 过拟合训练集但 格式约束退化;或学习率过大破坏指令遵循
invalid 高但 token accuracy 高 训练用 teacher forcing 学 token,generate 时爱「多说一句」
invalid 降、macro F1 升 理想:格式与语义双改善
invalid 低但 F1 低 格式对了,内容常错——需看混淆矩阵

数值直觉:400 条测试里 2 条 invalid → invalid_rate = 0.005(0.5%),通常可接受;>5% 应排查 prompt 与 decode 策略。


五、局限性与常见误用

  1. 解析规则即指标:正则过严把 Fear. 标 invalid;过松把 not fear but joy 抽成 fear——规则与指标耦合
  2. 不反映语义近错:invalid 只抓格式,不抓「合法但错误」标签。
  3. 与 max_new_tokens 相关:截断可能导致半句话 invalid。
  4. temperature > 0 升高 invalid:采样随机性增加格式漂移。
  5. 单独报告误导:invalid=0 不代表任务做好;必须并列 F1。
  6. 跨实验 parse 不一致:改正则后 historical 不可比。

六、与其他指标的关系

指标 关系
Accuracy Invalid 通常计为错;或只在有效子集上算 accuracy
混淆矩阵 INVALID 作伪类可定位格式失败量
mean_token_accuracy 训练 token 对 ≠ 生成格式对
Exact Match EM 要求整串匹配;Invalid 是 EM 之前的 gates

七、实践建议

  1. 训练、评估、线上推理共用同一 SYSTEM_PROMPT 与 parse 逻辑(代码层抽成函数复用)。
  2. 报告 invalid_rate + invalid_count + 原始失败样例(各 5~10 条)。
  3. 微调对比表:pre invalid / post invalid / Δ,并列 macro_f1。
  4. decode 用 greedy + 低 max_new_tokens 做主评估;采样策略单独做鲁棒性实验。
  5. 若 invalid 上升:先查 completion_only_loss、prompt 是否强调「只输出标签」、是否需加 few-shot 或约束解码(allowed tokens)。
  6. 结构化输出优先 JSON mode / grammar constraint,再谈 invalid 阈值。
-------------本文结束感谢您的阅读-------------