python如何Fleiss Kappa

目的

检验数据一致性

示例

机器学习中涉及新数据集发布的论文通常会描述数据集的构建过程,一份数据集往往由多位标注员共同完成,不同标注员对数据的理解很容易存在偏差,这极大程度上会影响数据集的一致性,从而限制算法的性能。因此在构建数据集的标注过程中,大多数构建数据集的工作都会对标注员之间的标注一致性进行评估,以保证数据集的质量。

假如有一个15个项目,7个评委,每行是一个项目的评委评分

代码

import numpy as np
from statsmodels.stats.inter_rater import fleiss_kappa

# 原始数据:一个15个项目,7个评委,每行是一个项目的评委评分
data = np.array([
    [5,5,5,5,5,5,5],
    [4,4,2,4,4,3,3],
    [3,4,5,5,3,5,4],
    [2,2,2,3,3,3,3],
    [1,3,3,3,3,2,3],
    [1,1,1,2,1,2,2],
    [1,2,1,3,4,2,1],
    [1,5,3,2,2,2,5],
    [1,1,2,2,3,1,3],
    [2,2,2,2,2,2,2],
    [1,1,1,2,1,2,2],
    [1,2,1,3,4,2,1],
    [5,5,5,5,5,5,5],
    [1,1,2,2,3,1,3],
    [2,2,2,2,2,2,2]
])

# 获取评分类别范围(假设评分为整数,类别从最小值到最大值)
categories = np.arange(data.min(), data.max() + 1)  # [2, 3, 4, 5]
num_categories = len(categories)

# 初始化 Fleiss' kappa 格式矩阵
ratings_matrix = np.zeros((data.shape[0], num_categories), dtype=int)

# 统计每个项目中每个类别的评分人数
for i, row in enumerate(data):
    for category in categories:
        ratings_matrix[i, category - categories.min()] = np.sum(row == category)

# 打印整理后的矩阵
# print("整理后的数据矩阵 (Fleiss' kappa 格式):")
# print(ratings_matrix)

# 计算 Fleiss' kappa
kappa = fleiss_kappa(ratings_matrix)

# 计算额外统计量
n = np.sum(ratings_matrix, axis=1)[0]  # 每个项目的评分人数(假设一致)
N = ratings_matrix.shape[0]  # 项目数
P = np.sum(ratings_matrix, axis=0) / (N * n)  # 每个类别的总体比例
P_bar = np.sum(np.sum(ratings_matrix**2, axis=1) - n) / (N * n * (n - 1))  # 平均项目一致性
P_e = np.sum(P**2)  # 预期一致性

# 计算标准误差
se_kappa = np.sqrt((P_bar * (1 - P_bar) / (N * (1 - P_e)**2)))

# 计算 Z 值
z_kappa = kappa / se_kappa

# 计算 p-value
from scipy.stats import norm
p_value = 2 * (1 - norm.cdf(np.abs(z_kappa)))

# 计算 95% CI
ci_lower = kappa - 1.96 * se_kappa
ci_upper = kappa + 1.96 * se_kappa

# 打印结果
print("\nFleiss' kappa: {:.4f}".format(kappa))
print("Standard Error: {:.4f}".format(se_kappa))
print("Z-value: {:.4f}".format(z_kappa))
print("p-value: {:.4f}".format(p_value))
print("95% CI: ({:.4f}, {:.4f})".format(ci_lower, ci_upper))

指标解释

kappa计算结果为[-1,1],但通常kappa是落在 [0,1] 间

第一种分析准则–可分为五组来表示不同级别的一致性:

0.0~0.20极低的一致性(slight)

0.21~0.40一般的一致性(fair)

0.41~0.60 中等的一致性(moderate)

0.61~0.80 高度的一致性(substantial)

0.81~1几乎完全一致(almost perfect)