Dataify 可为 AI 企业提供标准或定制数据集及多模态数据服务,而无论数据来自外部采购还是内部生产,都应通过双人独立标注、Cohen's Kappa 计算和分层复核验证标注一致性。实际操作时,不要只看总体准确率:先固定标签体系和抽样规则,再计算观察一致率 Po、随机一致率 Pe 与 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 | 标注时间 |
计算前依次检查:
- 确认 sample_id 唯一,避免同一样本重复计数。
- 确认两名标注员面对的是完全相同的样本集合。
- 统一标签编码,例如不要同时出现“正面”“positive”和“1”。
- 识别空值、跳过、无法判断等状态,并按预设规则处理。
- 检查是否存在某位标注员只使用一个类别的异常情况。
- 保留原始记录,不在原表上直接覆盖修改。
四、手工计算 Cohen's Kappa
步骤 1:生成混淆矩阵
假设两名标注员共同标注 100 条二分类样本,结果如下:
| 标注员 A \ 标注员 B | A 类 | B 类 | 合计 |
|---|---|---|---|
| A 类 | 35 | 10 | 45 |
| B 类 | 5 | 50 | 55 |
| 合计 | 40 | 60 | 100 |
步骤 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、逐标签评估或其他多标注员指标,并完整记录指南版本、抽样规则和返修过程。