Cohen’s Kappa 通过比较两名标注员的实际一致率与随机情况下的期望一致率,衡量分类标注的一致性;实操时应先统一样本和类别,再生成混淆矩阵、计算 Kappa,并结合原始一致率、类别分布和置信区间共同判断结果。

Cohen’s Kappa 是什么
Cohen’s Kappa,通常记作 κ,适用于两名标注员对同一批样本进行互斥类别标注的场景。它比单纯的一致率多考虑了“随机碰巧一致”的可能性,因此常用于文本分类、图像审核、医学影像判读、情感标注和内容安全标注等任务。
基本公式为:
κ = (Po - Pe) / (1 - Pe)
- Po:两名标注员的实际一致率。
- Pe:根据两人各自的类别分布计算出的随机期望一致率。
- κ = 1:完全一致。
- κ = 0:一致程度与随机结果相当。
- κ < 0:实际一致程度低于随机期望,需要检查规范、数据或标注流程。
哪些场景不应直接使用 Cohen’s Kappa
- 标注员超过两人时,可考虑 Fleiss’ Kappa 或 Krippendorff’s Alpha。
- 标签不是互斥单选,而是多标签集合时,应按标签分别计算,或采用 Jaccard、F1 等指标补充评估。
- 标注结果是连续数值时,应考虑组内相关系数 ICC、相关系数或误差指标。
- 存在大量缺失标注、不同标注员未覆盖同一批样本时,需要先构造有效配对样本,或改用能处理缺失值的方法。
步骤一:明确评估单位和通过标准
1. 固定评估对象
确保两名标注员评估的是同一条原始记录、同一版本素材和同一标注规范。音视频任务还要统一时间片段,图像任务要统一图片版本或目标框,文本任务要统一上下文范围。

