用混淆矩阵计算kappa系数「建议收藏」

用混淆矩阵计算kappa系数「建议收藏」从一篇论文——融合注意力机制和高效网络的糖尿病视网膜病变识别与分类,看到人家除了特异性、敏感性、准确率、混淆矩阵以外,还用了加权kappa系数,所以了解一下kapp系数的知识,加权kappa还没找到更好的资料。。。资料来源于百度百科词条——kappa系数Kappa系数用于一致性检验,也可以用于衡量分类精度,但kappa系数的计算是基于混淆矩阵的.kappa系数是一种衡量分类精度的指标。它是通过把所有地表真实分类中的像元总数(N)乘以混淆矩阵对角线(Xkk)的和,再减去某一类地表真实像元总数与该类中被

大家好,又见面了,我是你们的朋友全栈君。

从一篇论文——融合注意力机制和高效网络的糖尿病视网膜病变识别与分类,看到人家除了特异性、敏感性、准确率、混淆矩阵以外,还用了加权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://javaforall.net/153996.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • kfold交叉验证好处_sklearn交叉验证

    kfold交叉验证好处_sklearn交叉验证运用Kfold交叉验证时,在一个限度内k的值越大越好。因为k越大我们验证的次数就越多,最后取出来的平均数越能代表训练模型的准确度。但是k是需要在一个限度之内的。k太大有两个坏处。1.容易给机器造成过重负担,花费大量时间。2.每一次验证的测试集(或验证集)中数据太少,很难得到准确的误报率。总体而言,k一般取10,取值依不同项目情况而定,当然一定存在k&lt;n(训练集数据条数)。…

    2022年9月2日
    3
  • 某次心血来潮的破解案例

    某次心血来潮的破解案例背景前面遇到一个so解密的问题,学习了一波IDA。无聊之际,买了个游戏来耍耍,突发奇想,想着尝试一些花里胡哨的东西,于是有了以下内容。逻辑分析与实现寻找对应代码实现dl

    2021年12月13日
    64
  • 用C++实现简易的文本编辑器[通俗易懂]

    用C++实现简易的文本编辑器[通俗易懂]终于开始准备写自己的第一篇博客了,想想现在大二结束了,也要开始准备整理这么久学习的知识。学长们都对我说写博客是对自己知识整理最好的方法,所以我就静下心来把自己的课设写成自己的第一篇博客吧。废话就不多说了,接下来我来介绍一下我对实现这个简易的文本编辑器自己的理解。我自己的基本框架是.net,新建一个CLR项目,添加一个窗体。首先说一下要实现的基本功能,最基本的肯定是读写.txt文件,其次是复制、粘

    2022年6月9日
    32
  • 一线工程师告诉你嵌入式真实现状与发展前景「建议收藏」

    个人说明:本人并不是年薪百万的技术大牛,但总算是一名合格的嵌入式工程师,现在某企业担任嵌入式软件工程师开发一职,以下观点可能会带有片面或者分析不全,但却是一名一线企业嵌入式软件开发者真实感受和所得,希望能帮助那些有需要的人,我明白年轻人出来打拼都不容易。为何要写这片文章?小生也是过来人,踩过你们踩过的坑百度搜索“嵌入式”、“嵌入式开发”、“嵌入式发展前景”等字眼,出来的都是一大堆培训机构,…

    2022年4月4日
    69
  • Vue2 后台管理系统解决方案

    Vue2 后台管理系统解决方案

    2021年10月11日
    36
  • python之socket编程

    python之socket编程Socket是什么呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)基本上,Socket是任何一种计算机网络通讯中最基础的内容。例如当你在浏览器地址栏中输入http://…

    2022年7月13日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号