我发现irr包有 2 个用于计算weighted kappa.
请告诉我这两个错误是否真的存在,或者我误解了一些东西。
您可以使用以下示例复制错误。
第一个错误:需要更正混淆矩阵中的标签类型。
我有 2 对疾病程度分数(从 0 到 100,0 表示健康,100 表示极度不适)。
在label_test.csv(您可以将数据复制并粘贴到磁盘中以进行以下测试):
0
1
1
1
0
14
53
3
在pred_test.csv:
0
1
1
0
3
4
54
6
在script_r.R:
library(irr)
label <- read.csv('label_test.csv',header=FALSE)
pred <- read.csv('pred_test.csv',header=FALSE)
kapp <- kappa2(data.frame(label,pred),"unweighted")
kappa <- getElement(kapp,"value")
print(kappa) # output: 0.245283
w_kapp <- kappa2(data.frame(label,pred),"equal")
weighted_kappa <- getElement(w_kapp,"value")
print(weighted_kappa) # output: 0.443038
当我Python用来计算kappaandweighted_kappa时,在script_python.py:
from sklearn.metrics import cohen_kappa_score
label = pd.read_csv(label_file, header=None).to_numpy()
pred = pd.read_csv(pred_file, header=None).to_numpy()
kappa = cohen_kappa_score(label.astype(int), pred.astype(int))
print(kappa) # output: 0.24528301886792447
weighted_kappa = cohen_kappa_score(label.astype(int), pred.astype(int), weights='linear', labels=np.array(list(range(100))) )
print(weighted_kappa) # output: 0.8359908883826879
我们可以发现,kappa计算的 byR和Python是相同的,但是weighted_kappafromR远低于weighted_kappain sklearnfrom Python。哪个是错的?经过2天的研究,我发现weighted_kappafrom irrpackage inR是错误的。详情如下。
在调试过程中,我们会发现from中的混淆矩阵irr为R:
我们可以发现顺序是错误的。在 Python 中,标签的顺序应该从 更改[0, 1, 14, 3, 4, 53, 54, 6]为。[0, 1, 3, 4, 6, 14, 53, 54]似乎该irr包使用了基于字符串的排序方法而不是基于整数的排序方法,它将14放在3. 这个错误可以而且应该很容易地纠正。
第二个错误:R 中的混淆矩阵不完整
在我的pred_test.csvandlabel_test.csv中,这些值不能涵盖从 0 到 100 的所有可能值。因此 from 中的默认混淆矩阵irr会R错过那些未出现在数据中的值。这应该是固定的。
让我们看另一个例子。
在pred_test.csv中,让我们将标签从 更改54为99。然后,我们一次script_r.R又一次地跑script_python.py。结果是:
In R:
kappa: 0.245283
weighted_kappa: 0.443038
In Python:
kappa: 0.24528301886792447
weighted_kappa: 0.592891760904685
我们可以发现weighted_kappafrom irrinR完全没有变化。但是weighted_kappa从sklearninPython减少到0.83to 0.59。所以我们知道irr又犯了一个错误。
原因是sklearn可以让我们将 传递full labels给混淆矩阵,使混淆矩阵的形状为 100 * 100,但是在 中irr,混淆矩阵的标签是根据 和 的唯一值计算的label,pred这会错过很多其他的可能的值。53这个错误会给和这里分配相同的权重99。所以最好在irrpackage 中提供一个选项,让客户提供他们在fromlabels中所做的那样的客户。sklearnPython
