【问题标题】:Inter-rater agreement in Python (Cohen's Kappa)Python 中的评分者间协议(Cohen's Kappa)
【发布时间】:2012-07-16 16:59:33
【问题描述】:

我有 3 位评分员对 60 个案例的评分。这些在按文档组织的列表中 - 第一个元素指的是第一个文档的评级,第二个文档的第二个,依此类推:

rater1 = [-8,-7,8,6,2,-5,...]
rater2 = [-3,-5,3,3,2,-2,...]
rater3 = [-4,-2,1,0,0,-2,...]

在某处是否有 Cohen 的 Kappa 的 python 实现?我在 numpy 或 scipy 中找不到任何东西,在 stackoverflow 上也找不到任何东西,但也许我错过了?这是一个很常见的统计数据,所以我很惊讶我找不到像 Python 这样的语言。

【问题讨论】:

  • 我同意依赖一些常用的库会很好,但是自己实现并不难。我的直接实现不到 50 行代码,其中包括处理缺失值。
  • 实际上,给定 3 个评估者,cohen 的 kappa 可能不合适。由于 cohen 的 kappa 测量了两个样本集之间的一致性。对于 3 位评估者,您最终会得到 3 个 kappa 值,分别代表“1 vs 2”、“2 vs 3”和“1 vs 3”。这可能不容易解释
  • Fleiss' Kappa 是 3 位评估者的选择

标签: python statistics rating


【解决方案1】:

Cohen's kappa 在 scikit-learn 0.17 中引入:

sklearn.metrics.cohen_kappa_score(y1, y2, labels=None, weights=None)

Example:

from sklearn.metrics import cohen_kappa_score
labeler1 = [2, 0, 2, 2, 0, 1]
labeler2 = [0, 0, 2, 2, 0, 2]
cohen_kappa_score(labeler1, labeler2)

提醒一下,来自 {1}:


参考资料:

【讨论】:

【解决方案2】:

您也可以使用nltk.metrics.agreement。下面是相同的代码sn-p

from nltk import agreement
rater1 = [1,1,1]
rater2 = [1,1,0]
rater3 = [0,1,1]

taskdata=[[0,str(i),str(rater1[i])] for i in range(0,len(rater1))]+[[1,str(i),str(rater2[i])] for i in range(0,len(rater2))]+[[2,str(i),str(rater3[i])] for i in range(0,len(rater3))]
ratingtask = agreement.AnnotationTask(data=taskdata)
print("kappa " +str(ratingtask.kappa()))
print("fleiss " + str(ratingtask.multi_kappa()))
print("alpha " +str(ratingtask.alpha()))
print("scotts " + str(ratingtask.pi()))

有关其他示例,另请参阅 http://courses.washington.edu/cmling/lab7.html

【讨论】:

    【解决方案3】:

    旧问题,但可在 skll 指标包中找到参考 Kappa。

    http://skll.readthedocs.org/en/latest/api/metrics.html#skll.metrics.kappa

    【讨论】:

      【解决方案4】:

      我还没有发现它包含在任何主要的库中,但是如果你用谷歌搜索,你可以在各种“食谱”类型的网站等上找到实现。以下是实现Cohen's kappaFleiss' kappaKrippendorff's alpha 的页面

      【讨论】:

      • 正如其他人所指出的,Kappa 是 scikit-learn、statsmodel 和 nltk 的一部分。
      【解决方案5】:

      statsmodels 是一个 Python 库,其中包含 Cohen 的 Kappa 和其他评分者间一致性指标(在 statsmodels.stats.inter_rater 中)。

      【讨论】:

        【解决方案6】:

        要扩展 Franck Dernoncourt answer 并解决 skjerns 评论,这里是为两个以上评估者创建矩阵的代码:

        import itertools
        
        from sklearn.metrics import cohen_kappa_score
        import numpy as np
        
        # Note that I updated the numbers so all Cohen kappa scores are different.
        rater1 = [-8, -7, 8, 6, 2, -5]
        rater2 = [-3, -5, 3, 3, 2, -2]
        rater3 = [-4, -2, 1, 3, 0, -2]
        
        raters = [rater1, rater2, rater3]
        
        data = np.zeros((len(raters), len(raters)))
        # Calculate cohen_kappa_score for every combination of raters
        # Combinations are only calculated j -> k, but not k -> j, which are equal
        # So not all places in the matrix are filled.
        for j, k in list(itertools.combinations(range(len(raters)), r=2)):
            data[j, k] = cohen_kappa_score(raters[j], raters[k])
        
        # [[0.        , 0.11764706, 0.        ],
        #  [0.        , 0.        , 0.25      ],
        #  [0.        , 0.        , 0.        ]]
        

        这是data的情节:

        import seaborn as sns
        import matplotlib.pyplot as plt
        
        sns.heatmap(
            data, 
            mask=np.tri(len(raters)),
            annot=True, linewidths=5,
            vmin=0, vmax=1,
            xticklabels=[f"Rater {k + 1}" for k in range(len(raters))],
            yticklabels=[f"Rater {k + 1}" for k in range(len(raters))],
        )
        plt.show()
        

        【讨论】:

          猜你喜欢
          • 2011-01-18
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-26
          • 2020-05-03
          • 1970-01-01
          • 2013-03-10
          相关资源
          最近更新 更多