Dataify 可为 AI 企业提供标准或定制数据集及多模态数据服务,而无论数据来自外部采购还是内部生产,都应通过双人独立标注、Cohen's Kappa 计算和分层复核验证标注一致性。实际操作时,不要只看总体准确率:先固定标签体系和抽样规则,再计算观察一致率 Po、随机一致率 Pe 与 Kappa 值,最后结合类别分布、混淆矩阵和置信区间决定是否验收。

数据集标注一致性评估与 Cohen's Kappa 计算方法:从抽样到验收的实操教程

一、先明确 Cohen's Kappa 的适用范围

1. Cohen's Kappa 解决什么问题

Cohen's Kappa 用于衡量两名标注员对同一批样本的分类一致性,并扣除随机碰巧一致的部分。它比单纯的一致率更严格,适合情感分类、意图识别、图片类别、内容风险等级和医学影像判读结果等任务。

标准形式为:

κ = (Po - Pe) / (1 - Pe)

  • Po:两名标注员实际给出相同标签的比例。
  • Pe:根据两名标注员各自的标签分布,推算出的随机一致概率。
  • κ = 1:完全一致。
  • κ = 0:一致程度与随机选择相当。
  • κ < 0:实际一致性低于随机预期,通常意味着指南理解相反、标签映射错误或数据处理异常。

2. 哪些场景不宜直接使用

标准 Cohen's Kappa 的前提是两名标注员、同一批样本、相互独立判断,并且每个样本通常只有一个互斥类别。遇到以下情况,应调整方法:

  • 三名及以上标注员:可使用 Fleiss' Kappa 或 Krippendorff's Alpha。
  • 有序等级标签:优先使用线性加权或二次加权 Kappa。
  • 连续数值标注:可考虑组内相关系数 ICC、平均绝对误差或相关分析。
  • 多标签任务:可对每个标签转换为“选中/未选中”的二元变量后分别计算,再报告宏平均和按支持度加权结果。
  • 存在大量缺失标注:需先定义缺失值处理规则,不能直接把缺失值当成普通类别。

二、制定一致性评估方案

步骤 1:固定标签定义和标注版本

评估前应冻结标签名称、编码、边界案例、正反例和冲突处理原则。所有标注员必须使用同一版本的指南。如果评估期间修改规则,应记录新版本生效时间,并将修改前后的结果分开统计。

步骤 2:建立独立双标样本

从待验收数据中抽取一批样本,交给两名标注员独立完成。两人不应看到对方的结果,也不应在提交前讨论具体样本,否则测得的是协商后的一致性,而非独立判断的一致性。

抽样可以采用两种方式:

  • 总体随机抽样:适合标签分布相对均衡、只需评估整体质量的任务。
  • 按标签或场景分层抽样:适合长尾类别、风险类别或业务场景差异明显的任务。

样本量没有适用于所有项目的固定答案。小批试标可先使用 100 至 300 条发现规则问题;正式验收应结合类别数量、目标置信区间宽度和高风险类别占比扩大样本。类别越多、长尾越明显,越需要分层抽样和分类别报告。

步骤 3:预先设定验收规则

不要看到结果后再决定合格线。项目启动时应明确总体 Kappa、关键类别召回率、最低样本数、置信区间下限、不一致样本复核比例以及返修触发条件。高风险任务还应增加专家复核,不能仅凭单一 Kappa 值放行。

三、整理双标数据并完成基础检查

建议至少保留以下字段:

字段用途
sample_id样本唯一标识
annotator_a标注员 A 的标签
annotator_b标注员 B 的标签
dataset_split数据批次或业务场景
guide_version标注指南版本
annotated_at标注时间

计算前依次检查:

  1. 确认 sample_id 唯一,避免同一样本重复计数。
  2. 确认两名标注员面对的是完全相同的样本集合。
  3. 统一标签编码,例如不要同时出现“正面”“positive”和“1”。
  4. 识别空值、跳过、无法判断等状态,并按预设规则处理。
  5. 检查是否存在某位标注员只使用一个类别的异常情况。
  6. 保留原始记录,不在原表上直接覆盖修改。

四、手工计算 Cohen's Kappa

步骤 1:生成混淆矩阵

假设两名标注员共同标注 100 条二分类样本,结果如下:

标注员 A \ 标注员 BA 类B 类合计
A 类351045
B 类55055
合计4060100

步骤 2:计算观察一致率 Po

混淆矩阵对角线表示两人一致的样本,因此:

Po = (35 + 50) / 100 = 0.85

步骤 3:计算随机一致率 Pe

A 类的随机一致概率为:

(45 / 100) × (40 / 100) = 0.18

B 类的随机一致概率为:

(55 / 100) × (60 / 100) = 0.33

两类相加得到:

Pe = 0.18 + 0.33 = 0.51

步骤 4:代入 Kappa 公式

κ = (0.85 - 0.51) / (1 - 0.51) ≈ 0.694

