用混淆矩阵计算kappa系数
从一篇论文——融合注意力机制和高效网络的糖尿病视网膜病变识别与分类,看到人家除了特异性、敏感性、准确率、混淆矩阵以外,还用了加权kappa系数,所以了解一下kapp系数的知识,加权kappa还没找到更好的资料。。。
资料来源于百度百科词条——kappa系数
Kappa系数用于一致性检验,也可以用于衡量分类精度,但kappa系数的计算是基于混淆矩阵的.
kappa系数是一种衡量分类精度的指标。它是通过把所有地表真实分类中的像元总数(N)乘以混淆矩阵对角线(Xkk)的和,再减去某一类地表真实像元总数与该类中被分类像元总数之积对所有类别求和的结果,再除以总像元数的平方减去某一类地表真实像元总数与该类中被分类像元总数之积对所有类别求和的结果所得到的
计算公式
示例(这里的混淆矩阵用百度词条里的,但是好像我常用的是实际是下标,预测类别是上标,注意一下)
为了计算方便看懂,我重画了一下
结果分析
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)。
matlab代码
下面是我写的matlab代码仅供参考
confusion_matrix=[239 21 16;
16 73 4;
6 9 280];
[row col]=size(confusion_matrix);%获取矩阵的行和列
fenleizhengque_yangben=diag(confusion_matrix);%分类正确的样本就是对角线上的值,这是一个列向量
yangbenzongshu=sum(confusion_matrix(:));
p0=sum(fenleizhengque_yangben)/yangbenzongshu;
% 假设每一类的真实样本个数分别为a1,a2,...,aC,而预测出来的每一类的样本个数分别为b1,b2,...,bC
%在百度词条里的图中,真实样本数就是按列求值,预测出来的样本就是按行求值
%这里按照kappa系数百度词条里的图来计算,但是我一般用的混淆矩阵图是反过来的。。。这里不管了。。。就用百度词条里的来算
a=sum(confusion_matrix,1);%第2个参数为1是按列求值,把同一列的数加起来,这是行向量
b=sum(confusion_matrix,2);%第2个参数为2是按行求值,把同一行的数加起来,这是列向量
% 我常用的混淆矩阵是这样计算的,虽然结果没有改变。。。
% a=sum(confusion_matrix,2);%第2个参数为2是按行求值,把同一行的数加起来,这是列向量
% b=sum(confusion_matrix,1);%第2个参数为1是按列求值,把同一列的数加起来,这是行向量
pe=(a*b)/(yangbenzongshu*yangbenzongshu); %行向量乘以列向量是一个数
kappaxishu=(p0-pe)/(1-pe);
python 代码好像蛮多的,这边顺便mark一下,没有试过,仅供参考
代码来自 https://blog.csdn.net/qq_34107425/article/details/103692561?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control
def eval_qwk_lgb_regr(y_true, y_pred):
# Fast cappa eval function for lgb.
dist = Counter(reduce_train['accuracy_group'])
for k in dist:
dist[k] /= len(reduce_train)
reduce_train['accuracy_group'].hist()
# reduce_train['accuracy_group']将会分成四组
acum = 0
bound = {}
for i in range(3):
acum += dist[i]
bound[i] = np.percentile(y_pred, acum * 100)
def classify(x):
if x <= bound[0]:
return 0
elif x <= bound[1]:
return 1
elif x <= bound[2]:
return 2
else:
return 3
y_pred = np.array(list(map(classify, y_pred))).reshape(y_true.shape)
return 'cappa', cohen_kappa_score(y_true, y_pred, weights='quadratic'), True
关于加权kappa系数,其实我具体的还是没怎么搞明白,
不过我找到了一篇说的很好的博客:https://blog.csdn.net/gltangwq/article/details/106357443
感觉加权kappa就是赋予权重,博客中说的很好,如果一个病人没用病,但是一个医生A预测他得了重病,一个医生B预测他得了轻病,那么普通的kappa来说,他们都错了,错的程度一样,这显然不符合常识,而加权kappa可以说明A预测的错误更大,这样更符合常识,博客中也说了对于一些有序关系的级别得分,可见加权kappa适用于有序的关系,并不是说加权kappa和普通kappa就一定有哪个比较好。
本文地址:https://blog.csdn.net/qigeyonghuming_1/article/details/111919903