Skip to content
指南阅读约需 8 分钟

衡量标注者间一致性

如何在 Cohen's kappa、Fleiss' kappa 和 Krippendorff's alpha 之间做选择,0.67 与 0.80 这两个阈值分别意味着什么,以及 Potato 如何按标注类型报告一致性。

Potato Team

两名标注者标注无序类别时用 Cohen's kappa,三名及以上且数据完整时用 Fleiss' kappa,只要有标签缺失或者标签本身是有序的就用 Krippendorff's alpha。标注数据进来的同时,Potato 会在管理面板里报告 alpha,并在 /admin/iaa 给出一份按类型划分的报告。

标注者间一致性(IAA)衡量独立标注者给同一批项目打标签时有多一致。一致性是"任务定义得足够清楚、标签因而有意义"的标准证据,也是审稿人会要的那个数字。一致性低,更多时候是指南的问题而不是标注者的问题,所以这个测量值得早做,趁指南还改得动的时候。

选择一致性指标:两名评分者用 Cohen's kappa,多名评分者用 Fleiss' kappa,有序数据或有缺失时用 Krippendorff's alpha该用哪个一致性指标

为什么需要机会校正

最简单的指标是百分比一致性,也就是两名标注者标注结果完全相同的项目所占的比例。只要标签分布是偏斜的,它就会高估可靠性。两名标注者各自对 90% 的项目选"正面",即便完全随机标注也会在约 82% 的项目上一致,于是报出来的 85% 几乎说明不了两人中是否有人真的读过文本。经过机会校正的系数把这个基线除掉,下面三个系数共用同一个形式:

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

Po 是观察到的一致性,Pe 是随机情况下预期的一致性。取值 1 表示完全一致,0 表示处在随机水平。负值意味着标注者的一致程度还不如随机标注,这通常说明有一条标签定义被两个人读成了相反的意思。

选择系数

这三个标准系数的区别在于能容纳多少名标注者、是否容忍缺失标签,以及是否把标签当作有序的。

系数标注者缺失标签标签尺度
Cohen's kappa恰好 2 名不容忍名义
Fleiss' kappa3 名及以上不容忍名义
Krippendorff's alpha任意数量容忍名义、有序、区间、比率

Cohen's kappa 是一对标注者的经典选择,也是多数审稿人认得的那一个。Fleiss' kappa 把这个思路推广到更多评分者,但它要求每个项目上的评分数量相同,所以只要有一个项目被跳过,就得从计算中剔除。Krippendorff's alpha 会用上它手里的每一个评分,并且接受一个距离度量,这正是它适合有序尺度的原因。在 1 到 5 的李克特项目上,4 对 5 的分歧应该比 1 对 5 的分歧算得更轻,而只有 alpha 是这样计分的。在完整的名义数据上,三者通常相当接近,所以报告你所在领域期待的那一个,并把系数和距离度量都写明白,因为"一致性为 0.72"在每一种下的含义都不一样。当一个项目有两名以上标注者时,Potato 会两两配对计算 Cohen's kappa,在给出逐对结果的同时报告各对的均值,因为 Cohen's kappa 本身只对两名评分者有定义。

alpha 和 kappa 的可接受阈值

现在流通着两套惯例,而且它们并不一致,所以报数字时要说清楚你用的是哪一套。Landis 和 Koch(1977)为 kappa 提出了描述性的区间,Potato 给 kappa 值贴标签时用的就是这一套:

Kappa解读
< 0低于随机水平
0.01-0.20轻微
0.21-0.40一般
0.41-0.60中等
0.61-0.80较高
0.81-1.00几乎完全一致

Krippendorff 给 alpha 的惯例更严格,而且它被写成一条决策规则而不是一段描述。α ≥ 0.800 时可以依赖这批数据,0.667 到 0.800 之间只能得出试探性的结论,低于 0.667 则应当弃用。

两套区间都不是通过/不通过的闸门,提出它们的人都把它们当作追查原因的提示。在看到数字之前就定下项目需要的阈值,因为事后选出来的阈值是对结果的描述,不是一个标准。然后去看是哪些项目和哪些标签造成了分歧,因为一对容易混淆的标签往往就占了其中大部分。

在 Potato 中开启一致性报告

一致性需要重叠,所以第一个要设的是每个项目由多少名标注者看到。每个项目三名标注者是常见的默认值,既能给出逐项目的多数结果,也能算出系数。Potato 随后会在达到这个上限的项目上计算一致性:

yaml
num_annotators_per_item: 3
 
agreement_metrics:
  enabled: true
  min_overlap: 2          # items with at least 2 annotators enter the calculation
  refresh_interval: 60    # seconds between dashboard updates

min_overlap 是一个项目被计入的下限,不是目标。在每个项目收集 3 名标注者的同时把它设成 2,意味着语料还没被完全覆盖,数字就已经开始动了,而这正是在收集过程中而不是收集之后观察一致性的意义。

