sklearn中分类模型评估指标(二):Kappa系数、混淆矩阵、分类指标报告、汉明损失

简介: 混淆矩阵confusion_matrix函数通过计算每一行对应于真实类别的混淆矩阵来评估分类准确率。根据定义,混淆矩阵中的条目[i,j]是实际上在类 i 中,但预测在类 j 中的数量。

混淆矩阵

confusion_matrix函数通过计算每一行对应于真实类别的混淆矩阵来评估分类准确率。

根据定义,混淆矩阵中的条目[i,j]是实际上在类 i 中,但预测在类 j 中的数量。

示例代码:

from sklearn.metrics import confusion_matrix
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
print(confusion_matrix(y_true, y_pred))
复制代码


运行结果:

[[2 0 0]
 [0 0 1]
 [1 0 2]]
复制代码


参数normalize允许报告结果是比率而不是计数。 混淆矩阵可以通过3种不同的方式进行归一化:'pred'、'true'和'all',它们分别将计数除以每列、每行或整个矩阵的总和。

示例代码:

y_true = [0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 1, 0, 1, 0, 1, 0, 1]
print(confusion_matrix(y_true, y_pred, normalize='all'))
复制代码


运行结果:

[[0.25  0.125]
 [0.25  0.375]]
复制代码


对于二分类问题,我们可以得到真阴性(tn)、假阳性(fp)、假阴性(fn)和真阳性(tp)的计数,如下所示:

tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
print(tn, fp, fn, tp) # 2 1 2 3
复制代码


Kappa系数

cohen_kappa_score函数计算 Cohen 的 kappa 统计量。 该措施旨在比较不同人类标注者的标签,而不是分类器的预测值与真实值。

其公式为:

κ=(po−pe)/(1−pe)\kappa = (p_o - p_e) / (1 - p_e)κ=(pope)/(1pe)

其中,pop_opo是分配给任何样本的标签的经验概率(观察到的一致性比率),pep_epe是两个标注者随机分配标签时的预期一致性。pep_epe 是使用类标签上的每个标注者的经验先验估计的。

上面关于pop_opopep_epe的解释有点晦涩难懂,请看下面:

pop_opo是每一类正确分类的样本数量之和除以总样本数,也就是总体分类精度。

我们假设每一类的真实样本个数分别为a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an,而预测出来的每一类的样本个数分别为b1,b2,...,bnb_1,b_2,...,b_nb1,b2,...,bn,总样本个数为nnn,则有:pe=a1×b1+a2×b2+...+an×bnn×np_e=\frac{a_1×b_1+a_2×b_2+...+a_n×b_n}{n×n}pe=n×na1×b1+a2×b2+...+an×bn

kappa 分数是一个介于 -1 和 1 之间的数字。通常,kappa是落在0与1之间,高于 0.8 的分数通常被认为是良好的一致性; 零或更低意味着不一致(实际上是随机标签)。


网络异常,图片无法展示
|


可以为二分类或多分类问题计算 Kappa 分数,但不能为多标签问题计算 Kappa 分数(除非通过手动计算每个标签的分数)并且不能为两个以上的标注者计算。

举例说明: 学生考试的作文成绩,由两个老师给出 好、中、差三档的打分,现在已知两位老师的打分结果,需要计算两位老师打分之间的相关性kappa系数:


网络异常,图片无法展示
|


从上面的公式中,我们可以知道,其实只需要计算pop_opopep_epe即可:

po=(10+35+15)/87=0.689p_o = (10+35+15) / 87 = 0.689po=(10+35+15)/87=0.689

a1=10+2+8=20;a2=5+35+5=45;a3=5+2+15=22;a1 = 10+2+8 = 20; a2 = 5+35+5 = 45; a3 = 5+2+15 = 22;a1=10+2+8=20;a2=5+35+5=45;a3=5+2+15=22;

b1=10+5+5=20;b2=2+35+2=39;b3=8+5+15=28;b1 = 10+5+5 = 20; b2 = 2+35+2 = 39; b3 = 8+5+15 = 28;b1=10+5+5=20;b2=2+35+2=39;b3=8+5+15=28;

