衡量标注者间一致性
如何在 Cohen's kappa、Fleiss' kappa 和 Krippendorff's alpha 之间做选择,0.67 与 0.80 这两个阈值分别意味着什么,以及 Potato 如何按标注类型报告一致性。
两名标注者标注无序类别时用 Cohen's kappa,三名及以上且数据完整时用 Fleiss' kappa,只要有标签缺失或者标签本身是有序的就用 Krippendorff's alpha。标注数据进来的同时,Potato 会在管理面板里报告 alpha,并在 /admin/iaa 给出一份按类型划分的报告。
标注者间一致性(IAA)衡量独立标注者给同一批项目打标签时有多一致。一致性是"任务定义得足够清楚、标签因而有意义"的标准证据,也是审稿人会要的那个数字。一致性低,更多时候是指南的问题而不是标注者的问题,所以这个测量值得早做,趁指南还改得动的时候。
该用哪个一致性指标
为什么需要机会校正
最简单的指标是百分比一致性,也就是两名标注者标注结果完全相同的项目所占的比例。只要标签分布是偏斜的,它就会高估可靠性。两名标注者各自对 90% 的项目选"正面",即便完全随机标注也会在约 82% 的项目上一致,于是报出来的 85% 几乎说明不了两人中是否有人真的读过文本。经过机会校正的系数把这个基线除掉,下面三个系数共用同一个形式:
κ = (Po - Pe) / (1 - Pe)
Po 是观察到的一致性,Pe 是随机情况下预期的一致性。取值 1 表示完全一致,0 表示处在随机水平。负值意味着标注者的一致程度还不如随机标注,这通常说明有一条标签定义被两个人读成了相反的意思。
选择系数
这三个标准系数的区别在于能容纳多少名标注者、是否容忍缺失标签,以及是否把标签当作有序的。
| 系数 | 标注者 | 缺失标签 | 标签尺度 |
|---|---|---|---|
| Cohen's kappa | 恰好 2 名 | 不容忍 | 名义 |
| Fleiss' kappa | 3 名及以上 | 不容忍 | 名义 |
| 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 随后会在达到这个上限的项目上计算一致性:
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 updatesmin_overlap 是一个项目被计入的下限,不是目标。在每个项目收集 3 名标注者的同时把它设成 2,意味着语料还没被完全覆盖,数字就已经开始动了,而这正是在收集过程中而不是收集之后观察一致性的意义。
一份开启了一致性报告的完整配置是这样的:
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、select | percent_agreement、cohen_kappa、fleiss_kappa、alpha_nominal |
| 有序 | likert、range_slider | weighted_kappa_linear、weighted_kappa_quadratic、spearman_rho、alpha_ordinal |
| 连续 | slider、number | pearson_r、mae、rmse、alpha_interval、icc_2_k |
| 多标签 | multiselect | mean_jaccard、alpha_masi |
| 排序 | ranking | kendall_tau、spearman_footrule |
| 跨度 | span、error_span、span_link | token_level_kappa、span_f1_exact、span_f1_partial、krippendorff_alpha_u、gamma_mathet |
| 几何 | image_annotation | sigma、ks、detection_alpha、classification_alpha,外加原始的 mean_matched_iou 和 detection_f1 |
跨度和形状各有自己的一族指标,因为单个系数会掩盖标注者究竟在任务的哪一部分上出现了分歧。两名标注者可以选中同一个实体类型,却对实体从哪里开始有分歧,span_f1_partial 和 span_f1_exact 正是把这两件事分开。在形状上,detection_alpha 回答标注者是不是找到了同样的对象,sigma 回答他们是不是画在了同样的位置,这一对指标的诊断力是一个混在一起的数字给不了的。跨度的一致性和在边界框上衡量一致性分别讲了这两种情况。
两份报告都只对管理员开放。/admin/iaa 需要一个 API 密钥,默认返回 JSON:
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.