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.