python - fleiss kappa 是一个可靠的注释者间协议衡量标准吗?以下结果让我感到困惑,使用它时是否有任何涉及的假设?
问题描述
我有带有以下描述的注释矩阵:3 个注释器,3 个类别,206 个主题
数据存储在 numpy.ndarray 变量 z 中:
array([[ 0., 2., 1.],
[ 0., 2., 1.],
[ 0., 2., 1.],
[ 0., 2., 1.],
[ 1., 1., 1.],
[ 0., 2., 1.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.],
[ 0., 3., 0.]])
可以看出,206 个注释中有 200 个是所有三个注释器的相同类别。现在实施 Fleiss Kappa:
from statsmodels.stats.inter_rater import fleiss_kappa
fleiss_kappa(z)
0.062106000466964177
尽管大多数主题(200/206)被注释为同一类别,为什么分数如此之低?
解决方案
我使用的是“评价者”而不是“注释者”。请记住,这些是评分者之间高于机会的一致性度量。
弗莱斯卡帕
对于 Fleiss kappa,您需要先聚合_raters():这会将您从作为行的主题和作为列(主题、评级者)的评估者带到 -> 作为行的主题和作为列的类别(主题、类别)
from statsmodels.stats import inter_rater as irr
agg = irr.aggregate_raters(arr) # returns a tuple (data, categories)
agg
如果每个评估者为每个主题分配一个类别,则每行值将加起来为评估者的数量 (3)。现在,这些列代表此处所见的类别https://en.wikipedia.org/wiki/Fleiss'_kappa#Data
(array([[1, 1, 1, 0], # all three raters disagree [1, 1, 1, 0], # again [1, 1, 1, 0], # and again [1, 1, 1, 0], # and again [0, 3, 0, 0], # all three raters agree on 1 [1, 1, 1, 0], [2, 0, 0, 1], # two raters agree on 0, third picked 3 [2, 0, 0, 1], # perfect disagreement [2, 0, 0, 1], # for the rest of the dataset. [2, 0, 0, 1], . . . ), array([0, 1, 2, 3])) # categories
完美的分歧:'每次我选择0,你选择3'
…您的数据表明您有 4 个类别 [0, 1, 2, 3]
对于前 4 个科目,每个评分者都编码了不同的类别!然后对于其余的科目,评分者一和三同意类别 0,而评分者二评分为 3。现在,对于大多数数据集来说,这是完全不同的,所以看到负 alpha 或 kappa 我不会感到惊讶!让我们看看……我们只需要聚合数据agg[0](元组的第一部分)。
irr.fleiss_kappa(agg[0], method='fleiss')
-0.44238 ...考虑到大多数主题的分歧,这是有道理的
克里彭多夫阿尔法
当前的 krippendorff 实现期望评估者为行,主题为列(评估者,主题)。所以我们需要转置原始数据。如果我们不这样做,则假设 206 名评分者对 3 个科目进行了评分,分为四个类别 [0,1,2,3],从而得出之前给出的答案 (0.98)。 Krippendorff 并不期望聚合格式!
import numpy as np
import krippendorff as kd
arrT = np.array(arr).transpose() #returns a list of three lists, one per rater
kd.alpha(arrT, level_of_measurement='nominal') #assuming nominal categories
-0.4400 ...这是有道理的,因为它应该接近/等于 Fleiss 的 kappa。
推荐阅读
- c++ - 在 C++ 中绘制 Windows 10 壁纸
- azure - azure-arm winrm 使用打包程序超时错误
- python - Context Locals 和 The Request Context 如何协同工作?
- google-sheets - 如何发布谷歌表格插件
- java - 在 Java Spring 中使用需要带有 @Formula 注释的选项的 sql 函数
- java - 无法使用 Java 11 升级构建我的项目
- c# - PointerEnter 事件不会触发悬停状态
- javascript - 如何在 Adobe Indesign 的扩展脚本中定义换行符
- python - 处理 aiohttp 中的错误请求
- spring - Spring AOP 传递控制器方法的字符串参数