我发现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
用来计算kappa
andweighted_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_kappa
fromR
远低于weighted_kappa
in sklearn
from Python
。哪个是错的?经过2天的研究,我发现weighted_kappa
from irr
package 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.csv
andlabel_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_kappa
from irr
inR
完全没有变化。但是weighted_kappa
从sklearn
inPython
减少到0.83
to 0.59
。所以我们知道irr
又犯了一个错误。
原因是sklearn
可以让我们将 传递full labels
给混淆矩阵,使混淆矩阵的形状为 100 * 100,但是在 中irr
,混淆矩阵的标签是根据 和 的唯一值计算的label
,pred
这会错过很多其他的可能的值。53
这个错误会给和这里分配相同的权重99
。所以最好在irr
package 中提供一个选项,让客户提供他们在fromlabels
中所做的那样的客户。sklearn
Python