一份开启了一致性报告的完整配置是这样的:

yaml
annotation_task_name: "Agreement-Tracked Sentiment"
task_description: "Classify the sentiment of short texts."
 
data_files:
  - data/items.json
 
item_properties:
  id_key: id
  text_key: text
 
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    description: "What is the sentiment of this text?"
    labels:
      - Positive
      - Negative
      - Neutral
 
  - annotation_type: likert
    name: intensity
    description: "How strongly is that sentiment expressed?"
    size: 5
    min_label: "Barely"
    max_label: "Strongly"
 
num_annotators_per_item: 3
 
agreement_metrics:
  enabled: true
  min_overlap: 2
  refresh_interval: 60
 
output_annotation_dir: annotation_output

这两个方案的计分方式不同,而且是刻意如此。sentiment 是名义的,因此得到 kappa 和名义 alpha;intensity 是有序的,因此得到加权 kappa 和有序 alpha,它们对差一步的分歧比对差四步的分歧罚得轻。

Potato 按标注类型报告什么

管理面板会在标注陆续到来时按方案报告 Krippendorff's alpha。更完整的报告在 /admin/iaa,它会给每个方案分类,并计算适用于它的指标,统计范围是那些每项目标注者上限至少为 2 且已经达到上限的项目。

方案类别示例类型报告的指标
名义radio、selectpercent_agreement、cohen_kappa、fleiss_kappa、alpha_nominal
有序likert、range_sliderweighted_kappa_linear、weighted_kappa_quadratic、spearman_rho、alpha_ordinal
连续slider、numberpearson_r、mae、rmse、alpha_interval、icc_2_k
多标签multiselectmean_jaccard、alpha_masi
排序rankingkendall_tau、spearman_footrule
跨度span、error_span、span_linktoken_level_kappa、span_f1_exact、span_f1_partial、krippendorff_alpha_u、gamma_mathet
几何image_annotationsigma、ks、detection_alpha、classification_alpha,外加原始的 mean_matched_iou 和 detection_f1

跨度和形状各有自己的一族指标,因为单个系数会掩盖标注者究竟在任务的哪一部分上出现了分歧。两名标注者可以选中同一个实体类型,却对实体从哪里开始有分歧,span_f1_partial 和 span_f1_exact 正是把这两件事分开。在形状上,detection_alpha 回答标注者是不是找到了同样的对象,sigma 回答他们是不是画在了同样的位置,这一对指标的诊断力是一个混在一起的数字给不了的。跨度的一致性和在边界框上衡量一致性分别讲了这两种情况。

两份报告都只对管理员开放。/admin/iaa 需要一个 API 密钥,默认返回 JSON:

bash
curl -H "X-API-Key: $POTATO_ADMIN_KEY" \
  "http://localhost:8000/admin/iaa"
 
# Rendered table instead of JSON
curl -H "X-API-Key: $POTATO_ADMIN_KEY" \
  "http://localhost:8000/admin/iaa?format=html"

/admin/api/agreement 返回面板自己的那份视图,即按 schema 给出的 Krippendorff's alpha 及其解读。未定义的指标返回 null 而不是 NaN,这在项目早期还没有任何项目拿到两名标注者的时候很常见。

如果你想在配置任何东西之前先拿一张标签表试一下,一致性计算器可以在浏览器里算出名义、有序和区间 alpha,以及 Cohen's 和 Fleiss' kappa。

一致性偏低时怎么办

在对标注者队伍做任何改动之前,先读一读那些有分歧的项目。首先要回答的是指南有歧义还是项目本身确实难,因为这两者的修法不同,而且只有前者是便宜的。收紧定义,把难例当作示例写进指南,再在一批新的子集上重新试标。撰写标注指南详细讲了这个循环。

对这个数字本身还有两点要当心。标注者共用同一个来源而不是各自独立判断时,一致性会上升,所以一项带模型预标注的研究可能同时表现出高一致性和低可靠性,这一点一致性抓不出橡皮图章式标注讲过。而在真正主观的任务上,指南做得再好,一致性也可能一直很低,这时候把分歧记录下来比硬凑出单一答案更诚实。裁定与分歧讲的是这条路,而当你需要从有分歧的标注者里得出单一标签时,MACE会估计每名标注者的胜任程度。

延伸阅读

参考文献

Landis, J. R., and Koch, G. G. (1977). The Measurement of Observer Agreement for Categorical Data. Biometrics, 33(1), 159-174. https://doi.org/10.2307/2529310

Artstein, R., and Poesio, M. (2008). Survey Article: Inter-Coder Agreement for Computational Linguistics. Computational Linguistics, 34(4), 555-596. https://aclanthology.org/J08-4004/

Krippendorff, K. (2004). Content Analysis: An Introduction to Its Methodology, 2nd edition. Sage.