pe=a1∗b1+a2∗b2+a3∗b387∗87=0.455p_e = \frac{a1*b1 + a2*b2 + a3*b3}{87*87} = 0.455pe=8787a1b1+a2b2+a3b3=0.455

κ=po−pe1−pe\kappa = \frac{p_o-p_e}{1-p_e}κ=1pepope = 0.4293578

示例代码:

from sklearn.metrics import cohen_kappa_score
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
print(confusion_matrix(y_true, y_pred))
print("-----------")
print(cohen_kappa_score(y_true, y_pred))
复制代码



运行结果:

[[2 0 0]
 [0 0 1]
 [1 0 2]]
-----------
0.4285714285714286
复制代码


计算过程如下:

po=4/6=2/3
a1=2; a2=1; a3=3
b1=3; b2=0; b3=3
pe=(2*3+1*0+3*3)/(6*6)=15/36=5/12
kappa=(2/3-5/12)/(1-5/12)=3/7=0.4285
复制代码


分类指标报告

classification_report函数构建一个显示主要分类指标的文本报告。

主要参数说明:

  • target_names:显示与标签匹配的名称(相同顺序),可选参数
  • labels:选择要包含在报告中的标签索引列表,可选参数

这是一个带有自定义target_names和推理labels的例子:

from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 0]
y_pred = [0, 0, 2, 1, 0]
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(y_true, y_pred, target_names=target_names))
复制代码


运行结果:

precision    recall  f1-score   support
     class 0       0.67      1.00      0.80         2
     class 1       0.00      0.00      0.00         1
     class 2       1.00      0.50      0.67         2
    accuracy                           0.60         5
   macro avg       0.56      0.50      0.49         5
weighted avg       0.67      0.60      0.59         5
复制代码


下面是一个自定义labels的例子:

print(classification_report(y_true, y_pred, labels=[1, 2]))
复制代码


运行结果:

precision    recall  f1-score   support
           1       0.00      0.00      0.00         1
           2       1.00      0.50      0.67         2
   micro avg       0.50      0.33      0.40         3
   macro avg       0.50      0.25      0.33         3
weighted avg       0.67      0.33      0.44         3
复制代码


汉明损失

hamming_loss计算两组样本之间的平均汉明损失或汉明距离,取值在0~1之间,距离为0说明预测结果与真实结果完全相同,距离为1就说明模型与我们想要的结果完全就是背道而驰。

如果 y^j\hat{y}_jy^j 是给定样本的第 j 个标签的预测值,yjy_jyj为对应的真值,nlabelsn_\text{labels}nlabels为类别或标签的个数,那么真实值与预测值这两个样本之间的汉明损失LHammingL_{Hamming}LHamming定义为:

LHamming(y,y^)=1nlabels∑j=0nlabels−11(y^j≠yj)L_{Hamming}(y, \hat{y}) = \frac{1}{n_\text{labels}} \sum_{j=0}^{n_\text{labels} - 1} 1(\hat{y}_j \not= y_j)LHamming(y,y^)=nlabels1j=0nlabels11(y^j=yj)

其中,1(x)1(x)1(x)是指标函数。

示例代码:

from sklearn.metrics import hamming_loss
y_pred = [1, 2, 3, 4]
y_true = [2, 2, 3, 4]
print(hamming_loss(y_true, y_pred)) # (1/4)*(1+0+0+0)
# 在具有二标签指示器的多分类场景
print(hamming_loss(np.array([[0, 1], 
                             [1, 1]]), 
                   np.zeros((2, 2)))
     ) # (1/2)*(1/2)*((1+0)+(1+1))
复制代码


运行结果:

0.25
0.75
复制代码


注意:

在多分类中,汉明损失对应于 y_true 和 y_pred 之间的汉明距离,类似于零一损失函数。 然而,虽然零一损失惩罚不严格匹配真实集的预测集,但汉明损失惩罚单个标签。 因此,以零一损失为上限的汉明损失始终介于0和1之间,包括两者; 并且预测真实标签的适当子集或超集将给出介于 0 和 1 之间的汉明损失,不包括0和1。

总结

函数 说明
cohen_kappa_score 适用于二分类、多分类场景,一种检验一致性的方法
confusion_matrix 适用于二分类、多分类场景,通过计算每一行对应于真实类别的混淆矩阵来评估分类准确率
classification_report 适用于二分类、多分类、多标签场景,显示主要分类指标的文本报告
hamming_loss 适用于二分类、多分类、多标签场景,计算两组样本之间的汉明距离