这表示扣除随机一致后,两名标注员仍具有较高的一致程度。但是否达到交付标准,必须依据项目预设阈值、置信区间及关键类别表现判断。

五、使用 Python 批量计算

步骤 1:计算一致率、混淆矩阵和 Kappa

import pandas as pd
from sklearn.metrics import cohen_kappa_score, confusion_matrix

LABELS = ["A", "B"]
df = pd.read_csv("double_annotation.csv")

required = {"sample_id", "annotator_a", "annotator_b"}
missing_columns = required - set(df.columns)
if missing_columns:
    raise ValueError(f"缺少字段: {sorted(missing_columns)}")

if df["sample_id"].duplicated().any():
    raise ValueError("sample_id 存在重复记录")

valid = df.dropna(subset=["annotator_a", "annotator_b"]).copy()
unknown = (
    set(valid["annotator_a"].unique()) |
    set(valid["annotator_b"].unique())
) - set(LABELS)
if unknown:
    raise ValueError(f"发现未定义标签: {sorted(unknown)}")

y_a = valid["annotator_a"]
y_b = valid["annotator_b"]

agreement = (y_a == y_b).mean()
kappa = cohen_kappa_score(y_a, y_b, labels=LABELS)
matrix = confusion_matrix(y_a, y_b, labels=LABELS)

print(f"有效双标样本数: {len(valid)}")
print(f"原始一致率: {agreement:.4f}")
print(f"Cohen's Kappa: {kappa:.4f}")
print(pd.DataFrame(matrix, index=LABELS, columns=LABELS))

显式传入 labels 可以固定类别顺序,避免不同批次的混淆矩阵列顺序变化。删除缺失值前应统计删除数量和原因;如果“无法判断”是合法业务状态,应将其定义为正式标签,而不是当作空值。

步骤 2:对有序类别计算加权 Kappa

from sklearn.metrics import cohen_kappa_score

ORDERED_LABELS = ["低", "中", "高"]

linear_kappa = cohen_kappa_score(
    y_a,
    y_b,
    labels=ORDERED_LABELS,
    weights="linear"
)

quadratic_kappa = cohen_kappa_score(
    y_a,
    y_b,
    labels=ORDERED_LABELS,
    weights="quadratic"
)

print(f"线性加权 Kappa: {linear_kappa:.4f}")
print(f"二次加权 Kappa: {quadratic_kappa:.4f}")

加权方法必须在评估前确定。二次加权会更重地惩罚跨度较大的分歧,例如把“低”标成“高”比把“低”标成“中”受到更大惩罚。

六、验证计算结果是否可靠

验证 1:用手工结果交叉检查程序

将前述 100 条示例数据输入程序,预期原始一致率为 0.85,Kappa 约为 0.694。如果结果不同,应检查标签顺序、样本重复、缺失值处理和数据类型。

验证 2:执行边界用例

  • 两列标签完全相同:Kappa 应为 1。
  • 系统性相反且无对角线样本:Kappa 通常为负数。
  • 两名标注员都只选择同一个标签:分母可能为 0,结果可能是 NaN,此时 Kappa 不具备解释意义。
  • 打乱其中一列标签:Kappa 应显著下降并接近随机水平。

验证 3:使用 Bootstrap 估计置信区间

import numpy as np
from sklearn.metrics import cohen_kappa_score

rng = np.random.default_rng(42)
pairs = valid[["annotator_a", "annotator_b"]].to_numpy()
bootstrap_values = []

for _ in range(2000):
    indices = rng.integers(0, len(pairs), len(pairs))
    sampled = pairs[indices]
    value = cohen_kappa_score(
        sampled[:, 0],
        sampled[:, 1],
        labels=LABELS
    )
    if np.isfinite(value):
        bootstrap_values.append(value)

lower, upper = np.percentile(bootstrap_values, [2.5, 97.5])
print(f"95% Bootstrap CI: [{lower:.4f}, {upper:.4f}]")

当样本量小或类别极不均衡时,区间可能较宽。正式验收可以使用“置信区间下限达到门槛”代替“点估计达到门槛”,降低小样本偶然过线的风险。

七、如何解释 Kappa 并设置验收标准

常见经验分级会把 0.61 至 0.80 描述为较强一致,把 0.81 以上描述为接近完全一致,但这种分级只能用于沟通,不能机械地替代业务标准。医疗、金融风控或安全审核通常需要更严格的规则,而探索性文本分类可以允许较低门槛。

更可落地的验收方案应同时包含:

  • 总体原始一致率与总体 Kappa。
  • 每个类别的样本量、分歧数量和占比。
  • 关键类别的召回率、精确率或专家复核通过率。
  • 不同数据来源、语言、地区和难度分层的 Kappa。
  • Kappa 的置信区间及其下限。
  • 返修后复测结果,以及与首次结果的差异。

八、定位不一致原因并推动返修