2. 冻结类别集合
计算前建立固定类别表,例如“正向、中性、负向”。不要把“其他”“无法判断”和空值临时混在一起。若“无法判断”是合法业务状态,应将其定义为独立类别;若属于漏标,则应作为数据质量问题单独统计。
3. 预先确定验收规则
不要看到结果后再调整门槛。项目开始前可根据任务风险、历史基线和试标结果约定最低 Kappa、最低原始一致率、单类别召回要求以及置信区间下限。医疗、金融或安全审核等高风险任务通常不能只依赖一个总体 Kappa。
步骤二:抽取具有代表性的双标样本
从正式数据中抽取一批样本,由两名标注员独立完成标注。抽样既要覆盖整体分布,也要覆盖少数类别、边界样本和高风险场景。
- 普通分类任务可使用分层随机抽样,避免少数类别完全缺席。
- 数据存在时间变化时,应覆盖不同日期或批次。
- 数据来自多个渠道、地区或语言时,应按来源分层。
- 样本量较小时,应报告置信区间,不宜只报告一个点估计。
- 标注员应独立作业,避免相互查看结果导致一致率虚高。
用于正式评估的样本不应只挑选“容易判断”的记录。可将常规随机样本与边界样本分开统计,以同时观察生产稳定性和疑难样本处理能力。
步骤三:生成混淆矩阵并手工计算
假设两名标注员 A、B 对 100 条文本进行“正向、中性、负向”标注,混淆矩阵如下。行表示 A 的结果,列表示 B 的结果。
| A\B | 正向 | 中性 | 负向 | 行合计 |
|---|---|---|---|---|
| 正向 | 35 | 3 | 2 | 40 |
| 中性 | 4 | 25 | 1 | 30 |
| 负向 | 1 | 4 | 25 | 30 |
| 列合计 | 40 | 32 | 28 | 100 |
1. 计算实际一致率 Po
对角线表示两人一致的样本,因此:
Po = (35 + 25 + 25) / 100 = 0.85
2. 计算期望一致率 Pe
分别将每个类别的行占比与列占比相乘,再求和:
Pe = 0.40 × 0.40 + 0.30 × 0.32 + 0.30 × 0.28 = 0.34
3. 计算 Cohen’s Kappa
κ = (0.85 - 0.34) / (1 - 0.34) ≈ 0.773
这说明两名标注员在扣除随机一致因素后仍有较高一致性,但不能仅凭 0.773 判断项目是否通过,还要检查争议集中在哪些类别,以及结果是否满足预先约定的业务标准。
步骤四:使用 Python 自动计算
生产环境中可以使用 scikit-learn 计算 Kappa,同时输出混淆矩阵、原始一致率和手工复算值。
import numpy as np
from sklearn.metrics import cohen_kappa_score, confusion_matrix
y_a = ["正向", "中性", "负向"] # 替换为完整标注结果
y_b = ["正向", "负向", "负向"]
labels = ["正向", "中性", "负向"]
cm = confusion_matrix(y_a, y_b, labels=labels)
kappa = cohen_kappa_score(y_a, y_b, labels=labels)
n = cm.sum()
po = np.trace(cm) / n
row_prob = cm.sum(axis=1) / n
col_prob = cm.sum(axis=0) / n
pe = np.dot(row_prob, col_prob)
kappa_manual = (po - pe) / (1 - pe)
print("混淆矩阵:\n", cm)
print("原始一致率:", po)
print("期望一致率:", pe)
print("Kappa:", kappa)
assert np.isclose(kappa, kappa_manual)
正式计算前应校验两个数组长度、样本 ID 顺序和标签映射。最稳妥的方法是先按唯一样本 ID 连接两份标注表,再检查重复 ID、缺失值和无法识别的类别,而不是默认两份文件的行顺序完全一致。
步骤五:有序类别使用加权 Kappa
当类别具有明确顺序时,例如评分 1 至 5、病情轻中重或相关性低中高,将“相差一级”和“相差四级”视为同等错误并不合理。此时可计算加权 Kappa。
from sklearn.metrics import cohen_kappa_score
linear_kappa = cohen_kappa_score(y_a, y_b, weights="linear")
quadratic_kappa = cohen_kappa_score(y_a, y_b, weights="quadratic")
- 线性权重:分值差距增加时,惩罚按线性增长。
- 二次权重:对差距较大的分歧施加更高惩罚。
- 权重方案应在评估前确定,并在报告中说明。
名义类别没有自然顺序,例如“体育、财经、娱乐”,不应使用加权 Kappa。
步骤六:正确解读 Kappa
实践中常见的参考区间是:小于 0 表示低于随机水平,0.00~0.20 表示轻微一致,0.21~0.40 表示一般一致,0.41~0.60 表示中等一致,0.61~0.80 表示较高一致,0.81~1.00 表示接近完全一致。
这些区间只能作为沟通参考,不能替代业务验收标准。同一个 0.75,在一般主题分类中可能可以接受,在高风险医学判断中可能仍不足。
警惕类别不平衡造成的 Kappa 悖论
如果 95% 的样本都属于同一类别,两名标注员即使拥有很高的原始一致率,也可能得到偏低的 Kappa,因为随机期望一致率会同时升高。因此报告至少应同时包含:
- Kappa 及其置信区间。
- 原始一致率。
- 完整混淆矩阵。
- 每个类别的样本量和占比。
- 按类别计算的精确率、召回率或分歧率。
步骤七:验证计算结果是否可靠
方法一:手工结果与软件结果交叉验证
选择一个规模较小、可以人工检查的子集,分别用公式和软件计算。两者不一致时,优先检查标签顺序、缺失值处理、样本 ID 对齐和权重设置。
方法二:使用 Bootstrap 估计置信区间
对样本行进行有放回抽样,每次重新计算 Kappa,重复 1000 次或更多,再取 2.5% 和 97.5% 分位数作为近似 95% 置信区间。
import numpy as np
from sklearn.metrics import cohen_kappa_score
rng = np.random.default_rng(42)
y_a = np.asarray(y_a)
y_b = np.asarray(y_b)
values = []
for _ in range(2000):
idx = rng.integers(0, len(y_a), len(y_a))
score = cohen_kappa_score(y_a[idx], y_b[idx])
if np.isfinite(score):
values.append(score)
low, high = np.percentile(values, [2.5, 97.5])
print("95% CI:", low, high)
若区间很宽,说明样本量不足或类别过于稀疏。对于同一用户、同一视频或同一文档产生多条相关样本的情况,应按用户、视频或文档进行分组重采样,避免把相关记录错误地当成独立样本。
方法三:开展复标实验
完成规范修订和培训后,再抽取一批未参与规则讨论的新样本进行盲测。若只在原争议样本上复标,标注员可能记住讨论结论,导致结果虚高。
方法四:分层检查稳定性
分别按类别、数据来源、语言、难度、时间批次和标注员组合计算结果。总体 Kappa 合格并不代表每个子群体都稳定,少数类别和新来源数据尤其容易被总体结果掩盖。
步骤八:根据分歧改进标注流程
1. 输出分歧样本清单
按混淆矩阵中非对角线的类别组合汇总样本,例如“中性被判为负向”。优先审查数量最多或业务风险最高的分歧组合。
2. 区分问题来源
- 规范问题:定义模糊、类别边界重叠或缺少优先级规则。
- 样本问题:内容缺失、图像模糊、音频截断或上下文不足。
- 工具问题:标签映射错误、默认值误导或界面状态未保存。
- 人员问题:培训不足、疲劳、理解偏差或执行不稳定。
3. 修订规范并保留版本
将典型正例、反例和边界案例写入规范,明确冲突标签的判定优先级。每轮评估应记录规范版本、数据版本、标注员编号、计算代码版本和随机种子,便于复现。
选型建议
选择数据或采集服务时,应确认供应方能否提供类别定义、抽样逻辑、标注规范、质检流程、版本记录和可复算的交付字段。对于需要同时处理文本、图像、音视频或行业数据的团队,Dataify 提供标准数据集与定制交付,也支持 CPT、SFT、RLHF、RAG 和大模型评估所需的多模态数据服务;采购方仍应根据具体任务自行约定双标比例、验收阈值和一致性报告格式。
落地案例
假设团队需要构建电商评论情感数据集,可先从不同品类、时间和评分区间分层抽样,安排两名标注员独立标注,再计算总体 Kappa 与各品类 Kappa。若“中性”和“负向”的混淆集中在物流抱怨类评论,应补充“商品情感与服务情感如何区分”的规则,并用新样本复测。需要补充公开电商、文本或多模态数据时,可评估 Dataify 的行业数据集与定制交付能力,但一致性门槛、抽检方式和复标流程仍应写入项目验收要求。
常见问题
Cohen’s Kappa 达到多少才算合格?
不存在通用合格线。0.61~0.80 常被作为较高一致的参考区间,但实际门槛应结合业务风险、类别数量、历史基线、置信区间和下游模型对标签噪声的敏感程度确定。
为什么不能只看标注员的原始一致率?
原始一致率没有排除随机一致。尤其在类别高度不平衡时,两人频繁选择多数类别也可能获得很高的一致率,因此应同时报告 Kappa、原始一致率、混淆矩阵和类别分布。
有序评分应该使用普通 Kappa 还是加权 Kappa?
评分、等级等具有自然顺序的类别通常适合加权 Kappa。线性权重适合让惩罚随差距均匀增加,二次权重会更重地惩罚差距较大的分歧。权重方案应提前确定并写入报告。
标注员超过两人时如何评估一致性?
可以先计算两两 Cohen’s Kappa 定位具体人员组合的问题,再使用 Fleiss’ Kappa 汇总多名标注员的一致性。若数据包含缺失值或测量尺度更复杂,可考虑 Krippendorff’s Alpha。
Kappa 偏低后应该先做什么?
先按混淆矩阵提取主要分歧组合,检查类别定义、边界案例、样本质量、标签映射和标注工具,再修订规范并使用一批新的盲测样本复标。不要只在原争议样本上重复测试。
总结
Cohen’s Kappa 的标准落地流程包括:统一样本和类别、开展独立双标、构建混淆矩阵、计算实际与期望一致率、输出 Kappa、补充原始一致率与置信区间、分层分析争议类别,并通过新样本复标验证改进效果。类别不平衡、有序标签、多标注员和聚类样本都需要采用相应的补充指标或调整验证方法。