You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算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的核心原因。

另外原代码还存在两个小问题:

  1. Query字段错误使用了行索引,应该取实际的Query名称
  2. 未检查评分数量与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)

关键修正说明

  1. 转换为计数矩阵:将原始的0/1评分转换为每个项目的类别评分次数,匹配fleiss_kappa的输入要求
  2. 完善数据校验:确保评分数量与Items数量一致,避免数据不匹配导致的错误
  3. 修正Query字段取值:改为获取实际的Query名称,而非行索引

内容的提问来源于stack exchange,提问作者cndze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:02:07