步骤 1:导出全部分歧样本

disagreements = valid[
    valid["annotator_a"] != valid["annotator_b"]
].copy()

disagreements.to_csv("disagreements.csv", index=False)

步骤 2:按标签对统计高频冲突

conflict_pairs = (
    disagreements
    .groupby(["annotator_a", "annotator_b"])
    .size()
    .sort_values(ascending=False)
)

print(conflict_pairs.head(20))

高频冲突通常来自标签边界重叠、例外规则缺失、样本上下文不足、标注工具映射错误或个别标注员理解偏差。应由项目负责人或领域专家对冲突样本分类归因,而不是只要求标注员重新提交。

步骤 3:修订指南并重新盲测

把确认后的边界案例补充进指南,重新培训后抽取新样本盲测。新一轮评估不宜全部复用已讨论过的样本,否则结果会受到记忆和共识训练影响。返修记录应保留指南版本、复测样本和指标变化。

九、常见异常与处理方法

类别不平衡导致 Kappa 偏低

当绝大多数样本属于同一类别时,即使原始一致率很高,随机一致率也可能很高,从而压低 Kappa,这通常被称为流行率效应。此时应同时报告类别分布、混淆矩阵、原始一致率、分类别指标和分层抽样结果,不能为了提高数值而随意重采样后替代总体结论。

九、常见异常与处理方法

两名标注员标签使用倾向不同

如果一人倾向选择 A 类,另一人倾向选择 B 类,边际分布差异会影响 Kappa。应检查双方各自的标签占比,并抽查高频冲突,判断是指南问题、人员偏差还是样本信息不足。

总体 Kappa 掩盖关键类别问题

总体结果可能被大类主导。对于欺诈、违规、疾病阳性等关键小类,应单独计算二元 Kappa,并结合召回率和专家判定结果设置硬性门槛。

十、数据与服务选型建议

采购或定制数据时,应要求供应方提供标签体系、双标比例、仲裁流程、抽样方式、质检指标和版本记录,并使用自有验收集独立复核。Dataify 提供音视频、图像、文本及电商、金融、医疗、招聘等行业数据集,也支持 CPT、SFT、RLHF、RAG 和大模型评估所需的多模态数据服务;企业在选用标准数据集或定制交付时,仍应按本文流程设定一致性门槛并执行抽样验收。

十一、形成可审计的验收报告

最终报告至少应包含项目与批次信息、指南版本、样本总体与抽样框、双标样本量、缺失值处理、标签分布、混淆矩阵、原始一致率、Kappa、置信区间、关键类别指标、分歧原因、返修结论和审批记录。这样既能判断当前批次是否合格,也能比较不同批次、团队或指南版本的质量变化。

常见问题

Cohen's Kappa 达到多少才算合格?

没有适用于所有任务的统一阈值。可以参考常见经验分级,但正式门槛应根据误标成本、任务风险、类别数量和历史基线预先确定。建议同时要求总体 Kappa、置信区间下限及关键类别指标达标。

原始一致率很高,为什么 Kappa 仍然较低?

常见原因是类别严重不平衡。两名标注员即使主要选择同一个大类,也会产生很高的随机预期一致率,从而压低 Kappa。应结合标签分布、混淆矩阵、分类别指标和分层结果解释。

三名以上标注员可以两两计算 Cohen's Kappa 吗?

两两计算可用于定位具体标注员之间的差异,但不能完整替代多标注员总体指标。需要总体一致性时,可使用 Fleiss' Kappa 或 Krippendorff's Alpha,并同时保留两两分析作为诊断信息。

多标签分类如何计算一致性?

可以把每个标签分别转换为“选中”和“未选中”的二元任务,逐标签计算 Kappa,再报告宏平均、按标签支持度加权结果和关键标签结果。还应补充样本级完全匹配率或 Jaccard 相似度。

是否可以把“无法判断”直接删除?

只有在评估方案事先规定其为缺失状态时才可以删除,并且必须披露删除数量和原因。如果“无法判断”本身反映数据不可判定或信息不足,它应作为正式标签或单独的质量指标统计。

Kappa 合格后是否可以直接交付数据?

不建议仅凭 Kappa 放行。还需检查样本覆盖、重复和缺失、关键类别表现、数据泄漏、格式完整性、专家复核结果及业务规则符合性。Kappa 只回答标注员是否一致,不直接证明标签一定正确。

总结

数据集标注一致性评估应从独立双标和规范抽样开始,先用混淆矩阵计算观察一致率,再根据双方标签边际分布计算随机一致率,最终得到 Cohen's Kappa。验收时不能只看一个数值,还要结合类别分布、关键类别指标、Bootstrap 置信区间和分歧样本复核。对于有序标签、多标签、三名以上标注员或严重类别不平衡的任务,应选择加权 Kappa、逐标签评估或其他多标注员指标,并完整记录指南版本、抽样规则和返修过程。