Roh*_*han 10 python annotations 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.]])
Run Code Online (Sandbox Code Playgroud)
可以看出,206 个注释中有 200 个是由所有三个注释者针对相同类别进行的。现在实施 Fleiss Kappa:
from statsmodels.stats.inter_rater import fleiss_kappa
fleiss_kappa(z)
0.062106000466964177
Run Code Online (Sandbox Code Playgroud)
尽管大多数科目(200/206)都注释为同一类别,但为什么分数如此低?
我使用的是“评估者”而不是“注释者”。\n请记住,这些是评估者之间的一致性高于机会的衡量标准。
\n对于 Fleiss kappa,您需要首先聚合_raters():这会将您从主题作为行、评分者作为列(主题、评分者)到 -> 主题作为行、类别作为列(主题、类别)
\nfrom statsmodels.stats import inter_rater as irr\nagg = irr.aggregate_raters(arr) # returns a tuple (data, categories)\nagg\nRun Code Online (Sandbox Code Playgroud)\n如果每个评估者为每个主题分配一个类别,则每行值将总计为评估者数量 (3)。现在,列代表类别,如下所示:https://en.wikipedia.org/wiki/Fleiss \'_kappa#Data
\n\n\nRun Code Online (Sandbox Code Playgroud)\n(array([[1, 1, 1, 0], # all three raters disagree\n [1, 1, 1, 0], # again\n [1, 1, 1, 0], # and again\n [1, 1, 1, 0], # and again\n [0, 3, 0, 0], # all three raters agree on 1\n [1, 1, 1, 0], \n [2, 0, 0, 1], # two raters agree on 0, third picked 3\n [2, 0, 0, 1], # perfect disagreement \n [2, 0, 0, 1], # for the rest of the dataset.\n [2, 0, 0, 1], . . . ), \n array([0, 1, 2, 3])) # categories\n完美的分歧:“每次我选择 0,你就选择 3”
\n
对于前 4 个科目,每个评估者都编码了不同的类别!然后,对于其余科目,评估者一和三同意类别 0,而评估者二则评级为 3。现在,对于大多数数据集来说,这是完全不一致的,所以看到负 alpha 或 kappa 不会感到惊讶!让我们看一下...我们只需要聚合数据agg[0](元组的第一部分)。
\nirr.fleiss_kappa(agg[0], method=\'fleiss\')\nRun Code Online (Sandbox Code Playgroud)\n\n\n-0.44238 \xe2\x80\xa6 考虑到大多数主题的分歧,这是有道理的
\n
当前的 krippendorff 实现期望评分者为行,主题为列(评分者、主题)。所以我们需要对原始数据进行转置。如果我们不这样做,则假设 206 个评分者对 3 个科目进行了四个类别 [0,1,2,3] 的评分,从而得出前面给出的答案 (0.98)。 Krippendorff 并不期望聚合格式!
\nimport numpy as np\nimport krippendorff as kd \narrT = np.array(arr).transpose() #returns a list of three lists, one per rater\nkd.alpha(arrT, level_of_measurement=\'nominal\') #assuming nominal categories\nRun Code Online (Sandbox Code Playgroud)\n\n\n-0.4400\n\xe2\x80\xa6 这是有道理的,因为它应该接近/等于 Fleiss\' kappa。
\n
Abu*_*oeb -1
该解决方案可能会满足您的目的。这是生成 kappa 分数的代码片段0.98708。
import krippendorff
arr = [[ 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]]
kappa = krippendorff.alpha(arr)
print(kappa)
Run Code Online (Sandbox Code Playgroud)
它适用于 Python 3.4+,以下是您需要安装的依赖项
pip install numpy krippendorff