计算Fleiss' Kappa(评分者间一致性)时遇AssertionError求助
修正Fleiss' Kappa计算逻辑的AssertionError问题
数据与问题背景
我有如下数据框:
import pandas as pd import numpy as np data = {'Query' : ['Carpal Ts', 'Dermallxde'], 'Items' : [['Sir chucks', 'Oga Mathew', 'Tambe Charlse'],['Man Ond', 'kolofata Hil', 'Haruna mendy']], 'Raters' : [[[0,0,0,1,1,0,0,1,0,1,0,0,0],[0,1,0,1,0,0,0,1,1,1,0,0,1],[1,1,1,1,1,1,1,1,1,1,1,1,1]],[[1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,0,1,0,1,1,0,1,1,1,0],[1,1,1,1,1,1,1,1,1,1,1,1,1]]]} results_df = pd.DataFrame(data)
评分者对每个Query下的Items以0/1评分(0代表差,1代表好),我尝试为每个Query计算Fleiss' Kappa(评分者间一致性),编写了如下代码,但运行时出现AssertionError,需要修正计算逻辑:
from statsmodels.stats.inter_rater import fleiss_kappa # create an empty list to hold the Fleiss' Kappa values kappas = [] # iterate over each index in the results dataframe for idx, row in results_df.iterrows(): data = row['Raters'] # get the list of lists in the 'Data' field users = row['Items'] # get the list of users with data # check if there are exactly three non-null columns with lists of equal length if len(data) == 3 and len(set([len(d) for d in data])) == 1: kappa = fleiss_kappa(np.array(data).T) print(kappa) kappas.append({ 'Query': idx, 'Items': users, 'Fleiss Kappa': kappa }) # create a new dataframe from the list of Fleiss' Kappa values kappa_df = pd.DataFrame(kappas)
问题原因
statsmodels的fleiss_kappa函数要求输入的是类别计数矩阵:每行代表一个被评分项目,每列代表该项目在对应类别下的评分次数(比如二分类场景下,每行是[评0的次数, 评1的次数])。而原代码直接传入了原始的0/1评分矩阵,不符合函数的输入格式,这是触发AssertionError的核心原因。
另外原代码还存在两个小问题:
Query字段错误使用了行索引,应该取实际的Query名称- 未检查评分数量与Items数量的一致性(当前数据中Items数量与评分长度不匹配,属于数据结构问题,需先确认或修正)
修正后的代码
import pandas as pd import numpy as np from statsmodels.stats.inter_rater import fleiss_kappa data = {'Query' : ['Carpal Ts', 'Dermallxde'], # 注意:这里假设Items数量需与每个评分者的评分长度一致,补全到13个示例数据 'Items' : [f'Item_{i}' for i in range(13)], 'Raters' : [[[0,0,0,1,1,0,0,1,0,1,0,0,0],[0,1,0,1,0,0,0,1,1,1,0,0,1],[1,1,1,1,1,1,1,1,1,1,1,1,1]], [[1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,0,1,0,1,1,0,1,1,1,0],[1,1,1,1,1,1,1,1,1,1,1,1,1]]]} results_df = pd.DataFrame(data) kappas = [] for idx, row in results_df.iterrows(): raters_scores = row['Raters'] items = row['Items'] # 检查评分者数量≥2,且每个评分者的评分数量与Items数量一致 if len(raters_scores) >= 2 and all(len(scores) == len(items) for scores in raters_scores): # 转换为N行M列矩阵:N=Items数量,M=评分者数量 score_matrix = np.array(raters_scores).T # 生成类别计数矩阵:每行是[评0的次数, 评1的次数] count_matrix = np.array([[np.sum(row == 0), np.sum(row == 1)] for row in score_matrix]) # 计算Fleiss' Kappa kappa = fleiss_kappa(count_matrix) print(f"Query {row['Query']} 的Fleiss Kappa值: {kappa}") kappas.append({ 'Query': row['Query'], 'Items': items, 'Fleiss Kappa': kappa }) kappa_df = pd.DataFrame(kappas) print(kappa_df)
关键修正说明
- 转换为计数矩阵:将原始的0/1评分转换为每个项目的类别评分次数,匹配
fleiss_kappa的输入要求 - 完善数据校验:确保评分数量与Items数量一致,避免数据不匹配导致的错误
- 修正Query字段取值:改为获取实际的Query名称,而非行索引
内容的提问来源于stack exchange,提问作者cndze
相关产品推荐
相关产品推荐