相关文章
|
前端开发 JavaScript Java
从前端到后端:探索Web开发的技术演进
本文将介绍Web开发领域中前端和后端技术的演进过程。我们将从最初的静态网页开始,逐步探索动态网页、前后端分离、服务器端渲染等技术,以及流行的编程语言如Java、Python和C的应用。通过了解这些技术的发展,读者可以更好地理解Web开发的现状以及未来的趋势。
conda常用操作和配置镜像源
conda常用操作和配置镜像源
31988 0
CCF推荐A类会议和期刊总结:计算机体系结构/并行与分布计算/存储系统领域
中国计算机学会(CCF)2022年版推荐目录涵盖了计算机体系结构、并行与分布计算、存储系统领域的多个A类会议和期刊。本文汇总了这些顶级资源的全称、出版社、dblp网址及领域。包括《ACM计算机系统汇刊》、《ACM存储汇刊》等期刊,以及ACM PPoPP、USENIX FAST等会议,为研究人员提供了重要学术参考。
13883 64
CCF推荐A类会议和期刊总结:计算机体系结构/并行与分布计算/存储系统领域
|
机器学习/深度学习 算法
【机器学习】过拟合和欠拟合怎么判断,如何解决?(面试回答)
本文介绍了如何通过观察训练误差和验证误差来判断模型是否出现过拟合或欠拟合,并提供了相应的解决方案,包括增加数据、调整模型复杂度、使用正则化技术等。
1707 1
|
7月前
|
Prometheus 监控 Cloud Native
Spring Boot 可视化监控
本文介绍了如何通过Spring Actuator、Micrometer、Prometheus和Grafana为Spring Boot应用程序添加监控功能。首先创建了一个Spring Boot应用,并配置了Spring Actuator以暴露健康状态和指标接口。接着,利用Micrometer收集应用性能数据,并通过Prometheus抓取这些数据进行存储。最后,使用Grafana将Prometheus中的数据可视化,展示在精美的仪表板上。整个过程简单易行,为Spring Boot应用提供了基本的监控能力,同时也为后续扩展更详细的监控指标奠定了基础。
1273 2
|
12月前
|
机器学习/深度学习 安全 算法
十大主流联邦学习框架:技术特性、架构分析与对比研究
联邦学习(FL)是保障数据隐私的分布式模型训练关键技术。业界开发了多种开源和商业框架,如TensorFlow Federated、PySyft、NVFlare、FATE、Flower等,支持模型训练、数据安全、通信协议等功能。这些框架在灵活性、易用性、安全性和扩展性方面各有特色,适用于不同应用场景。选择合适的框架需综合考虑开源与商业、数据分区支持、安全性、易用性和技术生态集成等因素。联邦学习已在医疗、金融等领域广泛应用,选择适配具体需求的框架对实现最优模型性能至关重要。
2196 79
十大主流联邦学习框架:技术特性、架构分析与对比研究
|
数据采集 数据可视化 算法
【优秀python案例】基于Python的豆瓣电影TOP250爬虫与可视化设计与实现
本文设计并实现了一个基于Python的豆瓣电影TOP250爬虫与可视化系统,通过获取电影评分、评论并应用词云和饼图等可视化技术,为用户提供了电影评价的直观展示和深入分析。
2802 3
【优秀python案例】基于Python的豆瓣电影TOP250爬虫与可视化设计与实现
|
人工智能 API
通过API调用通义千问时出现DataInspectionFailed的解决办法(玄学版)
在使用qwen-plus API进行长文本翻译时,遇到了DataInspectionFailed错误,提示输入数据可能包含不当内容。尽管确认文本无敏感内容,但误判依然发生。通过将每个分段的字符数从1000降低到700,问题得以解决。建议在处理长文本时,减少每次请求的字符数以避免误判。
4361 6
|
机器学习/深度学习 监控 PyTorch
机器学习 - 混淆矩阵:技术与实战全方位解析
机器学习 - 混淆矩阵:技术与实战全方位解析
1274 0

热门文章

最新文章